# status-banner — SessionStart aggregation, silence rules, snooze/suppress state

## ADDED Requirements

### Requirement: Single aggregated banner
The os-status SessionStart hook SHALL run all registered checks in-process and emit at most
one warning banner per session, containing one short line per `warn` result with its
corrective action. `note` results SHALL be emitted as individual near-zero-token lines outside
the banner. When every check returns `ok` (and no `note`s exist), the hook SHALL emit nothing.

#### Scenario: All checks ok
- **WHEN** every registered check returns `ok`
- **THEN** the hook produces no output

#### Scenario: Multiple warns aggregate
- **WHEN** two or more checks return `warn`
- **THEN** exactly one banner is emitted containing one line per warning

#### Scenario: Note passes through without banner
- **WHEN** one check returns `note` and all others return `ok`
- **THEN** the note line is emitted and no warning banner appears

### Requirement: Per-project snooze and suppress for warns
`warn` output SHALL be governed by per-project state in a gitignored `.cc-os/` directory:
each warning is emitted at most once per day (snooze), and a permanent suppress marker
silences a given check's warnings in that project until removed. `note` results SHALL NOT be
subject to snooze or suppress. Outside a git project, project-scoped checks SHALL be skipped
and no state SHALL be written.

#### Scenario: Warn snoozed same day
- **WHEN** a check's warning was already emitted today in this project
- **THEN** the warning is not emitted again and the banner omits it

#### Scenario: Permanent suppress
- **WHEN** `.cc-os/` contains a suppress marker for a check
- **THEN** that check's warnings are never emitted in this project while the marker exists

#### Scenario: Not a git project
- **WHEN** the session starts outside a git project
- **THEN** project-scoped checks are skipped, environment-scoped checks still run, and no
  `.cc-os/` directory is created

### Requirement: Hook safety envelope
The SessionStart hook SHALL complete within its configured timeout, SHALL exit 0 even when
checks warn or fail internally, and SHALL never write to any file outside the project's
`.cc-os/` state directory.

#### Scenario: Internal failure stays safe
- **WHEN** the checks module itself fails to import or crash-loops
- **THEN** the hook exits 0 with either no output or a single generic warning line, and the
  session starts normally
