Assemble the spec + ADR set #46

Closed
opened 2026-07-14 16:52:06 +00:00 by jared · 3 comments
Owner

Map: #31
Blocked by #40, #42, #43, #44, #45, #47, #48

Question

Consolidate all resolved decisions into the os-doc-hygiene lifecycle spec plus ADR(s) recorded via /os-adr:create — the map's destination artifact.

Requirements handed to this ticket by #45 (see its Addendum 2 — authoritative)

  1. Rule report before persistence. :calibrate presents each proposed rule as: the glob verbatim, the paths it matches, the near-miss paths it does NOT match (the boundary), lifetime + behavior tier, and a plain-language why. The human reviews patterns and examples, not JSON schema. (The boundary requirement caught a real under-matching bug during #45 itself — autoresearch/classic-*/ silently missing autoresearch/improve-260710-1057/.)

  2. Over-specificity test — the rule is the CLASS, not the PATH. A glob may hardcode a name that recurs by convention (PRD.md, HANDOFF-*.md); it may NOT hardcode an identifier unique to one instance (a run-id, hash, or bare timestamp). A rule matching one file today is fine; a rule that can only EVER match one file is a failed generalization.

  3. Glob-breadth tie-breaker: prefer the NARROWER glob. Too-narrow fails safe (leaves clutter; the recurring pass catches it next round). Too-broad fails dangerous (deletes a keeper; not self-healing). Readability beats cleverness when the cost is one missed round.

  4. Seed hold-out scope — MUST be stated in the spec. #45 withholds the home-repo (cc-os) seeds from judge intake, contradicting #42 ("#41 seeds enter at judge intake"). This is a one-off for calibration pass #1 only — needed so the pass is a test rather than an open-book exam. The spec must record whether the shipped protocol keeps full seed intake (current answer: yes, full intake for every run after pass #1) so a future reader does not mistake the carve-out for a permanent property.

  5. Must assemble WITHOUT propagate_ignore (dropped in #44).

Map: #31 Blocked by #40, #42, #43, #44, #45, #47, #48 ## Question Consolidate all resolved decisions into the os-doc-hygiene lifecycle spec plus ADR(s) recorded via /os-adr:create — the map's destination artifact. ### Requirements handed to this ticket by #45 (see its Addendum 2 — authoritative) 1. **Rule report before persistence.** `:calibrate` presents each proposed rule as: the **glob verbatim**, the paths it matches, the **near-miss paths it does NOT match** (the boundary), lifetime + behavior tier, and a plain-language why. The human reviews patterns and examples, not JSON schema. (The boundary requirement caught a real under-matching bug during #45 itself — `autoresearch/classic-*/` silently missing `autoresearch/improve-260710-1057/`.) 2. **Over-specificity test — the rule is the CLASS, not the PATH.** A glob may hardcode a name that *recurs by convention* (`PRD.md`, `HANDOFF-*.md`); it may NOT hardcode an identifier *unique to one instance* (a run-id, hash, or bare timestamp). A rule matching one file today is fine; a rule that can only EVER match one file is a failed generalization. 3. **Glob-breadth tie-breaker: prefer the NARROWER glob.** Too-narrow fails safe (leaves clutter; the recurring pass catches it next round). Too-broad fails dangerous (deletes a keeper; not self-healing). Readability beats cleverness when the cost is one missed round. 4. **Seed hold-out scope — MUST be stated in the spec.** #45 withholds the home-repo (cc-os) seeds from judge intake, contradicting #42 ("#41 seeds enter at judge intake"). This is a **one-off for calibration pass #1 only** — needed so the pass is a test rather than an open-book exam. The spec must record whether the shipped protocol keeps full seed intake (current answer: **yes**, full intake for every run after pass #1) so a future reader does not mistake the carve-out for a permanent property. 5. Must assemble WITHOUT `propagate_ignore` (dropped in #44).
jared added the
wayfinder:task
label 2026-07-14 16:52:06 +00:00
Author
Owner

Heads-up from the rulebook-schema resolution (#40): the per-project override lives at a committed repo-root dotfile (.dochygiene-rules.json) rather than under gitignored .cc-os/ — user flagged this convention deviation as requiring its own ADR. Include it in the ADR set assembled here.

Heads-up from the rulebook-schema resolution (#40): the per-project override lives at a committed repo-root dotfile (.dochygiene-rules.json) rather than under gitignored .cc-os/ — user flagged this convention deviation as requiring its own ADR. Include it in the ADR set assembled here.
Author
Owner

ADR INPUTS from #43 (Decide deletion confirm-gates and temporary-tier durations) — three additions to this ticket's ADR set, alongside the already-flagged repo-root-dotfile-vs-.cc-os/ ADR from #40:
(a) The auto/confirm line is drawn on RECOVERABILITY + EVIDENCE QUALITY, not on file type. Matrix: IGNORE (never walked: graphify-out/, .dochygiene/); lifetime keep (walked, never deleted); tracked+clean+rule -> auto; tracked+DIRTY+rule -> confirm (an uncommitted diff is not in git history); untracked+rule -> confirm (per #35); no rule -> unmanaged, never deleted. Separately: a classifier-judged served_when is always forced to confirm even when tracked, while a scanner-proven served_when_path may go auto.
(b) retain_recent: 3 + max_age_days: 3 as the cc-os default temporary-tier retention (newest 3 entries always kept for trajectory; 4th-or-older deleted past 3 days). Age measured from git commit time, mtime fallback for untracked — mtime alone was rejected because clone/checkout resets it and silently puts the rulebook to sleep.
(c) The determinism-promotion principle: hygiene actively recommends structural conventions (archive buckets, status frontmatter) that convert subjective served signals into deterministic ones.
Note also the additive amendments to #40's locked schema: retain_recent, served_when_path, confirm (human-only), max_age_days default 3, and the IGNORE posture. /os-adr:find confirms no existing ADR governs clean's safety tiers (only ADR-0032 touches this plugin), so none of this supersedes anything.

ADR INPUTS from #43 (Decide deletion confirm-gates and temporary-tier durations) — three additions to this ticket's ADR set, alongside the already-flagged repo-root-dotfile-vs-.cc-os/ ADR from #40: (a) The auto/confirm line is drawn on RECOVERABILITY + EVIDENCE QUALITY, not on file type. Matrix: IGNORE (never walked: graphify-out/**, .dochygiene/**); lifetime keep (walked, never deleted); tracked+clean+rule -> auto; tracked+DIRTY+rule -> confirm (an uncommitted diff is not in git history); untracked+rule -> confirm (per #35); no rule -> unmanaged, never deleted. Separately: a classifier-judged served_when is always forced to confirm even when tracked, while a scanner-proven served_when_path may go auto. (b) retain_recent: 3 + max_age_days: 3 as the cc-os default temporary-tier retention (newest 3 entries always kept for trajectory; 4th-or-older deleted past 3 days). Age measured from git commit time, mtime fallback for untracked — mtime alone was rejected because clone/checkout resets it and silently puts the rulebook to sleep. (c) The determinism-promotion principle: hygiene actively recommends structural conventions (archive buckets, status frontmatter) that convert subjective served signals into deterministic ones. Note also the additive amendments to #40's locked schema: retain_recent, served_when_path, confirm (human-only), max_age_days default 3, and the IGNORE posture. /os-adr:find confirms no existing ADR governs clean's safety tiers (only ADR-0032 touches this plugin), so none of this supersedes anything.
jared self-assigned this 2026-07-14 20:23:40 +00:00
Author
Owner

RESOLUTION: Destination artifact assembled.

Spec: plugins/os-doc-hygiene/lifecycle-spec.md — consolidates every decision from #32–#48 into one locked design: taxonomy + IGNORE surface, rulebook schema without propagate_ignore (per #44), deletion tier matrix, temporary tier (incl. #48's directory-inode-mtime sharpening), served-signal split, determinism promotion + conventions.json, pipeline integration, the :calibrate protocol with the #45 rule-report requirements (glob verbatim / matches / near-miss boundary / tier / plain-language why; class-not-path over-specificity test; narrower-glob tie-breaker), and the calibration-pass-#1 criteria — explicitly recording the seed hold-out as a one-off for pass #1 only; every later run uses full seed intake per #42.

ADR set (via /os-adr:create, indexed in docs/adr/README.md):

  • ADR-0038 — per-project rulebook override at repo-root .dochygiene-rules.json, not .cc-os/ (the #40 flag)
  • ADR-0039 — deletion autonomy tiered on evidence quality + recoverability; retain-3/3-day defaults; explicit IGNORE surface; human-only confirm: true (the #43 flags)
  • ADR-0040 — no ignore-surface propagation; propagate_ignore removed; ADR-0017 stale-premise note logged (the #44 flag)
  • ADR-0041 — determinism-promotion principle + conventions.json catalog (the #43 item-7 / #47 flag)

All five requirements in this ticket's body are satisfied. Artifacts are in the working tree, uncommitted — commit is the map owner's call.

RESOLUTION: Destination artifact assembled. **Spec:** `plugins/os-doc-hygiene/lifecycle-spec.md` — consolidates every decision from #32–#48 into one locked design: taxonomy + IGNORE surface, rulebook schema **without propagate_ignore** (per #44), deletion tier matrix, temporary tier (incl. #48's directory-inode-mtime sharpening), served-signal split, determinism promotion + conventions.json, pipeline integration, the :calibrate protocol with the #45 rule-report requirements (glob verbatim / matches / **near-miss boundary** / tier / plain-language why; class-not-path over-specificity test; narrower-glob tie-breaker), and the calibration-pass-#1 criteria — **explicitly recording the seed hold-out as a one-off for pass #1 only; every later run uses full seed intake per #42**. **ADR set** (via /os-adr:create, indexed in docs/adr/README.md): - ADR-0038 — per-project rulebook override at repo-root `.dochygiene-rules.json`, not `.cc-os/` (the #40 flag) - ADR-0039 — deletion autonomy tiered on evidence quality + recoverability; retain-3/3-day defaults; explicit IGNORE surface; human-only `confirm: true` (the #43 flags) - ADR-0040 — no ignore-surface propagation; `propagate_ignore` removed; ADR-0017 stale-premise note logged (the #44 flag) - ADR-0041 — determinism-promotion principle + conventions.json catalog (the #43 item-7 / #47 flag) All five requirements in this ticket's body are satisfied. Artifacts are in the working tree, uncommitted — commit is the map owner's call.
jared closed this issue 2026-07-14 20:29:38 +00:00
Sign in to join this conversation.
No description provided.