Repository navigation
feat(design): DS-H-04 static probe hall - #1663
Conversation
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>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 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".
| 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} />, |
There was a problem hiding this comment.
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 👍 / 👎.
| | 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 | – | |
There was a problem hiding this comment.
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 👍 / 👎.
| 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); |
There was a problem hiding this comment.
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 👍 / 👎.
| 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} />, |
There was a problem hiding this comment.
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 👍 / 👎.
|
@Mergifyio queue |
☑️ This pull request is already queued |
|
Root auto-queue: head b76dfa3 unchanged since review-ok, all checks green. @Mergifyio queue |
Merge Queue Status
This pull request spent 13 minutes in the queue, including 12 minutes 29 seconds running CI. Required conditions to merge
|
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 })drawstiles/layout.tswith 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.sceneundefined = unread (no figures, texthall.unread);pieces: []= empty (figuresready, texthall.empty). Every view showshall.sample("Beispieldaten"); stations and gate say "Beispiel" (ASSETS §8). Sprites arearia-hidden; every station, role, piece, state, gate and stamp is HTML text in a legend below the scene.poseFor(R1646-K1): a role without a piece ->poseFor(null)=ready; a piece without a state ->poseFor("unknown")=unknown, neverready/run. State words viaStateMark(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-themeandprefers-color-scheme, same rule astokens.css).src/design/hall/fixtures.ts(new):SAMPLE_HALL(idsprobe-a/b/c: buildrun, checkok+ stamp, ops without state) andEMPTY_HALL.src/design/hall/tiles/stations.px.ts: new tilepiece-crate-0(16 x 16, hand-placed text raster, same light/shadow convention as the stations); atlas regenerated withnode 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 keyshall.title,hall.sample,hall.example,hall.empty,hall.unread,hall.piece.a/b/c.src/design/registry.ts: entryHall(familyhall, DS-X-14 addendum).docs/PLAN.md: own DS-H-04 row only.Evidence (Linux server, worktree of this branch)
Hallreturns null) -> 5 tests insrc/design/hall/Hall.test.tsxred; green at 67eef2e.npx vitest run src/design src/i18n-> 175 passed, exit 0npm run typecheck-> exit 0;npx eslint src/design/hall-> exit 0node scripts/contrast-check.mjs-> exit 0node scripts/dev/build-sprites.mjs-> exit 0,git statusclean afterwardsbash 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-> b76dfa3ds-h-04-hall-light.png,ds-h-04-hall-dark.pngin the orchestrator report folder. Rendered from a scratch Vite page in the ignoredshots/folder vianode scripts/dev/shot.mjs --fixture(exit 0); no desktop app launched.NICHT ABGEDECKT
#[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.--dpr) belong to DS-H-07 acceptance.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.pngandds-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.Hall.tsx:56-61nested arrays without Fragment key;key="stamp"collides when several pieces are stampedHall.tsx:72as StateFormcast lets an invalid state reachStateMarkStateMarkvalidates at runtime (src/design/state/StateMark.tsx:5-7knownStateForm, unknown → unknown word) andposeForalso maps unrecognised values to unknown, so pose and word cannot contradict; typingHallPiece.stateasStateFormis a follow-up when live data arrives (DS-H-05)Hall.tsx:29unchecked atlas lookuptiles.test.ts)key="stamp"refactor trapextent()recomputed per sprite renderVerdict: accepted (no open high; Gemini's request rejected with evidence above).
review-okbound to b76dfa3.