Repository navigation
docs: require e2e evidence for every behavior change - #675
Merged
Merged
Conversation
E2E is the layer that proves a change works against the real Flow blackbox; offline-green only proves our code does what we think it does. Nothing in the contributor path asked for it: the lifecycle table routed only generation-path changes to live-verify, "Test categories" documented how to run e2e but framed it as opt-in maintainer regression, and the PR template's only live-Flow line was scoped the same way. External PR #671 followed all of it to the letter and arrived with eight offline test files, zero e2e -- and its HTTP fast path failed on the first real run. Also records what live-verify is not: it drives CLI commands by hand into a gitignored note and never runs `pytest -m e2e`. An e2e test is a re-runnable regression; a live-verify ledger is a narrative record. Both, not either. - CONTRIBUTING.md: new lifecycle row for any behavior change; fourth pipeline rule; "E2E is required, not optional" in the test-categories section - AGENTS.md: same rule where agents read it, plus the cost sub-marker list - .github/PULL_REQUEST_TEMPLATE.md: an e2e line that has to be answered Drive-by: AGENTS.md said "six gates above" over a nine-command block.
11 of 18 tasks
Owner
Author
PR #675 — Council Review VerdictReviewed at Consensus: 🟡 YELLOW — the rule is right, its wording contradicts itself and five untouched files
Must-fix (5)
Nice-to-have (5)
False positivesNone. Spot-checked CONTRIBUTING:126, CONTRIBUTING:42-43, DEVELOPMENT.md:131, AGENTS.md:179 and the e2e file count (32) against the SHA — all as reported. Confirmed-good
Memory actions (D5)
Verdict handlingYELLOW = soft block. Must-fix 1-4 are small edits in the PR's own files plus two lines in |
Council review of #675 found the rule stated three different ways. Fixed by picking one canonical wording -- the PR template's -- and making the others agree with it. - Exemption was contradictory: CONTRIBUTING said a change without an e2e test "is not reviewable" (absolute), the template said "say why and a maintainer will run it" (exempt), AGENTS.md offered no exemption at all. All three now carry the template's wording. - Scoped to "a behavior change that touches a Flow surface". As written, the rule demanded an e2e run from docs-only, help-text and exit-code changes, which cannot produce one -- #675 itself was such a change. - CONTRIBUTING still called e2e "opt-in" fourteen lines under "required, not optional"; it now reads "excluded from the default run -- select with -m e2e". - Dropped the "~25 of them" count (actually 32 files); a hardcoded count drifts. - Untouched files still taught the old rule: docs/DEVELOPMENT.md had the maintainer running e2e on the author's behalf, AGENTS.md said "All 7 quality gates" over a nine-command block, and the 10-phase table had no phase that runs the suite -- Phase 8 is now "E2E + Live Verification". - Added GFLOW_CLI_E2E_RUN_CHARACTER to the marker list and a redaction hint wherever the docs ask for pasted output. Pins the rule with two tests in tests/test_documentation_gate.py, so deleting any of the three statements fails CI rather than passing quietly.
7 tasks done
ffroliva
added a commit
that referenced
this pull request
Sep 5, 2026
…er clause to the merge Council review of #677 found the substitution still reachable -- not through the wording, but through the verdict colour. D4 said "must-fix" while scoring YELLOW, and a YELLOW is dismissable under section 5 step 8 with a one-line justification. "The live runs in the PR body are good enough" is precisely the justification someone writes, which reopens the ledger-for-e2e substitution through the escape valve rather than through the text. - Absent with no reason given now scores D4 RED, forcing consensus RED under section 5 step 3, and the skill says why it is not YELLOW so nobody softens it back later. - Absent WITH a stated reason stays YELLOW, blocked on a maintainer run -- that is the documented exemption, not an evasion. - Present is now verified rather than trusted: cite the tests/e2e file:line, confirm it exists at REVIEWED_SHA, confirm it exercises the changed surface. A passing e2e test that never touches the changed path is pr-must-verify-on-affected-surface wearing an e2e label. - The grandfather clause said "PRs opened before 2026-09-05", which excluded the only two PRs it exists for: #669 opened 11:28Z and #671 at 13:38Z, both hours before #675 merged at 19:15Z the same day. Now anchored to the merge commit, not the calendar day. The published slug carries the same RED wording, so the memory a future reviewer loads cannot disagree with the skill that cites it.
4 of 8 tasks
ziyedbe
pushed a commit
to ziyedbe/gflow-cli-fork
that referenced
this pull request
Sep 5, 2026
PR ffroliva#675 put the rule in the contributor-facing docs, but the review skills still scored by the old bar: D4 treated a missing surface test as "automatically YELLOW", and nothing told a reviewer that a PR body full of live runs does not close it. A rule the reviewer does not apply is not a rule. - New published slug `e2e-evidence-is-a-contributor-deliverable`, cited from the D4 mandatory-memory row so `check_council_memory.py` enforces the round trip both ways. - pr-council-review D4: missing e2e evidence on a Flow surface is a must-fix, with the three substitutions that must be refused named explicitly -- a live-verify ledger, a BDD .feature file, and demanding an impossible run from a docs-only change. PRs opened before 2026-09-05 are flagged forward-looking rather than held to it. - pr-council-review section 9: autonomous mode reports e2e evidence, never runs it -- the sandbox has no Flow auth and must not spend credits, so GREEN there means "evidence present and plausible", never "e2e passed". - live-verify Notes: this skill is not the e2e suite and does not satisfy the rule; a Flow-surface PR owes both. The substitution the D4 text refuses was proposed on ffroliva#669 within an hour of ffroliva#675 landing, which is why it is written down rather than left to judgement.
This was referenced Sep 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Makes e2e evidence a contributor requirement instead of an opt-in maintainer activity.
E2E is the layer that proves a change works against the real Flow blackbox. Offline-green only proves our code does what we think it does. Nothing in the contributor path actually asked for it:
live-verifyExternal PR #671 followed all of that to the letter and arrived with eight offline test files and zero e2e — and the HTTP fast path it added failed on the first real run.
This also records what
/gflow:live-verifyis not: it drives CLI commands by hand into a gitignoredtmp/live-verify/note and never runspytest -m e2e. An e2e test is a re-runnable regression; a live-verify ledger is a narrative record. The two are complementary, and the docs now say so.Changes
Council fixes (
65a431e)Review returned YELLOW with five must-fix items, all applied:
-m e2e".docs/DEVELOPMENT.md, AGENTS.md's "All 7 quality gates" over a nine-command block, and a 10-phase table with no phase that runs the suite (Phase 8 is now "E2E + Live Verification").Plus nice-to-haves:
GFLOW_CLI_E2E_RUN_CHARACTERadded to the marker list, and a redaction hint wherever the docs ask for pasted output.Test plan
Docs and tests only; no
src/changes.uv run python scripts/ci/check_repo_hygiene.py— 944 files, no violationsuv run python scripts/ci/check_doc_links.py— all links resolved across 29 filesuv run python scripts/ci/check_website_docs_pii.py— clean across 25 published filesuv run python scripts/ci/generate_website_docs.py --check— mirror in sync (20 files)uv run python scripts/ci/check_council_memory.py— 47 memory files, all cited and resolvinguv run ruff check src tests/ruff format --check— cleanuv run pyright src— 0 errors, 0 warningspytest tests/test_documentation_gate.py tests/mcp tests/scripts tests/api/transports/test_overlay_precondition.py— 412 passedThe earlier body said "293 passed"; that run predated
tests/test_documentation_gate.py— the one test file that reads AGENTS.md and the PR template, and therefore the one most able to catch a mistake here. It is now included, and the count above is from the current SHA.E2E evidence: not applicable — this PR touches no Flow surface. Stated rather than silently skipped, per the exemption it introduces.