# 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/` 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)