cc-os/plugins/os-doc-hygiene/openspec/changes/archive/2026-07-15-calibrate-assess.../proposal.md

3.8 KiB
Raw Blame History

Proposal: calibrate-assessment-inventory

Why

Wayfinder map #49 locked the design (in lifecycle-spec.md, committed 2026-07-15) for persisting the full :calibrate assessment inventory — today only confirmed rules survive a calibration pass, so keep verdicts, human declines, and open consults evaporate and get re-litigated every pass. The design also fixed two judge-quality defects observed in calibration pass #1 (widening to container globs; no memory of prior rejections). This change implements that locked design; every decision is already made — see tickets #51#57, #59 on the map.

What Changes

  • Nominations memory: the project rules file (.dochygiene-rules.json) gains a top-level nominations key with consults and rejected sub-keys (additive to schema_version 1). rulebook.py stays nomination-unaware.
  • NominationIntakeFilter (new class in calibrate_helpers.py): deterministic Step 3.5 of the calibrate pipeline — drops exact glob+lifetime repeats of recorded rejections, annotates related (match-set-intersecting) history for the judge.
  • Canonical-writer extension (calibrate_helpers.py): all rules-file writes go through one writer enforcing canonical ordering (rules grouped delete-once-served / temporary / keep, glob-sorted; nominations after rules, consults before rejected; unknown fields warned, round-tripped). No hook enforcement.
  • Pipeline wiring: Step 3.5 (intake filter) before the judge; Step 5 report gains an "Open consults" section; Step 6 persistence extended — keep verdicts persist as plain keep rules (incl. exact-path singletons, per the keep-tier relaxation), human declines persist as rejected entries, consult verdicts dedupe into consults.
  • Extract-op append: :clean's extract-then-delete op appends a pointer entry to the per-directory extracted.md index, atomically within the single hygiene commit (the global **/extracted.md → keep rule is already in rulebook.json).
  • Two unit-test suites (no new eval harnesses, per ticket #59): intake filter (exact-repeat drops, relatedness annotations incl. the two #52 worked cases) and writer (round-trip ordering, unknown-field warnings).

Capabilities

New Capabilities

(none — every change extends an existing capability)

Modified Capabilities

  • lifecycle-rulebook: envelope gains the optional project-file-only nominations key (consults/rejected schemas); writes are writer-enforced into canonical ordering; loader remains nomination-unaware and add-only merge is unchanged.
  • calibrate: new deterministic intake-filter requirement (Step 3.5); Persistence Rules by Scope extended to keep verdicts / rejections / consults; judge intake gains nominations-memory context (rejections are variants-not-vetoes, open consults must resurface); Rule-Quality Class-Never-Path gains the keep-tier relaxation and the enumerate-siblings-never-widen-to-container test.
  • doc-clean: the extract-then-delete op additionally appends the extracted.md pointer entry in the same per-file transaction / single hygiene commit.

Impact

  • Code: scripts/calibrate_helpers.py (NominationIntakeFilter + canonical writer), skills/calibrate/SKILL.md + workflows/*.md (Step 3.5/5/6 wiring — judge.md context sections already landed with the design commit), scripts/patch_applier.py (extract-op append).
  • Tests: tests/test_calibrate_helpers.py extended (or split) for the two suites; existing 407-test suite must stay green.
  • Data: .dochygiene-rules.json files may now carry nominations; older readers unaffected (additive, rulebook.py ignores it).
  • Source of truth: plugins/os-doc-hygiene/lifecycle-spec.md §1 (extract index), §2 (nominations memory, canonical ordering), §8 (steps 3/6, test coverage); ADR-0038/0039 amendments 2026-07-15.
  • Post-implementation: run bin/refresh-plugins.