knowledge: 4 insights — precedence between competing exit conditions, escape-hatch uses as a knowledge-gap signal (2 new pages), same-iteration pane witness after send-keys, graphify hooks miss the git-pull path (+3 merges, 0 drops) - #204
choiyounggi wants to merge 1 commit into
Conversation
Wiki agent gate: failReviewed PR #204 (4 knowledge-flush insights: 2 new wiki pages, 3 amended pages, index/log plumbing) against the three semantic checks. Transferability: all directives are general and publicly verifiable (mechanism sources are man pages, git-scm.com, GitHub docs, a mutation-testing arXiv paper); field evidence cites this repo's own scripts/tests, which is permitted. Duplication: grepped the existing wiki for precedence/exit-condition-ordering content, escape-hatch/gap-recording content, and git-hook/post-merge content — none found; the report's routing (2 new pages, 3 merges, reciprocal related-links) matches what the wiki actually contains, no blocker-level duplicate directive. Fact check: WebFetched every newly-cited or diff-relied-upon source. The arXiv mutation-testing paper, the git-scm.com githooks page, and the GitHub code-scanning "resolving alerts" doc all support their cited claims accurately. One source is a real problem: the GitHub blog changelog cited on the new escape-hatch page overstates its own content (claims a "mandatory rationale" visible in an "audit log" and via "webhooks", none of which the changelog text supports) — this is a blocker. Two other cited URLs (the Google Testing Blog mutation-testing post, and the tmux(1) send-keys section) could not be retrieved in full by the fetch tool, so those are recorded as advisories (unverifiable from CI), not blockers.
|
Knowledge flush — 4 insight(s)
Claimed queue ids:
c6c76b1cb2d35bf9,028fcf4648303397,1c4620e3aadaf0b7,56f4dbc8fb5997f8.All four were handled (2 new pages, 3 amended pages); none dropped.
Verified best-practice
1.
c6c76b1cb2d35bf9— precedence tests must stage the competing condition at the deciding iteration (→confidence: verified)Claim: a test asserting that exit condition A wins over B must make B become true in
the same poll/iteration in which A reaches its threshold; a B staged earlier makes the
assertion hold under either ordering of the checks.
this session. An undetected mutant has three causes, the first being that "the test
inputs are not sufficient to infect the state of the program". That is exactly this
failure: if B fires before A can activate, the reordering mutant is never reached in a
state where it can infect the outcome.
distinguishes the mutated program; a kill is attributed to the covering test, which is
why the precedence test itself (not merely the file) must redden.
inserting the fault and requiring failure, not by branch coverage.
watch-status.sh, three "R6 precedence" bats cases): movingthe exit-8 block above the failed/done check left all three green. Re-staging the
competing status transition to the same tmux-stub capture count that confirms the
two-poll witness made the same swap red.
2.
028fcf4648303397— never confirm a pane witness from a capture taken in the same iteration as a key-send (→ merged asverifiedmaterial into an existingverifiedpage)Claim: when a poll loop both sends keys (auto-recover
Enter, resend) and reads a statewitness from the pane, it must skip the capture entirely on the iteration that sent keys.
shpane): with the newest status linereading
STATE=BLOCKED, sending a command that worked 0.4s before printing left thesame-iteration
capture-panestill showingSTATE=BLOCKED; the next poll showedSTATE=RUNNING. The same sequence with an instantly-printing command had alreadyrepainted within the same iteration — so the check's outcome is set by the target's work
time, which is why the gate belongs on "did this iteration send keys", not on a delay.
(
send-keyswrites keys into the pane;capture-panecopies visible contents — neitherreports consumption) and https://man7.org/linux/man-pages/man3/termios.3.html.
t3-blocked-consume, finding F1 — the exit-8"still blocked" witness was confirmed from a same-poll capture, so a just-repaired worker
could be escalated; gating on the recovery flag fixed it, and removing the gate under
mutation woke the witness one poll early.
3.
1c4620e3aadaf0b7— graphify's installed hooks miss thegit pullpath (→verified)Claim:
graphify hook installcoverspost-commitandpost-checkoutonly, while the"PR merged upstream →
git pull" path firespost-merge, so the graph goes stale whilehook statusreports installed.post-commit"is invoked bygit-commit";
post-merge"is invoked by git-merge, which happens when agitpullisdone on a local repository";
post-checkout"is also run after git-clone, unless the--no-checkout(-n) option is used".fast-forward
git pullfiredpost-merge 0alone; a divergentgit pullthat created amerge commit also fired
post-merge 0and nopost-commit; a freshgit cloneofthat repository carried no non-sample hooks.
graphifyy 0.4.23hooks.py:186-187installs"post-commit"and"post-checkout"only;grep -c post-merge hooks.py→ 0."does not run hooks on clone". Per the docs and the reproduction,
git clonedoes runpost-checkout— the reason a clone gets no graph is that hooks are not copied by clone,so none exist to run. The page carries the corrected reason.
4.
56f4dbc8fb5997f8— a grounding gate's escape hatch must emit a gap record at the point it grants the pass (→confidence: field-tested)Claim: an escape hatch (
[no-wiki], a suppression comment) is the most valuable signal aknowledge base gets, and a gate that only decides pass/fail destroys it; the record must be
emitted by the gate, not requested in prose.
— fetched this session: dismissing an alert requires choosing a reason, "the dismissal
comment is added to the alert timeline", it is readable as
dismissed_commenton thealerts API, and dismissed alerts stay in the Closed list for review. This is the canonical
shape of a recorded escape hatch.
— each dismissal request carries a mandatory rationale, visible on the timeline, in the
audit log, and via REST API and webhooks.
skills/wiki-plan/scripts/plan-gate.sh:166passes an ungrounded decision with
[ "$basis" = "[no-wiki]" ] && continueand recordsnothing, while
skills/wiki-plan/SKILL.md:135asks in prose for the decision to be "notedas an ingest candidate". Against 276 non-index wiki pages,
log.mdcarries exactly onegapentry (2026-07-11).rather than verified; the GitHub precedent supports the mechanism, not the general claim.
Existing-layer check
Routed via
INDEX.md→ domainindex.md→ every page whose "load when" overlapped.Pages read: testing-quality-tests-that-cannot-fail, testing-quality-policy-at-several-return-sites, testing-quality-completion-predicates, testing-quality-surviving-mutant-equivalence-triage, infrastructure-agent-orchestration-pane-delivery-confirmation, infrastructure-agent-orchestration-code-graph-as-orientation-layer, platforms-processes-driving-a-tui-in-a-tmux-pane, qa-document-verification-spec-document-gates, infrastructure-agent-orchestration-session-completion-gates, infrastructure-agent-orchestration-autonomous-decision-rulings
(Directory-level scans of
wiki/testing/quality/,wiki/platforms/processes/,wiki/infrastructure/agent-orchestration/plus keyword sweeps forno-wiki,post-merge,capture-pane/send-keys, andprecedenceover the whole wiki preceded these reads.)tests-that-cannot-failcarries a co-occurring-writer edge case (two writers of one flag) andpolicy-at-several-return-sitescarries per-site mutation — both are about coverage of one site, neither about which of two live conditions winspane-delivery-confirmationalready rules that a pane diff is not delivery evidence (echo direction). The new rule is the opposite direction — a stale capture falsely confirming a witnessdriving-a-tui-in-a-tmux-panecode-graph-as-orientation-layeralready gates on freshness and its Sources line already nameshook installpost-commit/post-checkout — the hook-coverage consequence was missingsession-completion-gatesandspec-document-gatescover gate authoring; none covers what a gate does with its own exemptions. Keyword sweep forno-wiki/escape hatch/knowledge gapreturned no owning pageagent-orchestrationcategoryConflicts flagged: none — no existing directive is contradicted.
Related links added both ways:
tests-that-cannot-fail,policy-at-several-return-sites,completion-predicates↔ the new precedence page;session-completion-gates,autonomous-decision-rulings,spec-document-gates↔ the new escape-hatch page.Lint after the edits:
wiki-structure-checks.js→ 278 pages, 13 indexes, 0 findings;wiki-lint-prohibitions.js→ no findings on any touched page (the 2 repo-wide violations itreports are pre-existing, in
plans/andtests/fixtures/). New pages are 67 and 69 bodylines; amended pages are 92, 92 and 65 — all under the 120-line cap.
Open-PR check
Listed with
gh pr list --repo choiyounggi/dev-loop --state open --search "head:knowledge/"—12 open heads: #191, #190, #189, #188, #187, #186, #185, #183, #182, #181, #180, #179.
Each head was fetched and its added wiki lines (
git diff <merge-base> pr-N -- wiki/)grepped for
post-merge|graphify|graph.json|no-wiki|capture-pane|send-keys|precedence|knowledge gap.proving-a-critical-section-is-lock-protectedandsequential-dispatch-assumption-under-concurrencyare concurrency-window tests, not exit-condition ordering; its onlyprecedencehits are Gradle property precedence (#179)send-keyshit is a pointer row in a stdin-vs-send-keys edge caseupdateexits 1 on a >5,000-node HTML viz); #186 only mentions this page in an INGEST_REPORT dedup notegate-evidence-exit-code-classis about a gate's own exit-code classes, not about recording exemptionsMerge-risk note for the reviewer: #185 and this PR both append to
wiki/infrastructure/agent-orchestration/code-graph-as-orientation-layer.md(differentedge-case rows and different source bullets). Whichever lands second may need a one-hunk
textual merge; the content does not conflict semantically.
Routing decision
testing/quality/precedence-between-competing-exit-conditions.md(new page)testing/qualityalready owns "can this test actually fail"infrastructure/agent-orchestration/pane-delivery-confirmation.md(merge), + 1 pointer row inplatforms/processes/driving-a-tui-in-a-tmux-pane.mdinfrastructure/agent-orchestration/code-graph-as-orientation-layer.md(merge)infrastructure/agent-orchestration/escape-hatch-uses-as-a-knowledge-gap-signal.md(new page)agent-orchestrationalready carries the gate-authoring pages (session-completion-gates,autonomous-decision-rulings); aknowledge-basecategory would hold one page and split gate knowledge across two placesPlumbing:
wiki/testing/index.md+1 row;wiki/infrastructure/index.md+1 row and twoextended "load when" lines (pane-delivery-confirmation, code-graph-as-orientation-layer);
log.md+1ingestentry.