Skip to content

docs(corpus): standard for review requirements (#1322) - #1521

Merged
tucktuck101 merged 3 commits into
launchpadfrom
task/1322-corpus-standard-review-requirements
Aug 28, 2026
Merged

docs(corpus): standard for review requirements (#1322)#1521
tucktuck101 merged 3 commits into
launchpadfrom
task/1322-corpus-standard-review-requirements

Conversation

@serina-mcfall

Copy link
Copy Markdown

Summary

Adds launchpad/docs/corpus/standards/review-requirements.md, the canonical corpus node stating what a reviewer of a corpus-touching pull request must verify beyond validate.py's structural checks and ordinary launchpad/AGENTS.md §5-§6 review. Confirms, by checking CODEOWNERS and the corpus-validate workflow directly, that no corpus-specific approval gate exists today, and states the review checklist that fact makes necessary.

Related issue

Closes #1322

Issue type

Task


Agent provenance

Field Value
Harness / provider Claude Code
Model claude-sonnet-5
Session reference N/A
Initiating human N/A

Objective

Create launchpad/docs/corpus/standards/review-requirements.md as the single canonical policy node for what a corpus node's own review requires beyond ordinary pull-request review.

Impacted components

  • launchpad/docs/corpus/standards/review-requirements.md

Approach and rejected alternatives

Investigated whether a corpus-specific review/approval mechanism exists (CODEOWNERS, the corpus-validate CI workflow, every corpus governance document) before writing anything. None was found beyond launchpad/AGENTS.md §6's ordinary two-approval rule, so the document does not invent one. Instead it states that finding honestly and turns launchpad/docs/corpus/AGENTS.md's "Three things a passing run does not mean," confidence.md's and decision-references.md's existing review-only enforcement, and ADR-0029's flagged-escalation rule into one general, node-wide reviewer checklist: FACT citations must be opened and read (not just resolved), INFERENCE entries must pass the reasoning-vs-deciding test, relationship type directionality must be checked by hand (the schema only checks target-id existence), and a flagged status may not be cleared by a reviewer picking a side without a linked, decided ADR.

Rejected alternative: writing a new corpus-specific approval workflow (e.g. a required corpus-reviewer role or a second sign-off). Rejected because nothing in the repository's CODEOWNERS, branch protection references in launchpad/AGENTS.md, or the corpus-validate workflow establishes one, and inventing one here would be deciding a process change rather than documenting an existing policy — out of this task's scope per its own out-of-scope list ("deciding unresolved ADR outcomes").

Rejected alternative: restating confidence.md's and decision-references.md's field-level MUST lists in full. Rejected because the issue itself asks for the corpus-specific layer, and those two documents already own their fields; restating them would duplicate canonical content the DoD explicitly forbids.

Verification

Command run:

python3 launchpad/project-intelligence/corpus/validate.py

Raw output:

UNVERIFIED  corpus-agents: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-agents: evidence entry 20, citation 1: is a graph-edge or tool-result citation, which names no openable file
UNVERIFIED  corpus-readme: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-standard-confidence: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-standard-decision-references: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-standard-review-requirements: evidence entry 1, citation 1: is a commit reference, which names no openable file
PASS  corpus validation found no errors; 6 item(s) reported unverified

Exit status: 0. The six UNVERIFIED notices are the expected, non-fatal commit/graph-edge citations already present in the four other loaded nodes (corpus-agents, corpus-readme, corpus-standard-confidence, corpus-standard-decision-references) plus this node's own single commit-reference provenance citation — none are new defects.

Command run (this session's verify-gate stamp requirement):

python3 -m unittest discover -s launchpad/docs/corpus/schema/tests -p "test_*.py" -v

Raw output:

test_duplicate_audiences_rejected (test_schema.InvalidFixtureTest.test_duplicate_audiences_rejected) ... ok
test_fact_with_forbidden_fields_rejected (test_schema.InvalidFixtureTest.test_fact_with_forbidden_fields_rejected) ... ok
test_inference_missing_confidence_rejected (test_schema.InvalidFixtureTest.test_inference_missing_confidence_rejected) ... ok
test_malformed_id_rejected (test_schema.InvalidFixtureTest.test_malformed_id_rejected) ... ok
test_missing_audiences_rejected (test_schema.InvalidFixtureTest.test_missing_audiences_rejected) ... ok
test_missing_evidence_field_rejected (test_schema.InvalidFixtureTest.test_missing_evidence_field_rejected) ... ok
test_missing_evidence_for_fact_rejected (test_schema.InvalidFixtureTest.test_missing_evidence_for_fact_rejected) ... ok
test_missing_evidence_for_inference_rejected (test_schema.InvalidFixtureTest.test_missing_evidence_for_inference_rejected) ... ok
test_missing_identity_rejected (test_schema.InvalidFixtureTest.test_missing_identity_rejected) ... ok
test_missing_origin_rejected (test_schema.InvalidFixtureTest.test_missing_origin_rejected) ... ok
test_missing_status_rejected (test_schema.InvalidFixtureTest.test_missing_status_rejected) ... ok
test_missing_type_rejected (test_schema.InvalidFixtureTest.test_missing_type_rejected) ... ok
test_team_knowledge_missing_provided_by_rejected (test_schema.InvalidFixtureTest.test_team_knowledge_missing_provided_by_rejected) ... ok
test_unknown_audience_value_rejected (test_schema.InvalidFixtureTest.test_unknown_audience_value_rejected) ... ok
test_unknown_origin_rejected (test_schema.InvalidFixtureTest.test_unknown_origin_rejected) ... ok
test_unknown_relationship_type_rejected (test_schema.InvalidFixtureTest.test_unknown_relationship_type_rejected) ... ok
test_unknown_status_rejected (test_schema.InvalidFixtureTest.test_unknown_status_rejected) ... ok
test_unknown_type_rejected (test_schema.InvalidFixtureTest.test_unknown_type_rejected) ... ok
test_unrecognized_field_rejected (test_schema.InvalidFixtureTest.test_unrecognized_field_rejected) ... ok
test_wrong_direction_relationship_rejected (test_schema.InvalidFixtureTest.test_wrong_direction_relationship_rejected) ... ok
test_every_enum_member_has_metadata (test_schema.RelationshipEnumMetadataTest.test_every_enum_member_has_metadata) ... ok
test_every_metadata_entry_has_directionality_and_inverse (test_schema.RelationshipEnumMetadataTest.test_every_metadata_entry_has_directionality_and_inverse) ... ok
test_relationship_enum_matches_node_schemas_inlined_copy (test_schema.RelationshipEnumMetadataTest.test_relationship_enum_matches_node_schemas_inlined_copy) ... ok
test_node_schema_is_valid_json_schema (test_schema.SchemaMetaValidityTest.test_node_schema_is_valid_json_schema) ... ok
test_relationships_schema_is_valid_json_schema (test_schema.SchemaMetaValidityTest.test_relationships_schema_is_valid_json_schema) ... ok
test_full_fixture_passes (test_schema.ValidFixtureTest.test_full_fixture_passes) ... ok
test_minimal_fixture_passes (test_schema.ValidFixtureTest.test_minimal_fixture_passes) ... ok

----------------------------------------------------------------------
Ran 27 tests in 0.067s

OK
  • Tests or checks were run and the raw output is pasted above
  • The diff is confined to the scope of the linked issue
  • No secrets, keys, tokens or hostnames were added to tracked files

Not verified

  • Whether the two required pull-request approvals on launchpad are enforced by a GitHub ruleset as a required status check, or held only by convention -- launchpad/AGENTS.md itself states that ruleset is not readable without admin:org, and this PR did not attempt to re-verify it. Recorded in the node's own "Expected but not verified" section.
  • Whether an agent reviewer is currently blocked at the platform level from supplying one of the two required approvals, versus that being convention only (launchpad/AGENTS.md §5.1 states agents may not approve). Not checked here.
  • No node anywhere in the corpus carries status: flagged at the recorded revision, so this document's MUST 8 (clearing a flagged status) is written from ADR-0029 and decision-references.md's procedure, not from a worked instance of a reviewer applying it.
  • just ci was not run -- this change touches only launchpad/docs/corpus/ Markdown and no Rust, desktop, or mobile code.

Security implications

None believed present. The document is policy prose describing an existing review process; it does not change runtime behavior, CI enforcement, access control, or what the corpus validator checks. It explicitly does not grant or claim any new approval authority -- MUST 8 restates the existing agents-draft-decisions-do-not-make-them rule rather than relaxing it.

Escalations

None hit that required opening a new issue. Two genuine gaps were found during investigation (no established draft-to-active review requirement; ruleset/approval-enforcement details not independently verifiable without admin:org) and are recorded honestly inside the node itself, in Status transitions and Expected but not verified, following this corpus's own established convention (see decision-references.md's and README.md's identical admissions) rather than being escalated as ADR issues -- neither is a decision this document needs made to be correct as written.

…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>
Documents what a reviewer of a corpus-touching pull request must verify
beyond validate.py's structural checks and ordinary launchpad/AGENTS.md
review: FACT citations actually read, INFERENCE reasoning versus disguised
decisions, relationship-type directionality (schema checks target
existence only), and the flagged-clearing escalation ADR-0029 already
requires. States honestly that no corpus-specific approval gate exists
today beyond the ordinary two-review rule, and that draft-to-active
promotion carries no established requirement pending #1323.

Closes #1322

Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
@serina-mcfall serina-mcfall added the by:agent Filed or authored by an AI agent, not a human label Aug 27, 2026
@serina-mcfall
serina-mcfall marked this pull request as ready for review August 27, 2026 01:51
@tucktuck101 tucktuck101 self-assigned this Aug 27, 2026

@tucktuck101 tucktuck101 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — standard for review requirements (#1322)

This node's declared subject is merge gating, and two of its foundational claims about this
repository's gating are false. I measured both live, read-only, myself.

Blocking — launchpad requires one approving review, not two

The foundational FACT states "The launchpad branch is protected: a pull request there requires
at least two approving reviews from reviewers with write access", cited only to
launchpad/AGENTS.md.

gh api repos/launchpad-26/buzz/branches/launchpad/protection
  -> required_pull_request_reviews.required_approving_review_count = 1

launchpad/decisions/ADR-0019-review-checks-gate-only-when-deterministic.md:71 corrects this
explicitly: "Required approvals is 1, not 2. #154 was written against the merge box on #144
reporting two approving reviews required, observed 2026-08-13. The setting was already 1 before any
change on 2026-08-21" — and its Provenance records the check as performed with repository admin.

The cited source (launchpad/AGENTS.md:294-300) carries the stale figure and discloses its own
weakness ("the figure of two comes from GitHub's merge box on an open PR"). Under the merged
decision-references.md this is a behaviour claim, so configuration outranks documentation. The
error propagates to :182, :186-188, the enforcement-table row at :294, and :347-351, where
the node declares unverifiable something ADR-0019 verified and recorded.

Blocking — the corpus-validate run does not block a merge; there are no required checks

Enforcement states "Enforced mechanically, by validate.py in CI on every pull request touching the
corpus root ... A node violating any of these does not merge", and Exceptions says the structural
checks "are enforced before merge and cannot be waived by agreement".

Measured live:

gh api .../branches/launchpad/protection/required_status_checks
  -> HTTP 404  "Required status checks not enabled"
gh api repos/launchpad-26/buzz/rulesets  -> []          (0 rulesets)
enforce_admins                            -> false

ADR-0019's Consequences already record it: "Zero required status checks are configured.
adr-boundary runs and passes on every pull request but is not required, so it blocks nothing."
ADR-0020 records the same 404 independently.

Your own :176-178 gets it right — "a mechanical status check, not a review gate" — so the document
contradicts itself, and it is the stronger, wrong passage a reviewer will act on. Blocking because
merge gating is this node's subject.

High — the negative-existence claim is scoped to a set that omits the one governing ADR

The body asserts "No document found — AGENTS.md, README.md, schema/README.md, node.schema.json,
ADR-0028, ADR-0029, CONTRACT.md — describes a second approval step, a required corpus reviewer role,
or a distinct sign-off", and the supporting INFERENCE consults only ADR-0028 and ADR-0029 from
launchpad/decisions/.

ADR-0019 is the one accepted decision whose entire subject is what may gate a merge: model verdicts
may only annotate, deterministic scripts may gate, one human approval always required. ADR-0005
states the same line earlier. #1322's DoD requires "Links decisions or higher-order policy instead of
duplicating them", and ADR-0019 is cited nowhere in this node.

The practical gap: your nine MUSTs address "a reviewer" without distinguishing the model review
agents ADR-0019 keeps running on every corpus PR, so a reader cannot tell whether review-code
posting "citation checked" discharges MUST 1.

Medium — MUST 6's own directionality test argues against this node's four references edges

MUST 6 requires a reviewer to confirm a declared relationship type matches its real-world direction
using relationshipMeta. That block defines references as "no ownership or currency dependency
implied" and depends-on as "source requires target to be true/current for source's own claims to
hold". This node declares all four edges references, yet MUST 2 defers to confidence.md's test
and MUST 7 requires decision-references.md's MUST list applied "in full" — so if either target's
checklist changes, this node's own MUSTs change with it. That is depends-on. Caveat: #1512 is open
and owns this exact question, so deferring to it may be the right disposition — I raise it because
the node makes it a reviewer MUST.

Low — a TEAM_KNOWLEDGE entry carries the author's extrapolation

The #1323 entry appends "...including any draft-to-active promotion requirement this document does
not find established today". #1323's body is standards boilerplate and says nothing about draft,
active, promotion or a lifecycle requirement. The corpus AGENTS.md names this directly:
TEAM_KNOWLEDGE "is not a place to park a decision you made yourself — attributing an extrapolation
to the thing it started from does not make it something you were told." Split the entry.

Batch correction — the AGENTS.md hunk is not an index registration

launchpad/docs/corpus/AGENTS.md at this head is byte-identical to the launchpad tip; the hunk is
the task/636 change inherited through a stale merge base (919886b41). No net change on merge, no
cross-standard conflict, and no standards index exists to register in.

What is correct

  • Nothing in this node gives a model review gating authority — I checked specifically, and that
    boundary is respected.
  • :176-178 characterises the workflow correctly.
  • The nine MUSTs are each observable from a PR, which is the right bar for a review standard.
  • CI green at head (latest run per check); node validates clean.

Reviewed by tucktuck101's review lane. Every failing claim reported above was reproduced by me against this PR head before posting.

@tucktuck101 tucktuck101 removed their assignment Aug 27, 2026
…ts.md

Both Blocking findings from tucktuck101's review confirmed against primary
sources and fixed:

- Approval count: the node claimed launchpad requires two approving
  reviews, citing only AGENTS.md. ADR-0019 (accepted, merged) explicitly
  corrects this to one, verified live with repository admin on 2026-08-21.
  Under decision-references.md's own rule, configuration outranks stale
  documentation. Fixed every propagated instance of the "two" figure and
  added ADR-0019 as a cited evidence entry.
- Merge enforcement: the node claimed a validate.py failure "does not
  merge" and that structural checks "are enforced before merge." Live
  checks (rulesets=[], required_status_checks 404) plus ADR-0019's own
  Consequences ("zero required status checks are configured... blocks
  nothing") confirm no required status check exists today. Reworded the
  Enforcement and Exceptions sections to state this accurately, and added
  a FACT evidence entry citing ADR-0019.

validate.py runs clean (0 errors); corpus test suite: 79 passed.

Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
@tucktuck101
tucktuck101 merged commit 2ac7783 into launchpad Aug 28, 2026
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

by:agent Filed or authored by an AI agent, not a human

Projects

None yet

Development

Successfully merging this pull request may close these issues.

task: document corpus standard for review requirements

2 participants