e2e-evolve 2026-07-05: drain 4 backlog fixes from the DeepSeek-lane run (+ E3 runner-doc)#44
Merged
Conversation
…del and trim fields
The aggregator extract prompt pins the model, but the LLM sometimes leaves the
trim in BOTH fields (model "RAV4 XLE", trim "XLE"). resegmentModelTrim's blind
`${model} ${trim}` concat then doubled it ("RAV4 XLE XLE" -> trim "XLE XLE"),
which classified as 'near' (not 'exact') and rendered visibly broken. Guard the
concat: if trim is already a whitespace-bounded trailing run of model, re-split
from model alone. The powertrain asymmetric guard is untouched. A de-doubled
"XLE" restores match_status='exact'. Unit + real-DB workflow regression (both
fail on old code). Found: live-e2e 2026-07-04-run2 (PIC-20260704r2-1).
…he observed listed price A scan persisted msrp=$19,991 with listed_price=$33,915 (listed > msrp, an implausible MSRP for the car). The same-page harvest guards only catch an inversion within one VDP snapshot; a cross-source pair (SRP-extracted price + an MSRP fanned out from a possibly-mismatched VDP) slips through. Add a write-time guard in the shared scan writer: when listed price > msrp, null the derived MSRP and keep the observed price (mirrors the otd_total<=0 -> null persist normalization). dealerMarkup is a separate labeled field, so the markup signal is untouched; COALESCE upserts never clobber a prior-good msrp with the null. Real-DB persist regression on both write arms. Found: live-e2e 2026-07-04-run2 (PIC-20260704r2-7, msrp half; cross-model trim leak stays open backlog).
…quote_pipeline
The overview headline ("N quote(s), lowest $X") re-aggregates from
dealer_quotes, but affectedKinds() mapped dealer_reply_extract to
[quotes,messages] only, so the Canvas digest fetch never refetched after an
extract wrote quotes — the count stayed stale ("0 quote(s)") until the next
daily_digest, while best-OTD self-healed from the live quotes fetch. Add
"digest" to the pulse for dealer_reply_extract and quote_pipeline (both write
dealer_quotes). GET /api/digest re-aggregates fresh, so the extra pulse is a
harmless refetch, no calc change. Real-service RunPubSub regression on both
skills. Found: live-e2e 2026-07-04-run2 (PIC-20260704r2-2).
…e pin Canvas's explicit getProfile is bound to the session pin, and useAsync's refetch() ignores its enabled flag (it gates only the mount effect). So a "profiles" data.changed pulse re-fired getProfile(null) -> GET /api/profiles/null on a STOP/clarify run, or getProfile(<deleted-id>) after a reset (the reset pulse carries profile_id null and matches every registration; the pin never clears since pipeline_reset runs as a workflow, not the shell purge) — each a console 404 that accrued across a session. Guard inside the fetcher closure: skip when profileId is null or not in the active profiles list. A skipped fetch lands kind:'error', which the existing explicitActive fallback already treats as 'use newest-active data[0]' — no happy-path change. Component regression through the real refetch bus (fails on old code). Found: live-e2e 2026-07-04-run2 (PIC-20260704r2-6).
…ence-gated
The runner doc described the 0.85 destructive downgrade as an unconditional
phrase-match to the clarify-run-explicit button and cited a stale line range
(router.ts:265-270, now the suggest-next header). The router is confidence-gated
(DESTRUCTIVE_CONFIDENCE=0.85, router.ts:248-254): only a route BELOW 0.85
downgrades to clarify; a CLEAR destructive ask ("reset everything") is rated
>=0.85 and launches straight to the skill's OWN typed-YES gate (the stronger
floor). Correct the line cites and reframe E3/J6/P6 to expect either outcome by
the phrase's clarity. live-verified, no product change (behavior is pinned by
router.test.ts and was observed live 2026-07-04-run2). Resolves PIC-20260704r2-3.
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.
Backlog-drain from the 2026-07-04-run2 DeepSeek-lane live-e2e run (no open blockers this session). Each product fix ships with a deterministic regression that was independently verified to FAIL on old code / PASS on new (by the fixer + a fresh-context code-reviewer + the safety-auditor).
Fixes
phase2/inventory_aggregator_scan(PIC-20260704r2-1) —resegmentModelTrimdoubled a trim the LLM left in both the model and trim fields ("XLE XLE"), which classified asnearand rendered broken. Guard the concat when trim is already a whitespace-bounded trailing run of model. Restoresmatch_status='exact'. Powertrain guard untouched. Unit + real-DB workflow regression.phase2/inventory_site_scan(PIC-20260704r2-7, msrp half) — null a cross-source MSRP that is inverted below the observed listed price (a mismatched-VDP mis-parse the same-page guards never see). Nulls the derived MSRP, keeps the observed price; markup signal untouched. Real-DB persist regression on both write arms.phase4/daily_digest(PIC-20260704r2-2) — add"digest"to thedata.changedpulse fordealer_reply_extract+quote_pipeline(both writedealer_quotes), so the overview headline count refetches after an extract instead of showing a stale"0 quote(s)"next to a live best-OTD. No calc change. Real-serviceRunPubSubregression.phase0/ui(PIC-20260704r2-6) — skip the explicitgetProfilefor a null or no-longer-active pin (theuseAsync.refetchbypassesenabled, so a"profiles"pulse firedGET /api/profiles/null//<deleted-id>— console 404s). Guard inside the fetcher closure; the existingdata[0]fallback is unchanged. Component regression through the real refetch bus.phase0/live_e2e(PIC-20260704r2-3, runner doc) —live-verified, no product change: the router's destructive downgrade is confidence-gated (DESTRUCTIVE_CONFIDENCE=0.85), not an unconditional phrase-match; a clear ask launches to the skill's own typed-YES gate. Reframe E3/J6/P6 + fix the stalerouter.tsline cite.Gates
RUN_UI_FUNCTIONAL=1 bash scripts/green.sh→ GREEN (incl. the UI functional lane)./api/profiles,/api/digest,/__e2e/rows); server-404 on/api/profiles/nullconfirms BK6's client-skip is the correct fix.Still-open backlog (recorded, not this session): BK7 cross-model trim leak (non-minimal — needs same-card provenance), PIC-20260704-3 aggregator kept-0 multi-word (a distinct
classifyMatchStatusmismatch, needs live instrumentation).