# Tasks: add-os-status-plugin

## 1. Plugin scaffold

- [x] 1.1 Create `plugins/os-status/` with `.claude-plugin/plugin.json` (name `os-status`, per
      naming convention; no `name:` in any SKILL.md — no skills in this change anyway)
- [x] 1.2 Add `hooks/hooks.json` registering SessionStart → `session_start.py` via
      `${CLAUDE_PLUGIN_ROOT}` (5s timeout, matching os-adr's pattern)
- [x] 1.3 Write shared modules in Sandi-Metz-lean Python matching os-vault's style:
      `hooks/checks.py` (CheckResult, registry, the three checks), `hooks/state.py`
      (`.cc-os/` snooze/suppress, git-project detection), thin `hooks/session_start.py`
      entry point (run checks, aggregate, print)

## 2. Checks

- [x] 2.1 `subagent_model_env_override`: env var + `~/.claude/settings.json` `env` block scan;
      runs outside git projects too
- [x] 2.2 `adr_system_present`: port logic from `plugins/os-adr/hooks/session_start.py` —
      PRESENT_NOTE wording byte-identical (copy, don't paraphrase); absent-path once-per-day
      snooze honoring existing `.os-adr/suppress`
- [x] 2.3 `vault_hub_note_present`: config-first hub lookup (`.cc-os/config` hub slug), else
      `project/<name>` facet-tag scan of the vault; missing → warn naming the corrective skill

## 3. Tests + invariants

- [x] 3.1 `tests/hook_test.py`-style model-free Python tests: contract (ok/note/warn routing,
      failure isolation, exit-0 envelope), each check against fixture dirs/fake settings.json,
      snooze/suppress state transitions, non-git-cwd behavior
- [x] 3.2 `invariants.md`: single-banner, note-not-suppressed, exit-0-always,
      state-only-in-.cc-os, PRESENT_NOTE byte-identical to os-adr's tuned wording

## 4. os-adr cutover (atomic)

- [x] 4.1 Remove the SessionStart entry from `plugins/os-adr/hooks/hooks.json` (keep the
      script file until archive; it is the wording source of record for 2.2)
- [x] 4.2 Confirm os-adr's tests still pass (hook_test.py may need pruning of
      SessionStart-registration assertions)

## 5. Install + verify

- [x] 5.1 Add `os-status` to `~/.claude/plugins/.claude-plugin/marketplace.json`;
      `claude plugin marketplace update local-plugins`; `claude plugin install
      os-status@local-plugins`
- [x] 5.2 `bin/refresh-plugins`; `claude plugin details os-status@local-plugins` (hook
      registered) and `claude plugin details os-adr@local-plugins` (SessionStart gone from
      resolved cache)
- [x] 5.3 Fresh-session smoke test in cc-os (expect: ADR note once, hub-note ok once hub
      exists, no env warn) and in a project without `docs/adr/` (expect: one banner)
- [x] 5.4 Regression canary: export `CLAUDE_CODE_SUBAGENT_MODEL=haiku` in a test shell,
      fresh session, expect the override warn

## 6. Documentation

- [x] 6.1 ADR in `docs/memory-system/03-architecture-decisions.md`: status-check convention,
      in-process code-location decision (Options A/B rejected with the perspective-review
      reasoning), deferred items (context field, state-dir consolidation, Phase 2)
- [x] 6.2 Update cc-os `CLAUDE.md`: Implemented Components entry for os-status; note os-adr's
      SessionStart behavior moved
- [x] 6.3 Mark WS3 plan doc (`docs/plans/ws3-status-convention-plugin.md`) as superseded by
      this change (pointer, status line)
