cc-os/openspec/changes/add-os-status-plugin/specs/status-checks/spec.md

4.1 KiB

status-checks — in-process check contract + initial checks

ADDED Requirements

Requirement: Uniform in-process check contract

Every status check SHALL be a Python function in the os-status plugin with the signature check(ctx) -> CheckResult, where ctx provides the project root (or None outside a git project) and per-project config, and CheckResult carries status (ok | note | warn) and message (empty for ok). Checks SHALL be registered in a single registry list; adding a check SHALL require only the function and one registry entry.

Scenario: Check returns ok

  • WHEN a registered check finds its precondition satisfied and has no informational output
  • THEN it returns status: ok and contributes no output to the session

Scenario: Check failure is isolated

  • WHEN a registered check raises an exception or exceeds the per-check time budget
  • THEN the runner records it as warn with a generic message naming the check, continues running the remaining checks, and never blocks or fails the session

Requirement: ADR system check preserves os-adr behavior

The adr_system_present check SHALL reproduce os-adr's SessionStart behavior: in a git project with docs/adr/ present it returns note with the existing Eval-B-tuned usage-note wording verbatim; with docs/adr/ absent it returns warn suggesting init/migrate at most once per day, permanently silenced by .os-adr/suppress; outside a git project it returns ok.

Scenario: ADR system present

  • WHEN the session starts in a git project containing docs/adr/
  • THEN the check returns note whose message is byte-identical to os-adr's current PRESENT_NOTE wording

Scenario: ADR system absent, not suppressed

  • WHEN the session starts in a git project without docs/adr/ and no .os-adr/suppress exists and no suggestion was emitted today
  • THEN the check returns warn naming /os-adr:init and /os-adr:migrate

Scenario: ADR suggestion suppressed

  • WHEN .os-adr/suppress exists in the project
  • THEN the check returns ok

Requirement: Vault hub-note check

The vault_hub_note_present check SHALL determine whether the current project has a hub note in the SecondBrain vault, preferring an explicit hub slug from per-project config over inference by project/<name> facet tag. Missing hub note in a git project SHALL yield warn naming the corrective action; present SHALL yield ok with no context injection.

Scenario: Hub note missing

  • WHEN the session starts in a git project with no matching hub note in the vault
  • THEN the check returns warn telling the user which skill to run to create one

Scenario: Hub note present

  • WHEN a hub note matching the project exists in the vault
  • THEN the check returns ok and injects nothing

Requirement: Subagent model env-override check

The subagent_model_env_override check SHALL return warn when CLAUDE_CODE_SUBAGENT_MODEL is set in the process environment or present in the env block of ~/.claude/settings.json, identifying where it was found; otherwise ok. This check SHALL run regardless of whether the cwd is a git project.

Scenario: Override set in settings.json

  • WHEN ~/.claude/settings.json contains CLAUDE_CODE_SUBAGENT_MODEL in its env block
  • THEN the check returns warn naming the variable, its value, and the file it was found in

Scenario: No override

  • WHEN the variable is absent from both the environment and settings.json
  • THEN the check returns ok

Requirement: os-adr SessionStart hook removed atomically

In the same change that ships the adr_system_present check, os-adr's own SessionStart hook entry SHALL be removed from plugins/os-adr/hooks/hooks.json, and the cutover SHALL be verified against the refreshed plugin cache (not only source), such that exactly one component emits the ADR status per session.

Scenario: No double emission after cutover

  • WHEN a fresh session starts after bin/refresh-plugins with os-status and os-adr both installed
  • THEN the ADR usage note or suggestion appears exactly once