chore(meta): pql changelog — T-1193 first-slice incident record

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 20:46:07 +02:00
co-authored by Claude Fable 5
parent 9ac98542d1
commit 08acbcb7df
2 changed files with 116 additions and 0 deletions
@@ -2322,3 +2322,7 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'status', 'backlog', 'in_progress', NULL, '2026-07-25 18:11:42', '2026-07-25 18:11:42.948', '2026-07-25 18:11:42.948', NULL, '613156e91577043373205250f21a72cd', 2) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'assigned_to', NULL, 'justine', NULL, '2026-07-25 18:11:45', '2026-07-25 18:11:45.571', '2026-07-25 18:11:45.571', NULL, '7fe3851d234f1cafb2b4fc70c1f5eed8', 2) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'assigned_to', NULL, 'araminta', NULL, '2026-07-25 18:11:46', '2026-07-25 18:11:46.095', '2026-07-25 18:11:46.095', NULL, '0d1336d72b0807fe85c054696e914350', 2) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'status', 'in_progress', 'review', NULL, '2026-07-25 18:19:48', '2026-07-25 18:19:48.053', '2026-07-25 18:19:48.053', NULL, '2fa6ce22c32b396a2ea7ac1dd6f64dc0', 2) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSHSYM96N2M9GJTQMF58E4WC', 'description', 'Flagged by stig during the T-1189/T-1192 round (2026-07-25): test_step_canvas_viewer.gd has no injected disk-cache-root seam (unlike test_step_canvas_request.gd, which injects a disposable root), so viewer tests that exercise the disk-cache path against a real-looking body_id (e.g. GJ1c) read/write the REAL user://atlas_cache/ shared across runs — a stale real entry from earlier manual sessions can leak into test behavior. Current mitigation (used by the new T-1189/T-1192 tests and the existing sweep smoke test): distinctive synthetic body_ids. Proper fix: give the viewer suite the same injectable cache-root seam the request suite has (constructor/setter injection through StepCanvasRequest), and migrate the synthetic-body_id tests onto it. Small, test-only.', 'Flagged by stig during the T-1189/T-1192 round (2026-07-25): test_step_canvas_viewer.gd has no injected disk-cache-root seam (unlike test_step_canvas_request.gd, which injects a disposable root), so viewer tests that exercise the disk-cache path against a real-looking body_id (e.g. GJ1c) read/write the REAL user://atlas_cache/ shared across runs — a stale real entry from earlier manual sessions can leak into test behavior. Current mitigation (used by the new T-1189/T-1192 tests and the existing sweep smoke test): distinctive synthetic body_ids. Proper fix: give the viewer suite the same injectable cache-root seam the request suite has (constructor/setter injection through StepCanvasRequest), and migrate the synthetic-body_id tests onto it. Small, test-only.
First slice landed 2026-07-25 (main, 9ac98542d) via a live incident: PR #211''s gate failed on test_step_canvas_viewer''s two before-any-canvas tests because user://atlas_cache/ is machine-shared (every worktree gate, live capture driver, and play session write the same directory) and the T-1183 disk lookup short-circuits before test_mode''s no-op IPC a concurrent GJ380c Global live capture (T-1157 eyeball work) warmed the exact key the tests assume cold. Fix: StepCanvasViewer.disk_cache_root_override threading into StepCanvasRequest''s existing test-injection seam; viewer + legend suites route construction through _make_viewer() helpers pinning isolated roots. REMAINING for this ticket: screen-constructed viewers (RegionalScreen builds its viewer internally no override path), and any future suite constructing viewers directly should use the helper pattern; consider a gdUnit-wide guard (e.g. a shared test base or a lint) so new suites cannot silently ride the shared root.', NULL, '2026-07-25 18:45:59', '2026-07-25 18:45:59.847', '2026-07-25 18:45:59.847', NULL, 'dd331004eee53f809c993e6845b52cbd', 2) ON CONFLICT(hash) DO NOTHING;
+112
View File
@@ -3568,3 +3568,115 @@ archiving/marking those superseded, or by palette.md stating exactly what it inh
Lead note (batch-5 activation): the toon-vs-PBR treatment call for environment props is delegated to
araminta (art seat) this batch her ruling lands in palette.md with rationale; surfaced to Jeroen in
the batch report for cheap veto. VERDICT: READY.', 'in_progress', 'medium', 'araminta', 'visual', 'D-235', '2026-06-12 10:40:59', '2026-07-25 18:11:46.095', NULL, '4df3e92b2bc003a7b73f860dd47704f2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Create the visual production-status catalog; fix glb-gen production path + naming conventions', '(description follows in first append)
---
Refinement (2026-06-16, /whats-next Si pass) FULL scope (user decision). Two deliverables + conventions.
(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model.
(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest.
(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. <model>_open / <model>_closed), Godot TileSet resource organization (<tileset>/<tile_id>.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: <model>_<direction>_<resolution>.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL.
OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog note the edge. T-1049''s per-class stories will reference these conventions do T-1050 first / concurrently so T-1049 can cite them.
---
HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming).
The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md
"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen
render-3D->2D-sprites step). Direction correction: we are NOT producing sprites Trellis
produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES.
Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before
activating. See the sprite-vs-3D root-cause note (this session).
Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them.
Refinement (batch-5 Si pass, 2026-07-25) SUPERSEDES the 2026-06-16 block above (sprite-centric, invalidated by D-244). READY.
CONTEXT: D-244 (confirmed, 2026-06-16) already re-scoped the catalog structure and repointed
renderer/README.md, sprite-gen SKILL.md, docs/assets/README.md, docs/assets/visual/{README,palette}.md,
and docs/assets/_templates/sprite.md (marked legacy) at the 3D-model reality. This ticket is now
narrower than its original draft: instantiate what D-244 named but did not fill in, plus author
conventions.md (net-new no D-244 amendment touched it).
DELIVERABLE (a) Category catalog files, per docs/assets/README.md''s already-updated structure:
- docs/assets/visual/models.md 3D objects/props (.glb via /glb-gen). Row template TBD (see
conventions.md below) since _templates/sprite.md is explicitly legacy/retired for this use.
- docs/assets/visual/textures.md PBR surface maps (BaseColor/Normal/Roughness) for 3D models.
- docs/assets/visual/artwork.md flat 2D art (paintings/flags/billboards/signage) via /sprite-gen''s
repurposed 2D-artwork role.
- docs/assets/visual/icons.md UI icons (13 SVGs already exist in client/assets/icons/ this file
should reflect that as-built inventory, not start at zero).
- docs/assets/visual/effects.md shaders/particles/overlays.
Each file follows docs/assets/audio/README.md''s model: per-category status table (planned/in-progress/
placeholder/final per docs/assets/README.md''s vocab), current counts. Update docs/assets/visual/README.md''s
category table counts once files exist (currently all show 0, which will stay accurate at initial creation
do not invent placeholder rows).
ACCEPTANCE: 5 files exist, cross-linked from visual/README.md (already has the links verify they resolve),
each with a real (possibly empty) status table matching the audio/README.md pattern.
DELIVERABLE (b) glb-gen production path:
- Create client/assets/models/ with furniture/ and props/ subdirectories (mirroring the proven
spike layout at spikes/3dpipeline/models/{furniture,props}/) + .gitkeep in each.
- Define client/assets/models/manifest.json, schema mirroring docs/architecture/character-asset-organization.md''s
per-asset-entry pattern (that doc''s clothing/accessory entries are the closest precedent a flat
per-item record, not per-body-type variants since environment props aren''t body-fitted). Minimum
fields: name, category (furniture|props), source_model (path under client/assets/models/), subdirectory,
status (planned/in-progress/placeholder/final reuse the docs/assets/README.md vocab so catalog and
manifest never disagree). Promotion = repo-canonical per D-241 an asset entering manifest.json AND
client/assets/models/ IS the promotion act; nothing stays "promoted" in spikes/.
- Update .claude/skills/glb-gen/SKILL.md replace the "client/assets/models/ does not exist... that''s
a Phase-5 concern" paragraph (lines ~96-102) with the new path + a pointer to the manifest. NOTE:
this contradicts nothing already in D-244/T-750 T-750''s own epic description lists furniture/props
production as Phase-4 parallel work, so populating the production path (not populating the world with
them that''s Phase 5 per T-961) is in-scope now.
ACCEPTANCE: client/assets/models/{furniture,props}/.gitkeep exist; manifest.json schema documented
(either inline in SKILL.md or as a comment/example in the file itself, following the character
manifest''s convention); SKILL.md''s stale "does not exist" paragraph is corrected.
DELIVERABLE (c) docs/assets/visual/conventions.md (NEW FILE no prior art to amend):
- Model naming: <category>_<descriptor>.glb (e.g. table_baroque.glb, chair_modernist.glb)
mirrors the spike''s existing baroque_table.glb/modernist_chair.glb pattern loosely; pick one
order and state it (category-first matches the character-asset clothing convention
<category>_<descriptor>; the spike used descriptor-first this is a naming decision to make,
not silently pick see lead note below on who rules it).
- Mask sidecar: <model>_mask.png, single-channel per the character-asset convention (Section 3
of character-asset-organization.md) UNLESS the item needs multi-region tinting, in which case follow
the RGBA channel-routed convention from that doc''s Section 11 (T-1089) rather than reinventing one.
- Texture naming keyed to D-235 tokens: PBR maps for building-exterior surfaces should name by
the ratified ObjectTag vocabulary (D-235 amendment, wiki/economics/object_tag_vocabulary.toml)
e.g. concrete_wall_basecolor.png, pitched_roof_normal.png NOT the old renderer/README.md
<model>_<direction>_<resolution>.png scheme, which is direction-indexed for the retired 4-direction
sprite render and does not apply to PBR texture maps at all (there is no "direction" for a texture,
only map type: basecolor/normal/roughness).
- Door state handling DO NOT port a state-frame suffix convention. The 2026-06-16 draft proposed
<model>_open/<model>_closed GLB variants; this is sprite-era thinking (baked state = baked frame).
For a 3D object the door''s open/closed/locked/sealed state (T-979/T-998''s DoorSpec: Open/Closed/
TemporalWindow/Locked/Sealed) is a RUNTIME transform/animation on one door .glb, not separate baked
models but the actual mechanism (AnimationPlayer swing vs. procedural hinge rotation vs. a
door-model convention with a named "open" bone) is a Phase-5 rendering decision (player control +
in-world rendering, per the cascade), not a Phase-4 asset-catalog concern. This ticket
should record ONLY the negative constraint (no state-frame suffix files) and defer the positive
mechanism to whichever Phase-5 ticket handles door rendering. Do not invent a runtime convention here.
- Godot TileSet resource organization OUT OF SCOPE, removed from ticket. client/scripts/rendering/
tile_renderer.gd''s TileSet is an explicitly-labeled placeholder ("programmatic TileSet with placeholder
colored rectangles," D-014) and the cascade rule states current in-world rendering code is
"left as-is until Phase 5 — do not build on it or rip it out before then." A <tileset>/<tile_id>.tres
convention would be building on Phase-5-owned code from Phase 4. Do not author this section.
- Multi-tile footprint metadata: still relevant (a table/couch spans multiple sim tiles regardless
of sprite vs 3D) keep this item, express as a manifest.json field (e.g. footprint_tiles: [w, h])
rather than a filename convention.
ACCEPTANCE: conventions.md exists, covers model naming / mask sidecars / D-235-keyed texture naming /
multi-tile footprint metadata; explicitly states the door-state and TileSet items are deferred (with
reasons) rather than silently omitted, so a future refinement pass doesn''t have to re-derive why.
SEQUENCING (unchanged from 2026-06-16 note): T-1053 (araminta briefing rewrite) softly depends on this
catalog. T-1049''s per-class stories reference these conventions this ticket lands first / concurrently.
Lead note (batch-5 activation): the model-naming-order call (category-first vs descriptor-first) is
delegated to araminta (art seat) this batch her ruling lands in conventions.md with a one-line
rationale; surfaced to Jeroen in the batch report for cheap veto. VERDICT: READY.', 'review', 'high', 'justine', 'visual', NULL, '2026-06-12 10:40:59', '2026-07-25 18:19:48.052', NULL, '111c7b03cb5bc345c306a64fcd8a76d0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSHSYM96N2M9GJTQMF58E4WC', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'StepCanvasViewer test suite lacks an injected disk-cache-root seam — tests share the real user://atlas_cache', 'Flagged by stig during the T-1189/T-1192 round (2026-07-25): test_step_canvas_viewer.gd has no injected disk-cache-root seam (unlike test_step_canvas_request.gd, which injects a disposable root), so viewer tests that exercise the disk-cache path against a real-looking body_id (e.g. GJ1c) read/write the REAL user://atlas_cache/ shared across runs — a stale real entry from earlier manual sessions can leak into test behavior. Current mitigation (used by the new T-1189/T-1192 tests and the existing sweep smoke test): distinctive synthetic body_ids. Proper fix: give the viewer suite the same injectable cache-root seam the request suite has (constructor/setter injection through StepCanvasRequest), and migrate the synthetic-body_id tests onto it. Small, test-only.
First slice landed 2026-07-25 (main, 9ac98542d) via a live incident: PR #211''s gate failed on test_step_canvas_viewer''s two before-any-canvas tests because user://atlas_cache/ is machine-shared (every worktree gate, live capture driver, and play session write the same directory) and the T-1183 disk lookup short-circuits before test_mode''s no-op IPC a concurrent GJ380c Global live capture (T-1157 eyeball work) warmed the exact key the tests assume cold. Fix: StepCanvasViewer.disk_cache_root_override threading into StepCanvasRequest''s existing test-injection seam; viewer + legend suites route construction through _make_viewer() helpers pinning isolated roots. REMAINING for this ticket: screen-constructed viewers (RegionalScreen builds its viewer internally no override path), and any future suite constructing viewers directly should use the helper pattern; consider a gdUnit-wide guard (e.g. a shared test base or a lint) so new suites cannot silently ride the shared root.', 'backlog', 'low', NULL, 'client', NULL, '2026-07-25 10:52:37.833', '2026-07-25 18:45:59.847', NULL, '00c87aff1d2d9c4406944b52fd04c6f0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);