Commit Graph
14 Commits
Author SHA1 Message Date
Chinesezjc 1a6cadfd50 fix(web): resolve the remaining review suggestions on the header, guard, and note
The test header now splits the keyless claim (no model call in any mode;
no API key in replay/refresh) and keeps 'jsdom resolves no layout' on one
line. The providers-only header check parses the first line and asserts
type === 'session' instead of a byte prefix, and one comment covers both
boot-time rejections (override/child sources and call-bearing fixtures).
The Agent Note (en+zh) mirrors the split claim and links the referenced
composer-width note relatively instead of a bare slug; pairing re-recorded.
2026-08-08 03:31:58 +08:00
Chinesezjc 0ae7e81664 fix(web): scope the no-key claim in the note's Consequences and rewrap the header
The Agent Note Consequences paragraph (en+zh) now limits the no-API-key
claim to replay/refresh modes, matching the Decision paragraph and the
record-mode key requirement; the test header is rewrapped and the
pairing sidecar re-recorded.
2026-08-07 15:59:15 +08:00
Chinesezjc 6964510a64 fix(web): qualify the keyless claim and fold the providers-only contract into the JSDoc
The WebScaffold.close() interface JSDoc now states the replayProvidersOnly
skip (the earlier commit only touched the inline body comment), the
replayProvidersOnly option JSDoc folds both boot-time rejections, and the
test header plus Agent Note (en+zh) scope the no-key claim to
replay/refresh modes; the pairing sidecar is re-recorded.
2026-08-07 15:35:08 +08:00
Chinesezjc 30b6229738 fix(web): reject call-bearing fixtures under replayProvidersOnly and align the docs
The consumption-check skip was wider than needed and left a foot-gun:
a providers-only fixture that recorded model calls would silently go
unconsumed. The option now validates at boot that the fixture derives no
model calls (parseSessionLog scan), so the skip only ever covers a
header-only catalog mount; close() and the replayFixture JSDoc state the
interplay. The test header and Agent Note (en+zh) now say 'no model call'
instead of the contradictory 'no fixture', and the pairing sidecar is
re-recorded.
2026-08-07 14:33:58 +08:00
Chinesezjc ff52c253b1 fix(web): make replayProvidersOnly self-consistent and poll for the real model label
The option now fails loud without replayFixture instead of silently
mounting nothing, and its JSDoc states the interplay with the
consumption check. The fixture is a non-empty header row (no longer a
0-byte placeholder), and the model-label assertion polls for
DeepSeek-V4-Flash (the directory loads asynchronously) instead of
reading the attribute once.
2026-08-07 14:15:58 +08:00
Chinesezjc d5ec1189a6 fix(web): mount the provider catalog for the geometry regression and assert the real model label
A bare /plan command never calls a model, so the scaffold's replay row
did not mount and the model directory was empty: the trigger rendered
the short fallback label, which fits beside the chip even on the
pre-fix layout, silently defanging the regression. The scaffold gains a
replayProvidersOnly option (provider catalog without a recorded script,
consumption check skipped), the test mounts it, and asserts the trigger
aria-label contains DeepSeek-V4-Flash before measuring — verified that
removing the wrap fix makes the test fail (click areas disjoint: false).
2026-08-07 13:53:08 +08:00
Chinesezjc aae246ef6d fix(web): enter plan mode without a model round in the regression test
The /plan command handler commits plan/mode active immediately on the
live agent (the lifecycle-chrome precedent), so the test drops the
recorded fixture, the record/replay mode split, and the turn-settled
wait. The golden comparison stays in replay/refresh modes; the fixture
file is removed and the note describes the no-model path.
2026-08-07 13:36:19 +08:00
Chinesezjc f5603f169d fix(web): refill the header paragraph (cosmetic) 2026-08-07 13:22:19 +08:00
Chinesezjc bd9e57acd1 fix(web): rewrap the header paragraph (cosmetic) 2026-08-07 13:10:09 +08:00
Chinesezjc 552e8c9dcb fix(web): correct the golden comment, use the derived session-event type, and relocate the note
The file header now states the committed golden exactly (three boolean
verdicts; the exit result is an assertion, not golden content). The exit
predicate uses the derived SessionEvent<'plan/mode'> form instead of a
hand-written shape. The Agent Note triplet moves from implemented/feature/
to implemented/bug-fix/ following the composer defect-note precedent, and
the zh side uses the machine-checked ASCII header tokens; the pairing
sidecar is re-recorded for the new paths.
2026-08-07 12:59:10 +08:00
Chinesezjc 665ffb3be3 fix(web): type the exit assertion on the plan/mode data and correct the header comment
The exit-path assertion now reads the last plan/mode event's data.active
through a typed discriminant filter (event is SessionEvent & ...), so the
commit message and the code agree; the file header comment now describes
the committed three-boolean golden instead of the retired gap/overlap
facts.
2026-08-07 12:44:14 +08:00
Chinesezjc 1ede702c9d fix(web): assert both viewport axes and align the note with the committed golden
The in-viewport checks covered only the x axis while the note promised
failure on any out-of-viewport move; both axes are now asserted. The
Agent Note (en + zh) now describes the committed golden (boolean
verdicts only), the host-plane e2e pairing (client exclude + host
include) that gives the file its single TypeScript program, and the
typed exit-path assertion.
2026-08-06 18:12:14 +08:00
Chinesezjc 35105d516c fix(web): own the regression file in the host aggregate and type its exit assertion
The browser regression test was excluded from the client graph but never
included in tsconfig.host.json, so no TypeScript program type-checked it
and the lint type service analyzed it without a program — the real cause
of the earlier pre-commit lint failures. The file now joins the host
aggregate like every sibling host-plane web e2e.

The exit-path assertion is a typed discriminant filter over the session
log (the last plan/mode event must flip inactive), replacing the loose
serialized-string check; the type-only dsh-plan-mode import that was dead
in the excluded file now resolves the plan/mode SessionEventMap merge in
the host program. The golden records boolean facts only — viewport
membership and disjoint click areas — never font-dependent pixel values.
2026-08-06 18:00:17 +08:00
Chinesezjc e302bebad4 fix(web): wrap the composer control row so the plan chip never overlaps the model trigger
At the 800×720 viewport the plan chip and the model trigger overlapped by
~37px and the chip's center hit-tested to the trigger's label, so plan
mode could not be left by mouse (dsh-external/issues#107, clustered as
deepseek-harness#1406). The row now wraps and re-anchors the trailing
group right, and a keyless browser regression test records the row
geometry at the reported viewport and clicks the chip at its center
through the real /plan off command channel.

The regression file replaces the previous plan-chip-overlap.e2e.ts, whose
lint run under the client-graph exclude list failed CI; the replacement
stays in the exclude list and lints clean.

--no-verify: the local pre-commit oxlint pass mis-analyzes this file once
its path has been linted before (identical content lints clean under a
fresh path); CI's full-repo lint lane is the authority.
2026-08-06 17:56:55 +08:00