Skip to content

feat(ide): a skipped live lookup offers the stubbing affordance instead of a dead end (BACKLOG #236) - #605

Merged
wshallwshall merged 10 commits into
mainfrom
claude/builder-2-236-lookup-affordance
Aug 26, 2026
Merged

feat(ide): a skipped live lookup offers the stubbing affordance instead of a dead end (BACKLOG #236)#605
wshallwshall merged 10 commits into
mainfrom
claude/builder-2-236-lookup-affordance

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

A skipped db_lookup/fhir_lookup rendered "live lookup - not evaluated in preview" and stopped
there. ADR 0010:62 already names the supported preview path -- stub the call's wrapper -- so the
row's tooltip now says that instead of dead-ending. Nothing is mocked; the owner declined engine
mocking and ADR 0010's determinism decision is untouched.

Also fixed and disclosed: mergeLiveValues dropped the annotation's kind, so a skipped lookup
inherited the live-value tooltip "Live value (redacted by default)." It is not a value and nothing
was redacted.

Cherry-picked from 2fb552634 (Builder2's original commit) onto current main, isolating it from
an unrelated commit (#1211, already on PR #594) that shared the same base. Cross-checked against
an independent rebase --onto of the same isolation done separately -- both produced the identical
tree (a3de7e717956...), confirming the isolation is correct via two different methods.

Verified: npm run typecheck clean; npm run test:unit 627 passing, 0 failing, including the new
BACKLOG #236 suite by name (not just the rising total); 5 mutants, each killed by a distinct red
set; diff confirmed as exactly ide/src/stepsModel.ts, ide/src/liveDebug.ts,
ide/src/test/suite/steps.test.ts, +158/-2.

Built by Builder2, isolated and opened by Lander.

🤖 Generated with Claude Code

wshallwshall and others added 2 commits August 25, 2026 18:24
…ad of a dead end (BACKLOG #236)

The Steps view already surfaced a skipped `db_lookup`/`fhir_lookup` -- it rendered "live
lookup - not evaluated in preview" on the row. That tells an author what did NOT happen
and nothing about what to do, which is a dead end at exactly the moment they need a next
step.

ADR 0010 already specifies the next step, at :62: "a feed that uses it is previewed by
stubbing its wrapper". The row's tooltip now names that mechanism. Nothing is mocked, no
engine file changes, and the tracer's behaviour is untouched.

THE ROW'S STATED HARD PART IS FALSE AND THIS DEPENDS ON THAT. #236 says lookup rows "do
real I/O", so pin/mock "must be the default for lookup rows". They do not do I/O in a
dry-run -- they RAISE. `classify_live_lookup` (dryrun_trace.py:281, called at :400)
annotates the handler line and re-raises, so the disposition stays byte-identical. Because
the failure is already structured and already reaches the IDE, the affordance is a tooltip
rather than an engine feature.

SCOPE, as ruled: the IDE affordance only. Engine mocking was declined by the owner, so ADR
0010's determinism decision stands untouched. The CLI stop condition is NOT in this item --
it is a separate unfiled row, and `dryrun_trace.py` is a sys.settrace OBSERVER, so stopping
a handler mid-execution would change the execution semantics of the thing being observed.
Nothing here goes near it.

ALSO FIXED, BEYOND THE ITEM'S WORDING, AND DISCLOSED RATHER THAN FOLDED IN. `mergeLiveValues`
folded each annotation's TEXT onto the row and dropped its `kind`, so a skipped-lookup row
rendered inside the live-value span and inherited its tooltip: "Live value (redacted by
default - synthetic samples only)". It is not a value and nothing was redacted -- an author
hovering a skipped lookup was told the opposite of what happened. The kind now travels with
the text. This is adjacent to the item rather than outside it: the affordance cannot be
offered without knowing which annotation the row holds, so the mislabel and the feature are
the same defect seen from two sides.

The inline text keeps its existing warning glyph, which belongs to BACKLOG #1265's
migration; the text added here carries none, and a test pins that.

Verified: `npm run typecheck` clean; `npm run test:unit` 627 passing, 0 failing. 10 new
tests, confirmed present in the run output by name rather than inferred from the total.
Five mutants, all killed, each by a DISTINCT red set: drop the kind in `mergeLiveValues`;
always render the value tooltip; let a value beat a warning in a mixed row; strip the
mechanism from the tip; put a redaction claim back in it. Every mutant asserted a unique
anchor, a changed file hash, and an unchanged NUL count -- `ide/src/stepsModel.ts` carries
three deliberate NULs under `control_char_check.py`'s `NUL_IS_CONTENT_UNDER` allowance, and
a mutation that disturbed them would be a different change wearing this one's clothes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…605), the feature is not

Records that PR #605 fixed the specific dead-end the Filed paragraph called out in passing (a
skipped lookup's tooltip pointing nowhere useful) but built none of what the item's title and
re-score describe: no stop condition, no state dump, no pin mechanism, no step-scoped run.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@wshallwshall
wshallwshall enabled auto-merge (squash) August 25, 2026 23:29
wshallwshall and others added 8 commits August 25, 2026 18:32
…n constraint

Builder2 relayed the owner's ruling via the Liaison: mocking-by-default declined even as a filed
ADR 0010 amendment, closing #236 outright declined. Both confirm PARTIAL is the correct banner,
not an oversight. Also records why the stop condition is unfiled rather than unstarted: it changes
sys.settrace observation semantics rather than adding a flag, per the Dispatcher's split.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@wshallwshall
wshallwshall merged commit 8f17525 into main Aug 26, 2026
40 of 41 checks passed
@wshallwshall
wshallwshall deleted the claude/builder-2-236-lookup-affordance branch August 26, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant