feat(ide): a skipped live lookup offers the stubbing affordance instead of a dead end (BACKLOG #236) - #605
Merged
Conversation
…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
enabled auto-merge (squash)
August 25, 2026 23:29
…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>
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.
A skipped
db_lookup/fhir_lookuprendered "live lookup - not evaluated in preview" and stoppedthere. 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:
mergeLiveValuesdropped the annotation's kind, so a skipped lookupinherited 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 currentmain, isolating it froman unrelated commit (
#1211, already on PR #594) that shared the same base. Cross-checked againstan independent
rebase --ontoof the same isolation done separately -- both produced the identicaltree (
a3de7e717956...), confirming the isolation is correct via two different methods.Verified:
npm run typecheckclean;npm run test:unit627 passing, 0 failing, including the newBACKLOG #236suite by name (not just the rising total); 5 mutants, each killed by a distinct redset; 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