docs(corpus): standard for status (#1323) - #1517
Conversation
…ed at (#636) Rebased onto `launchpad` and reduced to one file. #1468, #1469 and #1477 merged while this PR sat on CHANGES_REQUESTED, and each carried the shared #636 base, so two of this branch's three files -- the #636 plan and test_validate.py -- are now byte-identical on `launchpad` and no longer belong in this diff. What is left is the fix itself. The consequence worth stating plainly: those merges landed the UNFIXED corpus AGENTS.md on `launchpad`, including the line this commit removes -- "Do not take that on this document's word -- the command is the check". The High finding is on the default branch now, which is why this is a defect fix rather than a pre-merge correction. HIGH -- the provenance-update shortcut could certify stale evidence. Two passages said an empty `git diff --name-only <recorded-sha> -- <ledger paths>` established that every cited source was unchanged and every claim still stood. Both are false for citation forms this document itself permits. Measured, not argued. A file that DOES differ reports as changed with a bare path and reports empty output with exit status 0 once `:127` or `:219-221` is appended -- no error, no warning. So an unnormalized `path:line` citation makes a changed file indistinguishable from an unchanged one, which is the worst available failure shape for a provenance check. Recorded as a new FACT entry with the tool-result citation that demonstrates it. The rule now states its reach: normalize positions off the path first; only bare path, file line and file range are in scope; graph edge, tool result, commit and the two URL forms are excluded explicitly, so the branch is simply unavailable when a ledger contains one. The conclusion is narrowed to what a diff can support -- those files are unchanged -- with re-verification left as the only thing that establishes a FACT still holds. MEDIUM -- the one-node rule had no supporting ledger entry. "One node is one independently maintainable idea" is a substantive instruction and the ledger's only #636 entry backed the recorded-revision requirement instead. Added as TEAM_KNOWLEDGE attributed to #636's definition of done, which states it near-verbatim, matching the existing entry's classification for the same source. Also corrected a wrong-direction cross-reference: "*Updating a node* below" in Scope and omissions, where that section is above it. The recorded revision stays at 0052f5a, re-checked against the NEW base after the rebase rather than assumed to still hold: the two non-file citations were excluded, the nine normalized file paths were passed to `git diff` against 0052f5a from `launchpad` tip 0ffc1c9, and the result was empty. The second Medium is not addressed because it is stale -- the citation table was already corrected by ebe2daf and says outright that it is seven rows and is not a summary of CONTRACT.md section 3. The remaining cross-document disagreement is tracked as #1478. Evidence is in the PR thread. Validated against the full four-node corpus now on `launchpad`, not just this node: PASS, 5 non-fatal UNVERIFIED notices, all commit or tool-result citations that name no openable file. Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
Adds launchpad/docs/corpus/standards/status.md as the canonical governance node for the corpus schema's five-value status enum (draft, active, deprecated, retired, flagged). Defines draft/active/ deprecated semantics for the first time (nothing else in the repo does), while linking to AGENTS.md's retirement procedure and ADR-0029's flagged-conflict escalation rather than duplicating them. Signed-off-by: Claude Sonnet 5 <noreply@anthropic.com> Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
tucktuck101
left a comment
There was a problem hiding this comment.
Review — standard for status (#1323)
The call that mattered most here is right: flagged is defined as ADR-0029 defines it — "two
same-claim-type authoritative sources contradict each other and a human has not resolved it.
Not a lifecycle stage and not a confidence marker" (status.md:153 table row, and the FACT at
:22). That is the definition that could have collided with confidence.md and it does not.
The status vocabulary is the exact five-value enum, no additions. Two accuracy defects.
High — retired is asserted terminal, sourced to a file that does not say so, and contradicted twice in this same document
The value table's retired row (status.md:153) reads "The terminal lifecycle state. ...
the id is spent permanently" and names launchpad/docs/corpus/AGENTS.md in its "Who defines
it" column.
AGENTS.md does not define that. Grepping the merged corpus AGENTS.md for
terminal|one-way|irreversib|stays spent returns exactly one line — :413, "Never reuse or
rename the id. A retired id stays spent" — which is a claim about the id, not about the
status being terminal.
And this document disclaims terminality twice elsewhere:
:254(enforcement table): "a node can be moved fromretiredback toactiveon the same
file without any check objecting":307(scope and omissions): "Whether a status transition should ever be restricted (for
example, one-way retirement) | Not decided anywhere in this repository today"
So the normative meaning table asserts terminality, attributes it to a file that doesn't assert
it, and the same document denies it is settled. The rest of :113-144 is scrupulous about
separating derived authority from original judgement — this row is the one slip. Either drop
"terminal" and keep the AGENTS.md attribution for the file-stays/id-spent half, or keep it and
change the definer column to "This document (guidance, not schema-enforced)" as the draft and
active rows already do.
Medium — the H1 ships the exact form being reconciled away
status.md:83 is # Standard: \status`— topic in a code span. #1508, in this same batch, is landing precisely that de-code-formatting change toconfidence.md(verified in its diff:# Standard: `confidence`-># Standard: confidence`). A newly authored standard shipping
the form that is actively being removed will need the identical follow-up edit immediately after
merge. One pair of backticks.
Low — one FACT overclaims exhaustiveness about validate.py
The evidence entry at :40 ends: "The only occurrences of the string "status" in the file
belong to an unrelated per-citation ValidationReport.status field". Grepping
launchpad/project-intelligence/corpus/validate.py for status returns four hits: :592 (the
field), :790 and :796 (verdict.status, i.e. that same field), and :11 — a module
docstring line "Exit status is 1", which belongs to neither. The load-bearing half of the claim
— that no logic reads or branches on a node's status — is true, and I checked all four hits to
confirm it. Only the "only occurrences" clause is false, and it is declared FACT. Narrow it to
"the only occurrences that refer to a node's status".
Batch correction — the AGENTS.md hunk is not an index registration
Worth recording because it looks like one: launchpad/docs/corpus/AGENTS.md at this PR's head
is byte-identical to the launchpad tip (verified with git diff --quiet), and the same is
true across the sibling standards PRs. The hunk is the whole task/636 change inherited through a
stale merge base (919886b41), not a registration this PR adds. Merging produces no net
AGENTS.md change and there is no cross-PR conflict there. There is also no standards index to
register in — the corpus AGENTS.md forbids a hand-authored index.
What is correct
flaggedmatches ADR-0029 andnode.schema.jsonexactly, and the standard explicitly
forbids the low-confidence reading — no collision withconfidence.md.- Status vocabulary is the exact five-value closed enum.
- Honest about what is not settled: the omissions table records the transition-ordering gap
rather than inventing a rule. - Node validates clean.
- CI green at head (latest run per check).
Reviewed by tucktuck101's review lane. Every claim above was checked against the files at this
PR head and the merged corpus on launchpad.
Summary
Adds
launchpad/docs/corpus/standards/status.md, the canonical governance node for the corpus node schema's five-valuestatusenum. It definesdraft/active/deprecatedsemantics for the first time in this repository, and links toAGENTS.md's retirement procedure and ADR-0029'sflagged-conflict escalation rather than duplicating either.Related issue
Closes #1323
Issue type
Task
Agent provenance
Objective
Create
launchpad/docs/corpus/standards/status.mdas the single canonical policy node for the corpusstatusfield.Impacted components
Approach and rejected alternatives
Branched from
origin/task/636-corpus-agents-md(notlaunchpad) per the batch dispatch instructions, because that branch carries an unmerged fix tolaunchpad/docs/corpus/AGENTS.mdthis task's governing procedure depends on; the diff below therefore legitimately includes those unmerged AGENTS.md changes.For
flaggedandretired, the meaning is already fully owned elsewhere (ADR-0029 +node.schema.json's own description forflagged;AGENTS.md's "Retiring a node" section forretired) — this document names what they mean and links out rather than restating the procedures, per the corpus AGENTS.md's "authoritative sources this file duplicates none of" pattern already used by the two merged sibling standards (confidence.md,decision-references.md).For
deprecated, I foundlaunchpad-26/buzz#1311("task: document corpus standard for deprecation", parented to the same PRD #605, targetinglaunchpad/docs/corpus/standards/deprecation.md) already open and unlanded. Rejected alternative: writing the full deprecation policy into this node. That would violate the one-idea-per-node rule and directly duplicate #1311's assigned scope, so this document instead namesdeprecated's place in the status lifecycle only, defers the procedure to #1311, and adds a MUST (requirement 6) bridging the interim gap: until #1311 lands, an author moving a node todeprecatedmust record what replaces it in the node's own body.For
draftandactive, no document in this repository defines operational semantics beyond the bare enum member names (verified:node.schema.json'sstatusdescription discusses onlyflagged; PRD #602, issue #622, and the schema's own plan document were all checked and none define the other four values). This document supplies that meaning as original guidance and says so explicitly in "Scope and authority", rather than presenting an invented convention as if it were restated from an existing authority — mirroring howcorpus-standard-confidencedisclosed its own invented confidence bands.Rejected alternative: leaving
relationshipsempty by default. Per the batch dispatch's corrected guidance, checkedgit ls-tree -r --name-only origin/launchpad -- launchpad/docs/corpusimmediately before finalizing front matter (re-run after all body edits) and found four loaded nodes:corpus-agents,corpus-readme,corpus-standard-confidence,corpus-standard-decision-references. Added tworeferencesedges — tocorpus-agents(this document leans on its "Retiring a node" section rather than restating it) and tocorpus-standard-confidence(theflagged-vs-low-confidence distinction this document's MUST 2 states is the same distinction that node already makes on the confidence side). Did not add an edge tocorpus-standard-decision-references, despite citing it repeatedly in prose, because nothing in this node depends on it being true or supersedes it — a barereferencesedge would say less than the existing prose cross-references already do. Did not target any of the other 4 documents in this same 5-way batch (generated-content,identifiers,naming,normative-language), per the dispatch instruction that none of them will have landed onlaunchpadby the time this PR does, regardless of what any single worktree shows.Verification
Command run:
Raw output:
Exit status: 0 (confirmed via separate re-run; the UNVERIFIED lines are non-fatal notices for commit citations, expected and unavoidable per
AGENTS.md's own documented behavior — every existing node's provenance entry produces the same notice).Also ran, because this worktree's local
verify-gatepre-commit hook does not recognizepython3 launchpad/project-intelligence/corpus/validate.pyas a matched test command (a known, already-tracked gap in that hook'sTEST_PATTERN, unrelated to this repository) and a piped invocation is explicitly refused by that hook as unattributable, so the commit's verification stamp was earned by this separate, genuinely-run, unpiped command rather than byvalidate.pyitself:Raw output:
Not verified
deprecated,retiredorflagged, so every claim in the new document about how those values behave is drawn from the schema,AGENTS.mdandADR-0029, never from a worked instance — noted in the node's own "Expected but not verified" section.retired/deprecatedfrom a default listing) was not checked — no generator exists yet for this corpus.retiredback toactiveon the same file) is intended to be possible was not settled by asking anyone; it is named as an enforcement gap in the new document because nothing innode.schema.jsonorvalidate.pyrestricts it, not because reversal is expected to happen.just cigate (out of scope for a docs-only corpus node per this repo's own guidance, and this fork's AGENTS.md governs docs/deployment work rather than Rust/desktop/mobile changes this PR does not touch).Security implications
None believed. This is an addition to a public, docs-only corpus node under
launchpad/docs/corpus/; it adds no secrets, no executable code, and no new HTTP/API surface, and does not alter runtime product behavior.Escalations
launchpad-26/buzz#1516("task: decide whether corpus node status transitions should be restricted (e.g. one-way retirement)") — a gap found while executing this task, not this node's to fix: nothing in the schema or validator prevents moving a node'sstatusbackward (e.g.retired->active) on the same file, and no document in the repository states whether that is intended. Out of scope for this PR per its own "creating/editing a second hand-authored canonical corpus document" boundary and perAGENTS.md's "stable knowledge belongs in a document, active work becomes an issue" rule — this is unsettled, not yet documented, and therefore a task, not something to resolve inside this node's body.deprecatedstatus's full policy is intentionally left to#1311, already filed and open; this PR does not duplicate or preempt it.corpus-standard-decision-referencescross-references in this document's prose should eventually become a typedreferencesedge (once this node's claims start depending on that document being true, rather than merely citing it) is left as a judgment call for whoever authors the next sibling standard, perAGENTS.md's "the first sibling node is the moment to revisit it" guidance.