knowledge: 2 insights — park a transient async state behind a test-controlled gate, a PASS body that records a surviving mutant is a finding (1 new page, 2 amended, 26 plan-gaps retired) - #226
Open
choiyounggi wants to merge 1 commit into
Conversation
…lan-gaps retired New: testing/async/transient-state-behind-a-controlled-gate — assert on a transient mid-run state a background finisher will wipe by parking the system behind a decision the test controls; prove by mutating every finisher spawn site. Amended: qa/process/evaluating-review-feedback (a PASS body that records a surviving mutant is a finding — map survivors to the brief's literal requirements), testing/quality/surviving-mutant-equivalence-triage (reciprocal edge row + field evidence), testing/async/async-testing (table row + related). Indexes: testing, qa; log.md +2. Report: .dev-loop/INGEST_REPORT.md (structure 354 pages / 0 findings; prohibitions 0 violations).
This was referenced Sep 28, 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.
Knowledge flush — 2 insight(s) + 26 plan-gap rows
Flush run id
20260928-092537-1352(inherited from the auto-flush hook that spawned this session viaDEV_LOOP_FLUSH_RUN_ID; step-0 acquire returnedalready-owned— a first attempt with a fresh run id was refused withheld 20260928-092537-1352 81s, and the process tree showed the holder is this session's own parenthooks/auto-flush.sh). Branchknowledge/choiyounggi-20260928-092831offorigin/mainat5986311. Claimed viaqueue-claim.js claim→ 28 ids: 2 session candidates (f6e9703c7f44b032,3693d1c0d6feb6d3) + 26plan-gaps.jsonlrows.Outcome: 1 new page, 2 amended pages, 2 domain indexes updated, no new category; 2 of 2 session candidates ingested; 26 of 26 plan-gap rows excluded as project-specific (Local-layer candidates below).
Gates run on the edited checkout:
node scripts/wiki-structure-checks.js wiki→pages: 354, indexes: 13, findings: 0(untouched baseline: 353 / 0);node scripts/wiki-lint-prohibitions.js→violations: 0(baseline 0); new page body 76 lines; no banned qualifier in any added line (grep for usually/often/consider/might want/generally/typically/probably/as appropriate overgit diff -U0 -- wiki/+ the new page → 0 hits after two rewrites).Verified best-practice
1. Park an async orchestrator behind a test-controlled decision to assert on a transient mid-run state (
f6e9703c7f44b032, repo t3-swap-flake)await-returns guarantee: the handle is the ordering point for the post-wipe state; the park is for the pre-wipe state..claude/tmp/and deleted in the same command): a startup seeds aMapand spawns a finisher that clears it on the next timer turn. Read right after startup → 0/200 failures (looks deterministic). Same read after one scheduler turn of pressure → 200/200 failures. Finisher parked behind a promise the test resolves after the read, same pressure → 0/200 failures and the map is empty after release every run.escalation_timeout_ms = 0disabled the lead's tick branch (crates/crew-lead/src/dispatch.rs:576), so a planted violation withmax_rework = 0held the lead task open untilresolve_gate; mutating bothtokio::spawn(reap_controls_entry(sites →FAILED ... Elapsed(())at 30.03 s; restored →ok. 4 passed; 20/20 stable.2. A PASS verdict whose body records a surviving mutant is a finding, not a clearance (
3693d1c0d6feb6d3, repo t5-proto)agents/test-quality-auditor.md: the FAIL list is no-assertion / disabled cases / uncovered changed behavior / rubber-stamping / the case-count floor, output isVERDICT: PASS | FAIL+ one justification line — coverage of every stated guarantee is not among the FAIL conditions, so a PASS body can carry a surviving mutant without contradiction. This is the mechanism the candidate's "why" described.cargo test -p crew-proto12→13 tests; under thedeny_unknown_fieldsmutantunknown_entry_fields_are_tolerated ... FAILED; under a.rev()mutantmalformed_entry_is_dropped_and_valid_sibling_kept ... FAILED; restored → 82 passed; the resumed auditor reproduced both kills and returned PASS.field-tested(evaluating-review-feedback) andverified(surviving-mutant-equivalence-triage, whose new row is a routing pointer plus field evidence, not a new mechanism claim); neither page's confidence was changed.Existing-layer check
Pages read: testing-async-async-testing, testing-flaky-diagnosing-flaky-tests, testing-quality-tests-that-cannot-fail, testing-quality-narration-based-ordering-assertions, testing-quality-proving-a-critical-section-is-lock-protected, testing-quality-surviving-mutant-equivalence-triage, testing-quality-harness-reverse-controls, testing-quality-minimum-case-set, qa-process-evaluating-review-feedback, qa-process-fresh-context-code-review, qa-process-completion-claims, testing-async-transient-state-behind-a-controlled-gate
Semantic dedupe (
wiki_search, k=5) top hits — candidate 1: infrastructure-agent-orchestration-control-signals-vs-primary-artifacts (0.729), testing-async-async-testing ×2 (0.728, 0.725), qa-environments-test-environment-parity (0.722), testing-data-testcontainers-reaper-on-docker-desktop-macos (0.720). Candidate 2: testing-quality-tests-that-cannot-fail ×2 (0.764, 0.762), testing-quality-narration-based-ordering-assertions (0.758), qa-process-completion-claims (0.758), testing-quality-unasserted-return-fields (0.747). No hit's "When this applies" describes either candidate's situation.testing-async-async-testingcovers waiting for a final state (condition wait, fake timers, completion handle) — the transient-state case is absent;testing-flaky-diagnosing-flaky-testssleep row says "wait on the completion condition", which a transient state has no form of. No conflict.wiki/testing/async/transient-state-behind-a-controlled-gate.md. Back-link:async-testinggains a table row +related:;testing/index.mdasync section gains the row.related:one-way to diagnosing-flaky-tests, tests-that-cannot-fail, narration-based-ordering-assertions, proving-a-critical-section-is-lock-protected. Reciprocalrelated:on diagnosing-flaky-tests and tests-that-cannot-fail deliberately deferred: open PR #223 rewrites both pages'related:lines, and a second edit here would conflict on merge (see Open-PR check).testing-quality-surviving-mutant-equivalence-triageclassifies a survivor on code you own but has no row for "reported inside a passing review";qa-process-evaluating-review-feedbackis the page for "findings arrived, decide what to implement" and already carries the partial-context mechanism.qa-process-fresh-context-code-reviewstep 4 ("return only the verdict") is not a conflict — it concerns what flows back into the producing session's next round, while this candidate reads the reviewer's own report body.evaluating-review-feedback(trigger sentence, edge row, instead-of row, 2 sources + local reading + field evidence,related:+surviving-mutant-equivalence-triage +fresh-context-code-review) and a reciprocal edge row + field evidence +related:onsurviving-mutant-equivalence-triage;qa/index.mdload-when widened.Conflicts flagged: none.
Open-PR check
gh pr list --repo choiyounggi/dev-loop --state open --search "head:knowledge/"→ two open heads: #223knowledge/choiyounggi-20260927-220735and #225knowledge/choiyounggi-20260928-082803. Both fetched;git diff --name-only origin/main origin/<head> -- wiki/read for each, plus the full diff hunks on the pages nearest to each candidate.wiki/testing/flaky/diagnosing-flaky-tests.md(+row: when the test holds the finisher's JoinHandle, await it between write and read to force the bad interleaving red, before the write for green; +edge row on stress-loop reproduction rates; +tokio JoinHandle source),wiki/testing/mocking/fake-server-forward-before-reply.md(new),tests-that-cannot-fail.md+captured-call-arguments.md(related:only)wiki/testing/quality/alias-table-contract-tests.md,wiki/testing/mocking/fake-intersection-observer-for-viewport-animations.md(new),wiki/testing/index.md(rows in quality/mocking)Merge-conflict note for the owner: this PR and #223 both add a row to
wiki/testing/index.md(different sections) and #223 also toucheswiki/qa/index.mdon a different line;diagnosing-flaky-tests.mdandtests-that-cannot-fail.mdwere left untouched here for that reason.Routing decision
testing-async-transient-state-behind-a-controlled-gateasynccategory's charter;flakyis for a test that is already intermittent, and this page is the design that keeps it from becoming one. No new category.qa-process-evaluating-review-feedback; reciprocal row ontesting-quality-surviving-mutant-equivalence-triageLocal-layer candidates
All 26
plan-gaps.jsonlrows are wiki-plan Phase B decisions of the form "Planning tN: deciding X (no owning wiki page)" whose directives name one repository's own files, symbols, values, or route tables (KotlinLinklyTextStyle/LinklyColoralias tables,ScreenContainer.kt,dispatch.rs :520-537,mock-source.ts:445,chat.cssselectors). They fail the layer test (wiki-ingest step 3: would be wrong in another codebase) and are excluded from this PR; runwiki-ingestinside the named project to file them. Disposition recorded on each retired row:dropped: project-specific plan-gap.~/Desktop/workspace/linkly-calendar/dace)wiki-local/frontend/design-system/legacy-token-grep-to-zero-set.mdwiki-local/frontend/design-system/alias-to-role-rename-mapping.mdwiki-local/frontend/design-system/approot-legacy-reference-rename.mdwiki-local/frontend/design-system/floating-tab-dock-geometry.mdwiki-local/frontend/design-system/tab-item-pill-styling.mdwiki-local/frontend/design-system/tab-hosted-screen-bottom-inset.mdwiki-local/frontend/design-system/chat-composer-bottom-inset.mdwiki-local/frontend/design-system/main-tab-scaffold-overlay-dock.mdwiki-local/frontend/design-system/chat-bubble-v2-shape.mdwiki-local/frontend/design-system/chat-bubble-partner-avatar.mdwiki-local/frontend/design-system/chat-bubble-timestamp-style.mdwiki-local/frontend/design-system/couple-invite-avatar-initial.mdwiki-local/frontend/design-system/couple-avatar-header-visibility.mdwiki-local/frontend/design-system/couple-together-days-calculator.mdwiki-local/frontend/design-system/couple-avatar-day-header.mdwiki-local/frontend/design-system/photos-screen-token-migration-scope.mdwiki-local/frontend/design-system/chat-image-viewer-scrim-tokens.mdwiki-local/frontend/design-system/chat-banner-center-carve-out.md~/Desktop/workspace/linkly-crew/handfish)wiki-local/backend/lead-judge/artifact-name-dedup-across-dod-and-expected.mdwiki-local/backend/lead-judge/role-cwd-resolved-once-in-on-envelope.mdwiki-local/backend/lead-judge/sync-std-fs-in-judge.mdwiki-local/backend/lead-judge/symlink-and-fifo-fixtures.mdwiki-local/frontend/chat/developer-mode-raw-json-switch.mdwiki-local/frontend/chat/mock-source-showcase-scenario.mdwiki-local/frontend/chat/chat-css-ownership-blocks.mdTwo rows in this set are near-general and were still excluded:
0f78e800933d2aaa(UnixListener::bind rejected because the fixture path exceeds macOS's 104-bytesun_path) is already covered by the bundledplatforms-filesystems-unix-domain-socket-path-length;1a92fa259582f25b(decline an optional settings surface the brief leaves open) is a product-scope call whose reasoning is the brief's, not a reusable trigger.