Skip to content

feat(design): DS-H-04 static probe hall - #1663

Merged
mergify[bot] merged 3 commits into
mainfrom
claude/ds-h-04
Oct 16, 2026
Merged

mergify[bot] merged 3 commits into
mainfrom
claude/ds-h-04

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Die Probe-Halle ist jetzt als stilles Bild fertig: Boden, vier Arbeitsplätze mit ihren Figuren, das Tor, drei erfundene Werkstücke und ein Stempel. Jede Ansicht trägt sichtbar das Schild „Beispieldaten“, und eine leere oder noch nicht gelesene Halle sagt das in Worten. Die Halle ist noch nirgends in der App eingebunden; das kommt erst mit der Galerie (DS-H-07).

Plan-ID: DS-H-04

Report

What changed

  • src/design/hall/Hall.tsx (new): Hall({ scene }) draws tiles/layout.ts with the tile and figure atlases, the four stations, the gate, the work pieces on the belt and one evidence stamp next to the stamped piece. scene undefined = unread (no figures, text hall.unread); pieces: [] = empty (figures ready, text hall.empty). Every view shows hall.sample ("Beispieldaten"); stations and gate say "Beispiel" (ASSETS §8). Sprites are aria-hidden; every station, role, piece, state, gate and stamp is HTML text in a legend below the scene.
  • Poses only through poseFor (R1646-K1): a role without a piece -> poseFor(null) = ready; a piece without a state -> poseFor("unknown") = unknown, never ready/run. State words via StateMark (missing state -> "Unbekannt").
  • src/design/hall/hall.css (new): tokens only. React passes plain numbers as CSS custom properties; calc() multiplies by --s = usePixelScale().css, so positions are whole art pixels and one art pixel is whole device pixels. Only the active theme's atlas is referenced (data-theme and prefers-color-scheme, same rule as tokens.css).
  • src/design/hall/fixtures.ts (new): SAMPLE_HALL (ids probe-a/b/c: build run, check ok + stamp, ops without state) and EMPTY_HALL.
  • src/design/hall/tiles/stations.px.ts: new tile piece-crate-0 (16 x 16, hand-placed text raster, same light/shadow convention as the stations); atlas regenerated with node scripts/dev/build-sprites.mjs (tiles atlas still 128 x 32, 15 frames). Note: this file is outside the brief's FILES list; no work-piece sprite existed on main, so this was the smallest way to place three pieces. Provenance entry for the file already exists.
  • src/i18n/de.ts: new keys hall.title, hall.sample, hall.example, hall.empty, hall.unread, hall.piece.a/b/c.
  • src/design/registry.ts: entry Hall (family hall, DS-X-14 addendum).
  • docs/PLAN.md: own DS-H-04 row only.
  • Not done: R1648-K4 (optional gate shading) skipped.

Evidence (Linux server, worktree of this branch)

  • Red: commit 2f27151 (stub Hall returns null) -> 5 tests in src/design/hall/Hall.test.tsx red; green at 67eef2e.
  • npx vitest run src/design src/i18n -> 175 passed, exit 0
  • npm run typecheck -> exit 0; npx eslint src/design/hall -> exit 0
  • node scripts/contrast-check.mjs -> exit 0
  • node scripts/dev/build-sprites.mjs -> exit 0, git status clean afterwards
  • bash scripts/ci/red-first.sh -> exit 0 (5 Test-First names red at the merge base, green at the head)
  • bash scripts/ci/gates.sh lane prepush -> exit 0, HEAD b76dfa3 (own worktree)
  • git ls-remote origin claude/ds-h-04 -> b76dfa3
  • Screenshots (scale 2, 1440 x 900, light and dark, filled + empty + unread side by side), looked at: ds-h-04-hall-light.png, ds-h-04-hall-dark.png in the orchestrator report folder. Rendered from a scratch Vite page in the ignored shots/ folder via node scripts/dev/shot.mjs --fixture (exit 0); no desktop app launched.
  • Diff: 11 files, 253 insertions, 2 deletions (two PNGs binary).

NICHT ABGEDECKT

  • Windows half: #[cfg(windows)] tests and the Windows clippy arms do not run on Linux; the Windows lane runs in the merge queue. This package changes no Rust.
  • Screenshots only at device pixel ratio 1 (scale 2); 125 % / 150 % (--dpr) belong to DS-H-07 acceptance.
  • No motion, no list projection or keyboard selection (DS-H-05/06), no mount in the app.
  • The legend columns grow with their text, so they line up with the station groups only approximately.

Review: pending (tier B), Root commissions two non-Anthropic reviewers.

🤖 Generated with Claude Code on the ProjectA server worker

Root acceptance (head b76dfa3, 2026-10-16 ~22:58 CEST)

Tier B, author family Anthropic (claude-opus-5-5@high, server job srv-ds-h-04-20261016). Reviewers: Kimi K3 (Moonshot) APPROVE, Gemini 3.8 Flash (Google) REQUEST_CHANGES — both via OpenRouter on head b76dfa3; Root adjudicated every finding at the cited line. Size +253/−2. Root looked at ds-h-04-hall-light.png and ds-h-04-hall-dark.png: filled hall (four stations, figures, gate, three sample pieces, stamp), empty hall ("kein Werkstück da"), unread hall (no figures, "Stand unbekannt"); "Beispieldaten" on every view.

ID Source Severity Finding Disposition
R1663-G1 Gemini medium Hall.tsx:56-61 nested arrays without Fragment key; key="stamp" collides when several pieces are stamped rejected: keys are scoped per inner array (one array per role, at most one stamp per role), no collision possible; Fragment form is a style follow-up (DS-H-05)
R1663-K1 Kimi K3 medium Hall.tsx:72 as StateForm cast lets an invalid state reach StateMark rejected: StateMark validates at runtime (src/design/state/StateMark.tsx:5-7 knownStateForm, unknown → unknown word) and poseFor also maps unrecognised values to unknown, so pose and word cannot contradict; typing HallPiece.state as StateForm is a follow-up when live data arrives (DS-H-05)
R1663-K2 / R1663-G2 Kimi K3, Gemini low Hall.tsx:29 unchecked atlas lookup follow-up DS-H-05 (the coverage of TILE ↔ atlas is tested in tiles.test.ts)
R1663-K3 Kimi K3 low key="stamp" refactor trap follow-up with R1663-G1
R1663-K4 Kimi K3 low test asserts the fixture length follow-up
R1663-K5 / R1663-G4 Kimi K3, Gemini low no test for an invalid state string / several stamps follow-up DS-H-05
R1663-G3 Gemini low extent() recomputed per sprite render follow-up DS-H-06 (motion/performance package)
R1663-ROOT1 Root screenshot medium dark theme turns the figures' skin dark: identity changes with the theme follow-up to the DS-H-03 figure palette (not in this PR's files), before DS-H-07 user acceptance

Verdict: accepted (no open high; Gemini's request rejected with evidence above). review-ok bound to b76dfa3.

Cuarroc and others added 3 commits October 16, 2026 22:27
Hall is a stub that renders nothing; fixtures, dictionary keys and the
registry entry are in place so the tests compile and fail.

Test-First: src/design/hall/Hall.test.tsx::every hall view shows the Beispieldaten label
Test-First: src/design/hall/Hall.test.tsx::an empty hall says so in words and shows no figure in the work pose
Test-First: src/design/hall/Hall.test.tsx::an unread hall says it is not read yet
Test-First: src/design/hall/Hall.test.tsx::a missing state shows the unknown pose
Test-First: src/design/hall/Hall.test.tsx::three work pieces each carry a text name

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hall draws the floor layout, the four stations with their role figures,
the gate, three synthetic work pieces (new piece-crate-0 tile, atlas
regenerated) and one evidence stamp. Every view says "Beispieldaten";
empty and unread halls say so in words. Figures get their pose only
through poseFor: a role without a piece is ready, a piece without a
state stays unknown (R1646-K1). Sprite geometry is plain numbers in CSS
custom properties; hall.css scales them with the whole-device-pixel
factor from usePixelScale and loads only the active theme's atlas.

Regression-For: 2f27151

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No-Test: plan text only

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Cuarroc
Cuarroc marked this pull request as ready for review October 16, 2026 20:51
@Cuarroc Cuarroc added the review-ok Pipeline: review disposition complete, no open high finding label Oct 16, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T20:56:07.542907Z b76dfa3 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b76dfa3431

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/design/hall/Hall.tsx
const pose = poseFor(piece ? piece.state ?? STATE_UNKNOWN_FORM : null);
return [
<Sprite key={role} sheet="tiles" id={`station-${role}-0`} col={c} row={2} />,
scene && <Sprite key={`f-${role}`} sheet="figures" id={`fig-${role}-${pose}-0`} col={c + 1} row={1} />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Position state-specific poses at their landmarks

When a piece has state need, rev, or bad, this always places its figure at the role's station (c + 1, row 1). That contradicts the binding docs/design/hall/ASSETS.md §6 layout: need stands at the gate, rev at the handover tray, and bad at the return path. For example, an ops need figure remains far to the right of the gate and even points away from it, so future non-fixture scenes visually misrepresent the state despite showing the correct state word.

Useful? React with 👍 / 👎.

Comment thread docs/PLAN.md
| DS-H-02b | Probe-Halle: Stationen, Tor und Requisiten mit Textnamen: `hall/tiles/` | Root disponiert | DS-H-02a | Server | B | In Arbeit (16.10.): Draft-PR mit vier Rollenstationen (Planungstisch, Werkbank, Prüfstand, Betriebspult), Tor, Übergabeablage und Stempel als Textraster `tiles/stations.px.ts`, deutsche Textnamen im Wörterbuch `src/i18n/de.ts` (Zuordnung Sprite → Schlüssel in `tiles/names.ts`); Nacharbeit aus #1642 (R1642-G1/K1, K2, K3); Reviews ausstehend | wie DS-H-01 | – |
| DS-H-03 | Probe-Halle: vier Rollenfiguren und Posen, jede Pose aus genau einer `StateForm` oder `unknown`: `hall/figures/` | Root disponiert | DS-H-01 | Server | B | Erledigt: #1646; vier Rollenfiguren (Planung, Umsetzung, Prüfung, Betrieb) mit eigener Kopfform, je zwölf Bilder in acht Posen als Delta zur Grundhaltung; `poseFor` ordnet jede `StateForm` genau einer Pose zu, alles andere `unknown`, ohne Lauf `ready` | benannte Tests rot→grün; prepush; zwei Reviews | – |
| DS-H-04 | Probe-Halle statisch: Layout, drei Werkstücke, Tor, Stempel, leerer und ungelesener Zustand in Worten: `hall/Hall.tsx` | Root disponiert | DS-H-02b, DS-H-03; Zustandsaliase aus DS-X-04 (#1603) | Server | B | Geplant: nicht disponiert (16.10.) | wie DS-H-01 | – |
| DS-H-04 | Probe-Halle statisch: Layout, drei Werkstücke, Tor, Stempel, leerer und ungelesener Zustand in Worten: `hall/Hall.tsx` | Implementierer · Claude; Root nimmt ab | DS-H-02b, DS-H-03; Zustandsaliase aus DS-X-04 (#1603) | Server | B | Offen: Entwurfs-PR (16.10.), Reviews ausstehend; `Hall` zeigt gefüllt, leer und ungelesen mit Schild „Beispieldaten“, Werkstück-Kachel `piece-crate-0` neu, im Register eingetragen; noch in keiner Ansicht eingebunden (Galerie DS-H-07) | Hall-Tests rot→grün; typecheck, contrast-check, build-sprites sauber, prepush Exit 0; Bildschirmfotos hell/dunkel angesehen; zwei Stufe-B-Reviews fremder Nicht-Anthropic-Familien | – |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update the plan row to the post-merge state

The commit's own report records both required reviews, Root acceptance, and review-ok, but the changed DS-H-04 row still says the draft is open and reviews are outstanding. Because the row must describe what will be true after this commit merges, mark the package completed/reviewed rather than preserving this pre-review status.

AGENTS.md reference: AGENTS.md:L121-L121

Useful? React with 👍 / 👎.

Comment thread src/design/hall/Hall.tsx
export function Hall({ scene }: { scene: HallScene | undefined }) {
const s = usePixelScale().css;
const pieces = scene?.pieces ?? [];
const pieceOf = (role: Role) => pieces.find((p) => p.role === role);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve every piece assigned to the same role

For any HallScene containing multiple pieces with the same role, find selects only the first and silently omits the rest from both the scene and legend. This necessarily occurs in the documented DS-H-07 measurement sets of 8, 30, and many pieces because only four roles exist, and it prevents the DS-H-05 projection from representing every work piece unless another undocumented active-piece selection is introduced. Render all matching pieces or make the single selected piece explicit in the input model.

Useful? React with 👍 / 👎.

Comment thread src/design/hall/Hall.tsx
return [
<Sprite key={role} sheet="tiles" id={`station-${role}-0`} col={c} row={2} />,
scene && <Sprite key={`f-${role}`} sheet="figures" id={`fig-${role}-${pose}-0`} col={c + 1} row={1} />,
piece && <Sprite key={piece.id} sheet="tiles" id="piece-crate-0" col={c + 1} row={3} />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid drawing a second crate for poses that hold it

The run and ok figure frames already contain the work piece—the binding pose contract says run has hands on the crate and ok holds the stamped crate, and roles.px.ts rasterizes those crates into the figure. Rendering piece-crate-0 unconditionally therefore makes each sample piece in those states appear both in the figure's hands and again on the belt; the supplied fixture has both states, so its promised three-piece scene visually contains duplicate work pieces. Only draw the separate belt sprite for poses where the figure does not already include that piece, or compose the figure and piece as separate art.

Useful? React with 👍 / 👎.

@Cuarroc

Cuarroc commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

@Mergifyio queue

@mergify

mergify Bot commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

queue

☑️ This pull request is already queued

@mergify mergify Bot added the queued label Oct 16, 2026
@Cuarroc

Cuarroc commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

Root auto-queue: head b76dfa3 unchanged since review-ok, all checks green. @Mergifyio queue

@mergify mergify Bot mentioned this pull request Oct 16, 2026
30 of 46 tasks
@mergify
mergify Bot merged commit 9537d26 into main Oct 16, 2026
25 checks passed
@mergify

mergify Bot commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • ✅ Entered queue — 2026-10-16 21:03 UTC · Rule: default · triggered by merge protections
  • ✅ Checks passed · on draft merge queue: checking #1663 on main (92830db) #1664
  • ✅ Merged — 2026-10-16 21:16 UTC · at 9537d26f79dad85dfec71f78d31fd3c1005a2e06 · merge

This pull request spent 13 minutes in the queue, including 12 minutes 29 seconds running CI.

Required conditions to merge
  • check-success = gates (linux)
  • check-success = gates (windows)
  • check-success = red-first
  • github-review-approved [🛡 GitHub repository ruleset rule main-pr-required-checks]
  • label != do-not-merge
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/gates (linux)
    • check-neutral = @github-actions/gates (linux)
    • check-skipped = @github-actions/gates (linux)
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/gates (windows)
    • check-neutral = @github-actions/gates (windows)
    • check-skipped = @github-actions/gates (windows)
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/red-first
    • check-neutral = @github-actions/red-first
    • check-skipped = @github-actions/red-first
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-neutral = @mergify/Mergify Merge Protections
    • check-skipped = @mergify/Mergify Merge Protections
    • check-success = @mergify/Mergify Merge Protections

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review-ok Pipeline: review disposition complete, no open high finding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant