3.6 KiB
id, title, parent, depends_on, created, claimed_by, claimed_at, blocked
| id | title | parent | depends_on | created | claimed_by | claimed_at | blocked | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| T01.g | Adversarial review of the whole published surface | T01 |
|
2026-09-16 | null | null | false |
Description
An adversarial pass over the whole published surface — every symbol exported from packages/polyfill/src/index.ts, not only the ones this batch touched — trying to refute the parent task's success criterion: every published symbol either mirrors an SDK symbol in name, parameters and return, or carries a justified annotation.
Method, in this order. For each published symbol ask the two questions of .project/rules/nextgraph/no-divergence-from-nextgraph.md in their stated order: does the target do this? first, verified in nextgraph-rs or stated by its author; would an application have to unlearn it? second, and only to rank severity — never to authorise a divergence. Then, for the name and the shape (.project/rules/nextgraph/surface-mirrors-the-sdk.md): is this the target's own name, does the verb belong to something else upstream, is the parameter passed through or translated, is the return the SDK's.
Check every @provenance line against the CLAIM, not just against the tree. Same granularity on both sides: a function may cite a function; a composition, a pipeline or a policy cites nothing at level 2 and must say so. "The reference resolves" is not "the annotation is true" — that is precisely how readUnion survived. Use the mechanism as T01.a left it, including whatever the new kind for an announced-but-unwritten target requires as evidence.
Known, and not findings. The three open bug_ leaves in .project/concepts/app-contract/: bug_useshape-live-read-needs-a-newer-broker (MAJOR), bug_a-lost-inbox-watch-is-never-retried (MAJOR), bug_an-empty-inbox-list-can-mean-a-failure. Do not re-report them as new. Do report it if a change in this batch altered their status, or invalidated a workaround they or the contract publish — the useShape bug leaf and the contract's ## Non-guarantees both name watchShape and readUnion as the unaffected paths, and both were changed here.
Check the contract as delivered, since three children edited it in sequence: ## Surface matches the actual exports symbol for symbol; ## Change policy records a version whose bump level follows the contract's own rules for what actually changed; no section was half-edited or edited twice for the same change; nothing published is left described by a sentence that is no longer true.
Findings are leads, not mandates, and this child fixes nothing. A finding without a reproducible failure scenario or a checkable citation does not count. Report symptom, precise location (file:line, the failing assertion, the offending extract) and, where it is already known, the cause — but do not instrument, bisect or repair. Each fix is a new task.
Deliverable. In ## Result: findings by severity (blocking / major / minor), atomic, numbered 1.1, 1.2, … so they can be answered precisely. Neutral tone, no first or second person. One line of verdict on the test suites, not a list of what passes.
Pass condition for this child (it writes no code): run bun test, bunx tsc --noEmit -p packages/polyfill/tsconfig.json, bunx tsc --noEmit -p packages/polyfill/e2e/tsconfig.json and python3 ~/.claude/skills/concept/lint.py to establish the delivered state and report it verbatim; the review covers every symbol exported from packages/polyfill/src/index.ts, with the ones found clean stated as a count rather than an inventory.