Skip to content

Commit 3cd71eb

Browse files
stroland02claude
andcommitted
docs: record B52 landed and finished by hand, queue B55
The hold-back scope clause verified well, and the record worth keeping is that it was probed in both directions: a clause that refuses everything would have passed a test written only against the case it must refuse. Disabling the refusal and dropping the path out of the scope identity each fail a different test, so both the refusal and its bound are covered. B52's worker did not land this. It went silent for 53 minutes and its tree was reset onto a stale main, orphaning 300 insertions reachable from no branch. Preserved as unreviewed/b52-hold-back-scope and finished here. Both habits that would have prevented it are now written down beside the entry. B55 is the last of B51's leave-behinds, reproduced with a control before being queued, and its design decision is recorded rather than left to the worker: the plugin protocol does not widen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 0dfd09f commit 3cd71eb

1 file changed

Lines changed: 46 additions & 35 deletions

File tree

docs/superpowers/BACKLOG.md

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,32 @@ item that cannot say what evidence closes it is not ready to dispatch.
1212

1313
## Ready
1414

15-
### B52 — The hold_back selection rule can pick a site the binder is unable to hold back
16-
17-
B50 measured this rather than reasoning about it. `scripts/build_corpus_specs.py` chooses a
18-
same-operation site to hold back so precision has a candidate it can fail on. It carries no clause
19-
stopping it from choosing a site that shares an enclosing scope *and* a result name with a site it
20-
still targets. When it does, `_response_fields` credits the guard's field read to both assignments —
21-
the binder cannot tell which assignment produced the value being read, because that is data flow and
22-
tree-sitter does not do data flow — so the held-back site is genuinely dependent and the label
23-
calling it a negative is false.
24-
25-
Measured on `furever` `PostPaymentIntents-response`:
26-
`app/api/setup_accounts/create_charges/route.ts` declares `let paymentIntent;` at line 78 and
27-
assigns it from `stripe.paymentIntents.create` at both 104 and 154. Holding back 104 while targeting
28-
154 gave precision 0.9615 at n=26 — one false positive, and the false thing was the label.
29-
30-
**The binder's behaviour here is correct and is not what needs changing.** Crediting both
31-
assignments is the conservative direction, which is the right direction for a tool whose failure
32-
mode is a missed break. A worker who reads this as a binder defect and tries to make the binder
33-
answer a data-flow question has misread it.
34-
35-
`turbo` is the contrast that makes the rule legible rather than arbitrary: its two sites sit in
36-
different files (`arnsPurchaseQuote.ts:223` held back, `topUp.ts:299` targeted), so no scope is
37-
shared, no cross-crediting happens, and the `hold_back` is sound. It was adopted; `furever` was
38-
declined.
39-
40-
Until the clause exists, a fresh generation proposes the unsound `hold_back` again and the committed
41-
corpus stays a deliberate superset of what the rule proposes rather than equal to it.
42-
43-
**Closes when:** the selection rule refuses a `hold_back` whose site shares an enclosing scope and
44-
result name with a targeted site on the same operation, a fresh generation stops proposing `furever`
45-
`PostPaymentIntents-response`, and all four gate figures are unchanged by the rule change.
15+
### B55 — Adapter selection declines a repository silently where intake explains itself
16+
17+
Two paths read the same customer manifest and one of them says nothing. Measured with a control on
18+
a UTF-16 `requirements.txt`:
19+
20+
plain UTF-8 (control) PythonAdapter.matches() True intake reason: (none)
21+
UTF-16, undecodable PythonAdapter.matches() False intake reason: names the file and the byte
22+
23+
`src/sync/cli.py:203` is the whole of it — `if adapter.matches(repo):`. So "this repository does not
24+
use the SDK" and "we could not read the file that would have told us" are the same observable, and
25+
only one of them is a defect in the customer's repository rather than in ours. Adapter selection is
26+
the gate every later stage sits behind, so a silent decline costs the index, the finding and the
27+
remediation with no record of why.
28+
29+
B51 ranked this first among its leave-behinds on the grounds that a crash gets fixed, an accurate
30+
reason is actionable, and a wrong answer with no reason is the one nobody finds.
31+
32+
**The design is decided rather than left open:** report at the selection site using the reason
33+
`intake.read_declared_dependencies` already computes. `LanguageAdapter.matches` is a published
34+
plugin protocol asserted on by `src/sync/core/conformance.py:394`, and the `unverifiable_reason`
35+
precedent (`python_lang.py:150`, read in `remediate/nodes.py:143`) is a *static* attribute for a
36+
general limitation, so overloading it with a per-repository fact would give one name two meanings.
37+
38+
**Closes when:** an unreadable manifest is distinguishable from a clean manifest declaring nothing,
39+
with a control proving a legitimate silent decline stays silent, `LanguageAdapter` and the
40+
conformance kit unchanged, and four gates green.
4641

4742
### B54 — A UTF-8 byte-order mark makes four manifest readers answer wrongly
4843

@@ -100,11 +95,8 @@ recorded with which change broke it.
10095

10196
## In flight
10297

103-
- **B52**`task_15860306d7c7`, worktree `sync-solo-a`. Its commit `34789db` leaves the suite
104-
red: `hold_back` gained a required `root: Path` and five two-argument callers in
105-
`tests/test_corpus_hold_back.py` were not updated. Reproduced at clean `34789db` in a throwaway
106-
branch — `5 failed, 10 passed`. Sent back to fix before it lands.
10798
- **B54**`task_1ea8ea5094a0`, worktree `sync-solo-b`.
99+
- **B55**`task_e03a2a5bb93f`, worktree `sync-solo-a`.
108100

109101
**Briefs go in a file now, not in the dispatch spec.** Long message bodies are being truncated in
110102
delivery — three briefs today, and B52 received a correction paragraph while the four numbered
@@ -645,3 +637,22 @@ is what a reviewer needs and duplicating it here would let the two copies drift.
645637
`typescript.py:200`, so it genuinely enters the arm rather than passing beside it.
646638

647639
Left behind and now B54: a BOM'd manifest, which decodes fine and defeats four readers instead.
640+
641+
- Refuse a hold-back whose site shares a scope and a result name with a target. Landed `9812313`,
642+
with the five callers `hold_back`'s new required `root` broke fixed at `0dfd09f`. A fresh
643+
generation now leaves `furever-PostPaymentIntents-response` without the unsound hold_back, which
644+
was the deliverable, and the four figures are unchanged: precision 1.0000 n=26, recall 1.0000
645+
n=26, falsifiable negatives 7, pairs scored 17, `Every floor cleared.`
646+
647+
Probed in both directions, because a clause that refuses everything is as wrong as one that
648+
refuses nothing. Disabling the refusal fails `test_a_site_sharing_a_scope_and_a_name_with_a_target_is_refused`;
649+
dropping the path out of the scope identity — so two files holding the same text compare equal —
650+
fails `test_sites_in_different_files_are_still_held_back`, which is the case the docstring argues
651+
for. Regenerating the whole set changes one other file, and only its hand-written commentary:
652+
zero non-comment lines, `hold_back` key intact.
653+
654+
**The worker did not land this itself.** It went silent for 53 minutes across two messages, and
655+
something reset its tree onto a stale main and orphaned `34789db` — 300 insertions reachable from
656+
no branch. Caught within a minute and preserved as `unreviewed/b52-hold-back-scope`, then
657+
finished here. Two habits earned from that: stage by explicit path, and run
658+
`git log --oneline main..HEAD` before any `git reset --hard`.

0 commit comments

Comments
 (0)