diff --git a/.dev-loop/INGEST_REPORT.md b/.dev-loop/INGEST_REPORT.md
index 3a965e5..a899890 100644
--- a/.dev-loop/INGEST_REPORT.md
+++ b/.dev-loop/INGEST_REPORT.md
@@ -1,237 +1,88 @@
-# Knowledge flush — 13 insight(s) ingested (21 claimed, 2 dropped, 6 released)
+# Knowledge flush — 3 insight(s)
-Cross-Check: 1× independent adversarial `claude` CLI headless pass over the 5 new pages — it refuted the changed-files gate page's "prettier exits 0 on an empty match set" claim; re-measured against Prettier 3.7.4, confirmed the reviewer was right (unmatched operand exits **2**), and rewrote the page, report rows 3/5 and `log.md`. Other 5 claim groups verdicted sound. Limits: the reviewer's sandbox blocked repo reads, so source-quote-supports-directive and self-contradiction dimensions went unaudited (details in `## Cross-Check`).
+3 claimed candidates → 2 distinct insights: 1 new page, 1 merge into an existing page (2 duplicate candidates folded into it), 0 drops.
-Queue drained under run id `20260827-125731-38371` (this session is the detached
-`hooks/auto-flush.sh` run; its step-0 acquire resolved re-entrantly to
-`already-owned`, not to a competing holder). 21 rows were claimed; 13 are
-ingested below, 2 are retired as out-of-layer, and 6 are released back to
-`pending` for a later flush because each needs its own page rather than a row,
-and rushing six more pages in one pass would have lowered the bar on all of them.
+| Queue id | Insight | Outcome |
+|----------|---------|---------|
+| `8c0693fbeb1dca30` | Greedy regex merges adjacent tokens in extractor fixtures | New page `testing-data-adjacent-tokens-in-extractor-fixtures` |
+| `fe22774ea41d523f` | Subagent 429 on a model-scoped (Fable) limit → per-invocation `model` override | Merged into `infrastructure-agent-orchestration-usage-limit-paused-workers` |
+| `2f27db59be18d9c2` | Same insight as `fe22774ea41d523f`, from a second session | Duplicate within this batch; used as the second field observation on that merge |
## Verified best-practice
-Every external claim below was live-fetched this session and quoted in the page's
-`Sources` block. Field evidence carries the repo, date, and the measured numbers.
-
-| # | Claim | Sources checked | How verified | Confidence |
-|---|-------|-----------------|--------------|------------|
-| 1 | `now()` is `transaction_timestamp()` (fixed at transaction start) while `clock_timestamp()` "changes even within a single SQL statement"; `RETURNING` yields computed defaults "without needing a separate database query" | postgresql.org `functions-datetime`, `dml-returning`, `transaction-iso` | Fetched; both key sentences quoted verbatim into the page | verified |
-| 2 | A boundary recomputed in a follow-up step is a *second, later* `now`, widening a `<= boundary` set | Field: `rtb-unified` `packages/orpc/src/routers/batch.ts` — codifies "one `now` per decision" and passes `now` into the boundary helper; its result type omits the boundary, which is the shape that invites recomputation | Read the invariant and the signature in the cited file | field-tested |
-| 3 | **[CORRECTED BY CROSS-CHECK]** The vacuous-pass shapes for `prettier --check` are: no operands (rc **0**), all operands ignore-filtered (rc **0**), and unsupported extensions with `--ignore-unknown` (rc **0**). A pattern/operand matching nothing exits **2** — it prints the success sentence *and* an unmatched-pattern error | prettier.io CLI + ignore docs; local measurement, Prettier 3.7.4 | The first draft generalised "empty match set ⇒ exit 0" from a field log where both messages appeared together. The independent reviewer flagged it; I then ran all seven cases against a real binary and rewrote the page around the measured table | verified (re-measured) |
-| 4 | zsh does not word-split unquoted parameter expansions by default, so `cmd $FILES` arrives as **one** operand | zsh FAQ ch. 3 (`SH_WORD_SPLIT`) | Fetched; quoted ("By default, zsh does not have that behaviour: the variable remains intact") | verified |
-| 5 | The zsh word-split operand exits **2**, but its log still carries the success sentence — so the log misleads even though the exit code does not | Field 2026-08-24 (`rtb-unified`, zsh) + local measurement 2026-08-27 | Field log showed both messages together; the local run reproduced it as `rc=2`. The page now says explicitly that this row fails loudly *unless* `--no-error-on-unmatched-pattern` is set. Probe placement re-confirmed: `.claude/tmp/` is `.gitignore`d, so a probe there passes at rc 0 | verified (re-measured) |
-| 6 | TypeScript applies excess-property/contextual typing to fresh object literals, so a value of a type can be constructed with the type's name absent from the text | typescriptlang.org handbook, *Object Types* | Fetched; confirmed the check follows from the contextual type, not from a written annotation | verified |
-| 7 | `tsc`'s program is `files` ∪ `include` ∪ transitive imports; `exclude` "only changes which files are included as a result of the `include` setting" and does not stop an imported file entering the program | typescriptlang.org TSConfig `#include`, `#exclude` | Fetched; the `exclude` sentence quoted (it sharpens the rule to "in the program", not "in `include`") | verified |
-| 8 | Consequence of 6+7 measured | Field 2026-08-24/25 (`rtb-unified`): `grep "DealViewer"` reported 3 construction sites, actual 8 — the missed set included production wiring `routers/deal.ts:38`; `ContractScopeActor` 7→~22. Separately, `packages/orpc/tsconfig.json` `include: ["src/**/*"]` produced 3 production + 13 api-test errors and **zero** for `__tests__/routers/deal.test.ts`, whose 6 sites appeared only as 6 failing tests | Counts recorded from the cited runs | verified |
-| 9 | cgroup v2: `memory.peak` is max usage since creation/reset; at `memory.max` "the OOM killer is invoked in the cgroup"; in `memory.events`, `max` counts times usage "was about to go over the max boundary" — **distinct** from `oom_kill` | docs.kernel.org cgroup-v2 admin guide | Fetched; all four quoted. This corrected the candidate, which had read a non-zero `max` as a kill; the page now states the distinction explicitly | verified |
-| 10 | An `exec`'d process joins the container's cgroup and is invisible to the application's own semaphore | kubernetes.io `manage-resources-containers`, `assign-memory-resource`, `kubectl exec` reference + field 2026-08-26 (review-bot pod, `limits.memory: 3Gi`): `memory.current` 2.54 GiB, `memory.peak` 3.0 GiB (at the limit), `memory.events: max 5`, while `maxConcurrentAgents: 20` reported free slots | Docs fetched; pod numbers from the cited measurement | verified |
-| 11 | Basename-keyed mutation backups collide across directories and restore cross-writes; an untracked file's `git diff` is empty whether restored or destroyed | Field 2026-08-21 (`rtb-unified`, NEWRTB-2936): restore wrote `schemas/deal.ts` into `routers/deal.ts` → `Cannot find module './common.js'`, `grep -c dealRouter` = 0; **both files were 154 lines**, so a line-count check passed; after re-keying, M9/M10 flipped SURVIVED→KILLED. Plus stryker mutant-states / pitest for the verdict vocabulary | Reproduced end to end in the cited run | field-tested |
-| 12 | A negative assertion is vacuous when the fixture never supplies the triggering input | Field 2026-08-25 (`rtb-unified`): with `staleQueuedJobIds: []` the code early-returned; the widening the assertion claimed to catch survived 116/116 green | Mutation applied and observed | field-tested |
-| 13 | A body-level (non-inline) review finding cites no file, so rebutting from an assumed file rejects real defects | Field 2026-08-19 (PR #327 r16): quote matched `report.py:393/416/425`, not the assumed `fill_plan.py:307` — sibling modules, one already fixed | Grep resolved the quote to the real site | field-tested |
-| 14 | Unifying two duplicate allowlists defaults to the union and silently widens each side | Field 2026-08-25 (`rtb-unified` PR #965): folding `DISPLAYABLE_ERROR_CODES` into `USER_FACING_ERROR_CODES` would have added `UNAUTHORIZED` + `VALIDATION_ERROR`, exposing raw server messages as inline UI errors; caught only by computing the difference first | Difference computed before the merge | field-tested |
-
-Not upgraded: nothing was marked `verified` on field evidence alone. Two pages
-carry `confidence: field-tested` (`mutation-harness-file-custody`,
-plus the pre-existing `evaluating-review-feedback`), and no candidate was
-recorded as `verified` without a fetched primary source.
+**1. Adjacent tokens in fixture text for a greedy pattern extractor** (`8c0693fbeb1dca30`) — `confidence: verified`
+
+- Claim: a regex whose repeated character class admits separators (`\d[\d\s.\-()]{6,18}\d`) greedily merges two occurrences separated only by class-member characters into one span capped at the repeat's maximum, whose digits match neither original. So the test should assert the extractor's own spans first, and per-occurrence fixtures should use a separator outside the class.
+- Sources checked:
+ - https://docs.python.org/3/library/re.html — "The '*', '+', and '?' quantifiers are all greedy; they match as much text as possible"; `re.finditer` returns non-overlapping matches, scanned left-to-right.
+ - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Quantifier — "Quantifiers are greedy by default … until the maximum is reached"; lazy `?` matches as few times as possible.
+- How verified: reproduced with CPython `re` this session.
+ - `"- 1900068889\n- 1900068889"` → one match `'1900068889\n- 1900068'` (20 chars = 1 + 18 + 1).
+ - Pipe-separated → two clean matches.
+ - Real-shaped footer `"090 123 4567 028 3822 1234"` → one merged match.
+ - Also reproduced and added as edge cases:
+ - Unbounded `+` merges both numbers (20 digits).
+ - Lazy `{6,18}?` truncates `090 123 4567` to `090 123 4`, and pipe-separated `1900068889` to `19000688`.
+- The session's field evidence (independent test-quality auditor caught it; pipe-delimiting fixed it) matches the reproduction.
+
+**2. Subagent failing on a model-scoped limit → per-invocation model override** (`fe22774ea41d523f` + `2f27db59be18d9c2`) — mechanism `verified`; the Fable-specific 429 text is `field-tested`
+
+- Claim: when a subagent call fails at once with `rate_limit`/HTTP 429 naming one model (`claude-fable-5-1`), re-issue the identical call with `model: "sonnet"`. The subagent definition's model is independent of the session's model, and the limit is scoped to that model.
+- Sources checked:
+ - https://code.claude.com/docs/en/sub-agents#choose-a-model (raw `.md` fetched). Resolution order: "1. The per-invocation `model` parameter 2. The subagent definition's `model` frontmatter 3. `CLAUDE_CODE_SUBAGENT_MODEL` 4. The main conversation's model". Before v2.1.251 the env var ranked first.
+ - https://code.claude.com/docs/en/errors (raw `.md` fetched): "The session and weekly limits are shared across all models … The Opus and Sonnet limits each apply only to requests to that model family, so switching to a model outside the family with `/model` keeps you working". Also the `Fable limit reached · continuing on Fable 5.1 uses usage credits … nothing was sent` message for unattended sessions.
+ - https://code.claude.com/docs/en/model-config#fable-and-usage-credits — Fable usage can bill to usage credits behind a consent prompt.
+ - Local check: dev-loop 1.21.0 `agents/test-quality-auditor.md` and `agents/integration-reviewer.md` both declare `model: fable`. That explains why only the subagent failed while the session kept working.
+- Honest gap: the docs do not print the exact `You've reached your Fable limit … model sent to the API` 429 text. That wording is cited only as a field observation (2 independent sessions on 2026-09-14, both of which succeeded after the override).
+- The page stays `verified` because its directive rests on the documented resolution order and model-family scoping.
## Existing-layer check
-Method: routed via `INDEX.md` → domain `index.md`; then built a full id+title
-index of all 265 pre-existing pages and probed it with concept greps
-(`clock_timestamp|clock skew`, `changed[- ]files|--ignore-unknown`, `tsconfig`,
-`contextual typ|excess property`, `set difference|allowlist`, `cgroup`,
-`basename|backup.*restore`, `2>&1`, `delta|baseline`) before deciding new vs merge.
-
-Pages read: testing-quality-source-text-wiring-assertions, testing-quality-tests-that-cannot-fail, backend-common-change-impact-call-site-enumeration, backend-common-change-impact-widening-a-closed-value-table, qa-process-evaluating-review-feedback, infrastructure-containers-host-cgroup-visibility, testing-quality-behavior-not-implementation
-
-Findings:
-
-- **Zero coverage** (→ new pages): changed-files-only gates, tsconfig/contextual
- typing, allowlist set-difference, app-clock-vs-DB-timestamp, exec-into-a-running-container.
- The concept greps returned no hits for these; the clock hits were incidental
- (offline sync, token handling) and none compared an app clock to a DB column.
-- **Already covered — one candidate all but retired.** The comment-stripping
- insight is `source-text-wiring-assertions` step 2 verbatim ("Make the
- assertion's subject the file with comments removed"), and its false-RED and
- negative/count false-GREEN shapes are already edge rows. Only the *empty-slice*
- consequence was new, so that alone was merged.
-- **Line-cap conflict handled without breaking the invariant.**
- `source-text-wiring-assertions` sits at exactly **120** body lines (the
- documented cap). Rather than add a row and violate maintenance invariant 5, the
- new nuance and the new field evidence were merged **in place** into an existing
- edge row and an existing source bullet. Body count re-measured after editing:
- still 120.
-- **No conflicts found.** Nothing ingested contradicts an existing directive.
- The one correction made was to a *candidate*, not to the wiki (item 9: the
- `memory.events` `max` counter is approaches-to-limit, not kills).
-- **Related links added both ways**: `tests-that-cannot-fail` ↔
- `mutation-harness-file-custody`; `widening-a-closed-value-table` ↔
- `compiler-as-call-site-inventory` (+ `errors-diagnostics-from-a-shared-code-path`);
- `host-cgroup-visibility` → `exec-added-processes-and-the-memory-budget`
- (from its existing self-monitoring row).
-- **Indexes/log updated**: 4 domain indexes (+5 "load when" rows), `log.md`
- appended. Root `INDEX.md` unchanged — no new domain.
-
-Gates run (the exact CI commands from `.github/workflows/test.yml`):
-`node scripts/wiki-structure-checks.js wiki` → **pages: 270, indexes: 13,
-findings: 0**; `node scripts/wiki-lint-prohibitions.js wiki` → **directives 72,
-compliant 72, violations 0** (the 1 `info` is pre-existing in
-`config/keys-ahead-of-their-consumer.md`, untouched); `bash scripts/check-versions.sh`
-→ `ok: dev-loop 1.11.2`. The `bats tests/` job was **not** run — bats is not
-installed on this machine, and this change touches only wiki markdown (no
-scripts or hooks), so that suite's subject is unchanged.
+Pages read: infrastructure-agent-orchestration-usage-limit-paused-workers, testing-quality-tests-that-cannot-fail, testing-data-test-data-and-isolation
+
+Also read: `INDEX.md`, `wiki/testing/index.md` (every quality/data/strategy load-when line), and the `agent-orchestration` rows of `wiki/infrastructure/index.md`. I also grepped `wiki/` for `greedy|regex|finditer|adjacent`, `rate.?limit|429`, and `model override|subagent.*model|fable`.
+
+- Insight 1: no existing page covers greedy-quantifier merging in test fixtures.
+ - Grep hits were about regex *gates*, not extraction fixtures: `source-text-wiring-assertions`, `completion-predicates`, `checks-that-cannot-pass`.
+ - → **created new**.
+ - Related links added both ways with `testing-data-test-data-and-isolation` (fixture construction) and `testing-quality-tests-that-cannot-fail` (a test green for the wrong reason).
+- Insight 2: `usage-limit-paused-workers` owns model-scoped limits and the `/model` switch → **merged**. Changes:
+ - New step 7 (subagent per-invocation override).
+ - 4 new edge-case rows: override rerun fails again; Fable consent in unattended sessions; `CLAUDE_CODE_SUBAGENT_MODEL` on CLI < v2.1.251; auditor model substitution + `availableModels`.
+ - 1 new Instead-of row, and 2 new sources plus a field observation.
+ - Index load-when extended.
+- **Drift corrected (not a contradiction):** the page said only the *Opus* limit is model-scoped. The current errors doc also lists `You've hit your Sonnet limit`, scoped to the Sonnet family. I updated the marker row, the "only one worker stopped" edge row, and the Instead-of "Why" cell, and bumped `last_verified` to 2026-09-14.
+- No conflicting directive found.
+
+Lint results on this branch:
+
+- `node scripts/wiki-structure-checks.js wiki` → `pages: 277, indexes: 13, findings: 0`.
+- `wiki-lint-prohibitions.js` → 2 violations. Both predate this PR and sit outside `wiki/` (`plans/harvest-dedupe-processed/...`, `tests/fixtures/prohibitions/bad.md`). Neither changed page is flagged.
+- `wiki-lint-model-era.js`:
+ - `usage-limit-paused-workers` is reported as `model-coupled, no verified_model`. It was already flagged that way on `main`, since the page mentions Claude/Opus and no wiki page carries `verified_model`.
+ - I tried `verified_model: claude-opus-5` (the model this flush ran on). The lint rejected it as "not in current set" because the script's `DEFAULT_CURRENT` is still `['opus-4', 'fable-5']`.
+ - I left the field off to match every other page, rather than picking a value just to pass. Refreshing `DEFAULT_CURRENT` is a separate owner decision.
## Open-PR check
-`gh pr list --repo choiyounggi/dev-loop --state open --search "head:knowledge/"`
-returned **no open PRs**, and a second unfiltered `gh pr list --state open`
-returned none either — the repository has zero open PRs at flush time. There
-were therefore no in-flight sibling branches to diff against, and no
-`git fetch origin
` / `git diff origin/main origin/ -- wiki/`
-comparisons to run.
+Listed open `knowledge/*` heads with `gh pr list --repo choiyounggi/dev-loop --state open --search "head:knowledge/"`: #190, #189, #188, #187, #186, #185, #183, #182, #181, #180, #179. For each, I diffed its own changes with `git diff origin/main...origin/ -- wiki/` and grepped the added lines for `greedy|finditer|adjacent|regex merge|model-scoped|Fable limit|subagent model|per-invocation`. No added lines matched.
-Per-candidate verdict: **all 21 = `new`.** No `fold`, no `drop-as-pending-duplicate`.
-(The 2 drops recorded below are out-of-layer drops, not pending-duplicate drops.)
+- Insight 1 (`8c0693fbeb1dca30`) — verdict **new**.
+ - No open head adds a regex/extractor-fixture page.
+ - The closest is #187's `backend/common/integrations/contact-details-from-scraped-pages.md`, which covers *where* to read phone numbers (`tel:` links, header/footer vs main content), not how a regex tokenizes adjacent numbers. That's a different trigger, so no overlap.
+- Insights 2/3 (`fe22774ea41d523f`, `2f27db59be18d9c2`) — verdict **new** (merge into the main-branch page).
+ - #180 touches `usage-limit-paused-workers.md`, but only its `related:` line (it adds `login-expiry-during-unattended-turns`). No content overlap.
+ - This PR leaves that `related:` line unchanged, so the two PRs should not conflict on that line.
+ - `2f27db59be18d9c2` duplicates `fe22774ea41d523f` within this batch, so it is folded into the same merge rather than dropped.
+- Merge-order note: #188, #181, and #179 also edit `testing/data/test-data-and-isolation.md`, and #188/#183 edit `tests-that-cannot-fail.md`. This PR only appends one id to each page's `related:` list, so any conflict is a one-line `related:` union.
## Routing decision
-**New pages (5)**
-
-| Page | Domain/category | From | Why not an existing page |
-|------|-----------------|------|--------------------------|
-| `application-clock-vs-database-timestamps` | databases / transactions | `2b27d15d` + `bea92fdd` | No page compares an app clock to a DB column. `transactions` chosen over `schema-design` because the decisive content is transaction-time semantics (`now()` = transaction start ⇒ stamp order ≠ commit order) and the fix is a lock/isolation choice |
-| `changed-files-only-gates` | infrastructure / ci-cd | `ff041061` + `4b9af3a0` | Zero grep hits. Both candidates are the same defect (a gate green with an empty subject) from two directions, so they became one page rather than two |
-| `compiler-as-call-site-inventory` | backend / common / change-impact | `702dcf4e` + `94d55f2f` | `call-site-enumeration` is the sibling case (callers of a changed signature, Python positional-vs-keyword) and is at 80 body lines; the TS mechanism is *constructors of a type* with its own workflow, so per "one case per page" it is a separate page, cross-linked |
-| `mutation-harness-file-custody` | testing / quality | `6a9de235` + `41fa1c87` | `harness-reverse-controls` covers scoring a harness; nothing covers the harness's custody of the tree. Both candidates are that one case (keying, and the read window) |
-| `exec-added-processes-and-the-memory-budget` | infrastructure / containers | `7b9e8788` | `host-cgroup-visibility` is cross-pod read mechanics and explicitly routes self-monitoring elsewhere; `resource-limits-and-probes` is manifest authoring. This is a runtime preflight before adding load |
-
-No new category was created — all five landed in existing categories.
-
-**Merged into existing pages (5 candidates)**
-
-| Candidate | Merged into | Shape |
-|-----------|-------------|-------|
-| `91ef5d53` | `testing-quality-tests-that-cannot-fail` | +1 never-fails row, +1 Instead-of row, +1 source |
-| `f189f423` | `testing-quality-source-text-wiring-assertions` | In-place extension of 1 edge row + 1 source bullet (page at the 120-line cap) |
-| `bb6d8539` | `backend-common-change-impact-widening-a-closed-value-table` | +Do-this 6 & 7 (incl. a set-difference ruling table), +1 Instead-of row, +1 source |
-| `60a817ee` | `qa-process-evaluating-review-feedback` | +2 edge rows, +1 Instead-of row, +1 source |
-| `7b9e8788` | `infrastructure-containers-host-cgroup-visibility` | Cross-link from its self-monitoring row to the new page |
-
-**Dropped — out of layer (2, retired)**
-
-- `094dedf3` — a Figma MCP `inspect_node` → `get_dev_ready` children-fetch
- workaround. The server is a private, org-internal MCP plugin; the behavior is
- not publicly verifiable and the directive does not transfer to any other reader.
-- `e165a365` — an `/rtb:review` remote-fallback runbook naming
- `~/.claude/tools/rtb-remote-review.sh` and an internal pod. The transferable
- kernel ("a two-provider review gate degraded to one provider is not a passed
- gate") is already the subject of `qa-process-llm-review-pipelines`; what remains
- is machine-specific paths.
-
-**Released back to `pending` (6)** — each needs its own page, not a row, and is
-better served by a dedicated pass than by being appended here:
-`81dc1f98` (naming the carrier field/type when a plan says "wire A to B"),
-`b9ae304a` (`VAR="$(cmd 2>&1)"` mixing stderr into a value used as a path),
-`fdd0b3c6` (monitor markers anchored at line start; delta rather than absolute
-state; first cycle records a baseline),
-`c2adb2be` (positional-order assertions on rendered SQL predicates),
-`815e8cb9` (grep only *active* `DATABASE_URL` assignments, and confirm which
-dotenv file the tool loads, before a destructive DB command),
-`f1146adb` (CI ticket-key extraction scoped by changed-file intersection rather
-than by mention).
-
-## Decision Log
-
-**Intent.** Drain the harvested `★ Insight` queue into reviewable wiki knowledge
-without lowering the wiki's evidence bar. The queue held 21 rows accumulated over
-several days; the goal was correct routing and real verification, not a high
-ingest count.
-
-**Alternatives considered and rejected.**
-
-- *Ingest all 21 in this pass.* Rejected: six of them each need their own page,
- and writing six more pages in one pass would have produced thin, weakly-sourced
- entries. They are released to `pending`, not dropped, so the next flush takes
- them with a full budget.
-- *Append the two TypeScript candidates to `call-site-enumeration`.* Rejected:
- that page is the sibling case (callers of a changed signature, Python
- positional-vs-keyword). AGENTS.md requires one case per page, so the
- constructor-enumeration case became its own page, cross-linked both ways.
-- *Add a row to `source-text-wiring-assertions` for the empty-slice nuance.*
- Rejected: that page is at exactly the documented 120-line body cap, so adding a
- line would violate maintenance invariant 5. The nuance was merged **in place**
- into an existing edge row instead; body re-measured at 120.
-- *Drop the comment-stripping candidate entirely as a duplicate.* Rejected: its
- directive is already the page's step 2, but the empty-slice consequence
- (vacuous **green**, not the documented noisy red) was genuinely absent.
-- *Claim a cross-check exemption because this PR cannot merge itself.* Rejected —
- see below; the check found a real error, which is the argument against exempting.
-- *Push to `origin`* as the skill's snippet does. Not available: this contributor
- has no write access to `choiyounggi/dev-loop` (403). Used the pre-existing
- `fork` remote, which is how every prior knowledge branch here was published.
-- *Branch name from `git config user.name`.* The skill's ASCII sanitisation of a
- Korean name yields an empty string → `anon`, defeating the attribution the
- branch name exists for. Used the gh login, matching existing branch names.
-
-**Where reviewers should look hardest.**
-
-1. `infrastructure/ci-cd/changed-files-only-gates.md` — rewritten after the
- cross-check. The measured table is the load-bearing part; please sanity-check
- it against your own Prettier version, since the exit codes are version-visible
- behaviour rather than a documented contract.
-2. `databases/transactions/application-clock-vs-database-timestamps.md` step 5–6 —
- the claim that timestamp order is not commit order, and that the remedy is a
- lock/isolation level rather than finer clock resolution. `[추정]` on the MySQL
- `NOW()`/`SYSDATE()` row: taken from general MySQL semantics, not fetched this
- session like the PostgreSQL pages were.
-3. `widening-a-closed-value-table.md` Do-this 6–7 — this inserts a security-shaped
- concern (allowlist widening) into a page whose original subject was value
- tables. If that reads as two cases, it should be split.
-4. The 2 dropped candidates — if you consider private-tooling runbooks in scope
- for this wiki, they should be restored rather than retired.
-
-## Cross-Check
-
-Independent adversarial pass via `claude` CLI headless (separate process, no
-shared context), prompted to refute rather than confirm, over the five new pages'
-technical claims.
-
-**It found a real error, and the page was rewritten because of it.** The reviewer
-challenged the claim that `prettier --check` exits 0 on an empty match set,
-arguing an unmatched pattern errors by default and that exit-0 belongs to the
-ignore-filtered case. I resolved it by measurement rather than by argument —
-running all seven cases against Prettier 3.7.4 — and the reviewer was right:
-an unmatched operand exits **2** (while still printing the success sentence),
-whereas the genuine silent vacuous passes are no-operands, all-ignore-filtered,
-and `--ignore-unknown`-with-unsupported-extensions. The page, this report's
-rows 3 and 5, and the `log.md` entry were all corrected.
-
-Verdicts on the other five claim groups: **sound** (PostgreSQL clock semantics —
-noted as if anything *understated*; zsh word-splitting; TS contextual typing;
-`tsc` program membership incl. `exclude`-does-not-stop-imports; cgroup v2
-`max` vs `oom_kill` and `kubectl exec` cgroup placement).
-
-Stated limits of the check: the reviewer's sandbox denied it read access to
-`~/.dev-loop/repo/wiki`, so it adjudicated the six claims as quoted in its prompt
-and could **not** audit (b) whether each `Sources` quote supports the directive it
-is cited for, or (c) whether any page contradicts its own edge-case rows. Those
-two dimensions remain unreviewed by an independent party and are the residual
-risk in this PR. A first attempt also returned only the session's Stop-hook
-output rather than a verdict; that run was discarded rather than read as
-"no findings".
-
-## Review notes
-
-- PR-only, as required: no merge, no push to `main`.
-- Commit is under the contributor's own ambient git identity
- (`최영기 `, gh `dch0202-rsquare`); no assistant identity
- and no `Co-Authored-By` trailer. The branch uses the gh login because
- sanitizing the Korean `user.name` to ASCII yields an empty string, which the
- skill's snippet would have turned into `anon` — that would have defeated the
- attribution the branch name exists for.
-- Scope purity: only `wiki/**`, four domain indexes, `log.md`, and this report.
- Two untracked leftovers from earlier flushes
- (`.dev-loop/CROSSCHECK_FINDINGS.md`, `.dev-loop/fold-note-73.md`) were left
- untouched and unstaged.
+- Insight 1 → `testing` / `data` / new page `wiki/testing/data/adjacent-tokens-in-extractor-fixtures.md`.
+ - The lesson is about *constructing fixture input* so each synthetic occurrence stays a distinct token. That is the `data` category ("tests need fixture data and you are choosing how to create it").
+ - `quality` was the runner-up (a test that passes for the wrong reason). It is linked through `related:` instead, because the directive acts on the fixture, not the assertion strategy.
+ - No new category needed.
+- Insights 2/3 → `infrastructure` / `agent-orchestration` / existing page `wiki/infrastructure/agent-orchestration/usage-limit-paused-workers.md`.
+ - That page already owns "which usage limit was hit decides the move", and a subagent is an orchestrated worker billed to the same seat.
+ - `platforms/processes` was rejected: the fix is a model-routing decision inside the orchestrator, not an OS/CLI invocation difference.
+ - No new category needed.
diff --git a/log.md b/log.md
index e2ee9ca..fd33ffa 100644
--- a/log.md
+++ b/log.md
@@ -104,3 +104,5 @@ Append-only. Format: `## [YYYY-MM-DD] ` | Wait until the stated time — the window is shared across all models, so switching models does not restore access |
| `You've hit your weekly limit · resets ` | Wait until the stated day and time; the same model-independence applies |
-| `You've hit your Opus limit · resets