Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 54 additions & 1 deletion .claude/skills/t27f/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ the diagram core in detail, then the other surfaces and the topic-map applicatio
| Surface: particle reels and stills | `specs/t27f/token_floor*.t27`, `lesson_reel.t27`, `reel_particles*.t27` | rendered on the Railway lab (lesson 1 EN and RU); no renderer in the repo, no MCP tool yet |
| Surface: honeycomb map video and deck | `specs/t27f/reel.t27`, `deck.t27` | spec; stills only, through `t27f_view` |
| Application: topic map (#1677) | `specs/t27f/topic_engine.t27`, `topic_reel.t27` | spec; drawn through the map surface; procedure below |
| Application: content factory (epic t27#10560) | `specs/t27f/reel_factory.t27` (t27#10561) | spec with tests: an item's code and title, read keyword by keyword, give 11 features. Those pick 1 of 12 scene archetypes (best pair first, cap 4, no repeat within 2 items, then the least-used generic scene) plus an accent, a motion, a layout and 8 output formats. No renderer draws a plan yet (R3), and `lesson_reel` still draws token_floor (R4). Lessons: read the plan's spread over the whole course before trusting it. A greedy walk in course order gave 7 lessons one scene. Code counts alone handed lesson 8 the tests scene over "A test block". Gate: `tri factory`. The plan prints from a separate module, `specs/t27f/reel_factory_plan.t27` (t27#10573): `t27c gen` it, then run the zig (t27c has no `run`). Names come from the factory's comma lists, so the law module keeps no `main`. Traps: the lab's `/root/t27` t27b can predate #10455 and refuse `std.debug.print` that master accepts, so build a fresh t27b in its own worktree with its own `CARGO_TARGET_DIR` before you call a print unsupported. `t27c seal --save` needs zig on PATH (`/opt/zig`). A base64 line fetched back from fs-lab merges with the Railway warning, so wrap it as `B64:...:END`. A new `tri` arm must start its own line (` name)`) or the documented-commands checker misses it |
| Application: content factory (epic t27#10560) | `specs/t27f/reel_factory.t27` (t27#10561) | spec with tests: an item's code and title, read keyword by keyword, give 11 features. Those pick 1 of 12 scene archetypes (best pair first, cap 4, no repeat within 2 items, then the least-used generic scene) plus an accent, a motion, a layout and 8 output formats. R3 (t27#10571) draws it: `scene_raster`, `scene_lex`, `scene_bg` plus one `scene_<archetype>.t27` per archetype (code, graph, tests, trit, loop, branch, data, links, guard, title, task, map), each `<name>_px(t, acc, n, x, y)` over the lesson's own content on a 360 x 640 canvas, dispatched by `scene_still.pixel`; `still_gate.t27` renders the 27 course-0 stills (108 x 192 luma), scores all 351 pairs with a block SSIM and refuses above 850 permille, measured worst pair lessons 8 and 20 at 607. `lesson_reel` still draws token_floor (R4). SSIM on luma sees layout and contrast, not meaning. The floor modulo is `fmod` (t27b rejects `@mod`). Lessons: read the plan's spread over the whole course before trusting it. A greedy walk in course order gave 7 lessons one scene. Code counts alone handed lesson 8 the tests scene over "A test block". Gate: `tri factory`. The plan prints from a separate module, `specs/t27f/reel_factory_plan.t27` (t27#10573): `t27c gen` it, then run the zig (t27c has no `run`). Names come from the factory's comma lists, so the law module keeps no `main`. Traps: the lab's `/root/t27` t27b can predate #10455 and refuse `std.debug.print` that master accepts, so build a fresh t27b in its own worktree with its own `CARGO_TARGET_DIR` before you call a print unsupported. `t27c seal --save` needs zig on PATH (`/opt/zig`). A base64 line fetched back from fs-lab merges with the Railway warning, so wrap it as `B64:...:END`. A new `tri` arm must start its own line (` name)`) or the documented-commands checker misses it |
| Related | trinity#1647 dashboards, #1652 MVP research, #1653 three skills, #1655 evolution runtime | open |

When asked "how is T27F going", report against the core rows first, then the other surfaces.
Expand Down Expand Up @@ -220,6 +220,22 @@ Traps from this tick (ffmpeg on the lab):
`lit_len` that was red on `duplicate-bodies` until #10688. Reuse the existing body through
`use`, and do not `--bless` a copy you made by accident.

## Visual in every output (Claude Code and TRI CLAW)

**The rule is `specs/t27mcp/visual_output.t27`** (its `RULE_CLAUDE_CODE` and `RULE_TRI_CLAW` lines
are what each host reads). **Its particle-still layer is `specs/claw/visual_output.t27`.** This
section is the order of steps; which answer carries which visual and how it reaches each host are
the specs', not repeated here.

1. Decide the answer's kind (`K_*` in the t27mcp spec). A one-sentence reply or a question back
goes without a visual.
2. Spec, flow or numbers: draw from t27f tool rows (`t27f_outline`, `t27f_graph`, `t27f_view`),
labelled, with the legend and the source file, as `answer_verdict` checks.
3. A report of a piece of work: a particle still (`takes_still`). Render the reel on the Railway lab
(never the Mac), take the frame at `STILL_MS` with `ffmpeg -ss 9 -frames:v 1`, and bring it into
the session folder (`out-reels/`, gitignored, never `git add`).
4. Anything not made: say which and why in the answer. Never show an older file as this turn's.

## Application: topic map (gHashTag/trinity#1677)

Use this part when the user gives a topic or a client brief, not a spec.
Expand Down Expand Up @@ -343,6 +359,43 @@ Before you change a uniqueness rule, measure what it can draw from:
shell heredoc, such as a PR body that mentions tests. Write the body with the Write tool, then
pass `--body-file`.

### Preview the factory's stills as a video (t27#10571)

The owner asks to see intermediate videos, not only numbers. Show one every time a renderer changes.

1. **Write a lab-only printer.** It needs a `main` that loops `t` over `TOPICS`. For each lesson it
takes `arche`, `accent`, `motion`, `layout` and `content(t, a)` from `reel_factory`. It then
prints a plain PPM (`P3`, 360 x 640) of `scene_still.pixel(...)` through `scene_raster`'s
`red`, `green` and `blue`. Give it one trivial `test`.
2. **Generate and build.** Run `t27c gen` on it, then `zig build-exe -lc -O ReleaseFast`.
3. **Run it.** `./d 2> all.ppm`: `std.debug.print` writes to stderr. All 27 stills take 4 s and
56 MB.
4. **Split and convert.** Split the dump on each `P3` line with awk. Convert each part to PNG with
ffmpeg, which reads P3.
5. **Make the video and the sheet.**
- Video: `ffmpeg -framerate 1.25 -i s%02d.png` with
`-vf scale=720:1280:flags=neighbor,fps=30,format=yuv420p` and libx264. This gives 21.6 s.
- Contact sheet: `-vf scale=120:213,tile=9x3 -frames:v 1`.
6. **Fetch them.** Bring both back wrapped as `B64:...:END`, and compare sha256 on both ends.
Put them in the session's notes folder, never in the repo or `out-reels/`.

Measured at 355d44a39: each still has 9 to 14 flat colours, and the PNGs are 4 to 32 KB.

**Traps:**

- **A Mac session may not read images.** A hook can block image reads because the upstream
provider refuses them. Check the stills by numbers (colour count, file size, ffprobe) and open
the file for the owner in the file pane.
- **WIP commits can sink a PR.** A WIP commit whose message names `#N` without a linking keyword
fails L1. `l1-traceability.yml` checks every non-merge commit, and the history cannot be
rewritten. Carry the work instead:
1. Make a new branch from master.
2. `git read-tree -m -u HEAD <merged-branch>`.
3. Make one commit with `Closes #N`, open a new PR, and close the old one with a pointer.
- **Merge in the right direction.** Merging master into an old branch can trip the pre-commit
`foreign-budget` hook on master's own Rust lines (t27#10414). Merge the old branch into a
master-based branch instead. The result still fast-forwards the old branch.

## Check the whole corpus for import cycles (t27#10693)

dependency-cruiser's `no-circular` and madge's `--circular` list every module on a cycle.
Expand Down
49 changes: 49 additions & 0 deletions .trinity/seals/claw_ClawReelStill.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"built_by": "t27c-bootstrap@0.5.2+5e4d3b998",
"closure": [
{
"spec": "specs/claw/visual_output.t27",
"spec_hash": "sha256:17137afe136e39910f38d7b031c659a672e009bfeef1bf4f9b7af7e2cb6cc628"
},
{
"spec": "specs/t27f/frame_shard.t27",
"spec_hash": "sha256:1f04638a243b7a7f4d7a4480faf85f7878ca2e3365a2ec0f001a991fbd353da6"
},
{
"spec": "specs/t27f/reel_topics.t27",
"spec_hash": "sha256:7c1762cde96524791711594d23f880fbad1f497a499277710f1fd61d52d50157"
},
{
"spec": "specs/t27f/token_floor_scenes.t27",
"spec_hash": "sha256:948cff4bd34341b40b43c8a170e2a37e3bca59f8d6bc8e35d7e5ee43fe89a4ea"
},
{
"spec": "specs/t27mcp/service.t27",
"spec_hash": "sha256:3d7957837be8ac3de14b18ce1c0ecdde805f3f71d4d801b62d476b2e82f4a1ae"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:d32a87a4218806616b04b727d7e3f1bc76d6d33440f304f7beb42b566bb50437",
"gen_hash_rust": "sha256:5a1adebb39cdeb948aae1da51a64f43b93b1cd845f715389c30cf6785b701c30",
"gen_hash_verilog": "sha256:62df937cda4af6426ae5e1170bafa4cf124f5d952dea6b87ccf19e451968dc9f",
"gen_hash_zig": "sha256:b4e20621dcef2e6517948018e7f6aeb788da068df27beb9b6c2a485af15b492e",
"module": "ClawReelStill",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T17:06:53Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:4fc5fc3c835193faae7b312194e4f31bc6baa8b7da3f08b12b809cb4e5e293e5",
"spec_path": "specs/claw/reel_still.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 15,
"total": 15,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:1982ae948e24d00c5d221ccec12dfce1eb01204b53e37b0f857f93b16d64629d",
"zig": "0.16.0"
}
}
37 changes: 37 additions & 0 deletions .trinity/seals/claw_ClawVisualOutput.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [
{
"spec": "specs/t27f/reel_marketing.t27",
"spec_hash": "sha256:ab07f6476d900cc0e089ba1d851f0b610a77b778f00fd906d1b98a29281941c7"
},
{
"spec": "specs/t27mcp/visual_output.t27",
"spec_hash": "sha256:06c1c5e73142e2f79fa5d7be037eace63c1f20597a6e33274ebf8e1b428b7584"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:195d1b6aa754842316d3c8becc34ce6a0a90e5f7d4ddaebd490823103ed06c33",
"gen_hash_rust": "sha256:93ecd121c7efadf95e4ca54e1e750fb5c7a8159284cebe1cbb61d7065d1b7875",
"gen_hash_verilog": "sha256:794e86d5753efad530cd7732b2638ad3c3a5c4e6d8c9a851bd686663aa097282",
"gen_hash_zig": "sha256:d6204f6e99bc281a0163177b92ee4abf096ea32cb23cb3b817913d16c8d072b1",
"module": "ClawVisualOutput",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T16:42:30Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:17137afe136e39910f38d7b031c659a672e009bfeef1bf4f9b7af7e2cb6cc628",
"spec_path": "specs/claw/visual_output.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 6,
"total": 6,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:1982ae948e24d00c5d221ccec12dfce1eb01204b53e37b0f857f93b16d64629d",
"zig": "0.16.0"
}
}
33 changes: 33 additions & 0 deletions .trinity/seals/t27f_scene_bg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [
{
"spec": "specs/t27f/scene_raster.t27",
"spec_hash": "sha256:7be7118d865aa65fd1ccb989ab160df2feb46c9ded0a15ca6510b747301ee4a6"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:af5c89e6bd6c81265d9d86c4f93eeb738ea91bfae40f294928bd586d5e98e7d0",
"gen_hash_rust": "sha256:b919e5036e999c0a6f329d928c954691083b2b139fe82ff160dabee993a6d1e8",
"gen_hash_verilog": "sha256:4470ad8b1d224134c143e03ce299f04c18dcfe61a47dfa036f9b7410f3568a6d",
"gen_hash_zig": "sha256:6b42744f7cacf6a9dd8efefee85de697a6a40137a0b4964285589c10e42f14c0",
"module": "scene_bg",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T18:19:09Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:be66b1113d05d634b2bfb26a1b3d455e2a24b1fd5a4f98da28c9e821978be1cf",
"spec_path": "specs/t27f/scene_bg.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 5,
"total": 5,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10",
"zig": "0.16.0"
}
}
41 changes: 41 additions & 0 deletions .trinity/seals/t27f_scene_branch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [
{
"spec": "specs/t27f/scene_bg.t27",
"spec_hash": "sha256:be66b1113d05d634b2bfb26a1b3d455e2a24b1fd5a4f98da28c9e821978be1cf"
},
{
"spec": "specs/t27f/scene_lex.t27",
"spec_hash": "sha256:a531db018ba0776b1d044fe39b323ba9f8c739fc60b06b57f6bab538022585c9"
},
{
"spec": "specs/t27f/scene_raster.t27",
"spec_hash": "sha256:7be7118d865aa65fd1ccb989ab160df2feb46c9ded0a15ca6510b747301ee4a6"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:07f5247c4f8578519a9d66081d2622a8350a7fbd467c4bc7c81d8e21c3c0100e",
"gen_hash_rust": "sha256:812a8d57ed2554ba33bb71e8f0194f5c65c7db268713b10823c61cbc6eae7261",
"gen_hash_verilog": "sha256:f4f5ef5ca03bb0f14c3e6279f8134fdd5c83f4c5c9632fc2c55382415eee8855",
"gen_hash_zig": "sha256:928740ee46a8f715527f4e4f4476abc9f95d323ab016878d8f7054f0961850a3",
"module": "scene_branch",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T18:19:18Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:c4b584b8b5a4f5cc849dc9c1a4323609702adcdb710cb97b6441059210eccc15",
"spec_path": "specs/t27f/scene_branch.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 4,
"total": 4,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10",
"zig": "0.16.0"
}
}
45 changes: 45 additions & 0 deletions .trinity/seals/t27f_scene_code.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"built_by": "t27c-bootstrap@0.5.2+355d44a39",
"closure": [
{
"spec": "specs/t27f/reel_topics.t27",
"spec_hash": "sha256:7c1762cde96524791711594d23f880fbad1f497a499277710f1fd61d52d50157"
},
{
"spec": "specs/t27f/scene_bg.t27",
"spec_hash": "sha256:be66b1113d05d634b2bfb26a1b3d455e2a24b1fd5a4f98da28c9e821978be1cf"
},
{
"spec": "specs/t27f/scene_lex.t27",
"spec_hash": "sha256:a531db018ba0776b1d044fe39b323ba9f8c739fc60b06b57f6bab538022585c9"
},
{
"spec": "specs/t27f/scene_raster.t27",
"spec_hash": "sha256:7be7118d865aa65fd1ccb989ab160df2feb46c9ded0a15ca6510b747301ee4a6"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:0b9d11f541d4132c344e9aded91f469399764a825d271e34fa78138b7aea86aa",
"gen_hash_rust": "sha256:479ca5aa9855ebd44aa5471279198a461e5d30af58dc2f90d3fd6f701938b3ce",
"gen_hash_verilog": "sha256:a5d02777b276f447a6ccf5c0a86ac19753e330abf24f261bbe63eca9fcb84967",
"gen_hash_zig": "sha256:1e48318493f0e8a33c8c26df570f7022aa6e543b46ff3ae70b2efa761213dab3",
"module": "scene_code",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-19T01:53:07Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:dd7cf9c7c59588acff9e39f278ca1effc75b59da184063923a83463102d21525",
"spec_path": "specs/t27f/scene_code.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 4,
"total": 4,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10",
"zig": "0.16.0"
}
}
41 changes: 41 additions & 0 deletions .trinity/seals/t27f_scene_data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [
{
"spec": "specs/t27f/scene_bg.t27",
"spec_hash": "sha256:be66b1113d05d634b2bfb26a1b3d455e2a24b1fd5a4f98da28c9e821978be1cf"
},
{
"spec": "specs/t27f/scene_lex.t27",
"spec_hash": "sha256:a531db018ba0776b1d044fe39b323ba9f8c739fc60b06b57f6bab538022585c9"
},
{
"spec": "specs/t27f/scene_raster.t27",
"spec_hash": "sha256:7be7118d865aa65fd1ccb989ab160df2feb46c9ded0a15ca6510b747301ee4a6"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:a325d308d3fa644afc3a8c32572ee2c57454dd158b2f71334f15b019bccaa32b",
"gen_hash_rust": "sha256:f42475cad05b3992ff14f56c244a62e93569d442c823601e545b321b4592ce8b",
"gen_hash_verilog": "sha256:33650fcf0ac1cfc0c774466282467f6e6eb4c1ed0a39cf3cf5d671faac9fbf27",
"gen_hash_zig": "sha256:0071b9914207b81c1803d45cf4bce149535b8229ca2f7bf2f4fdf07a9323e8a1",
"module": "scene_data",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T18:19:19Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:7187e6822bce5126c69b0bfaa9b3fb7a48aa8dc29fe60f5367d4220144966534",
"spec_path": "specs/t27f/scene_data.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 4,
"total": 4,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10",
"zig": "0.16.0"
}
}
41 changes: 41 additions & 0 deletions .trinity/seals/t27f_scene_graph.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [
{
"spec": "specs/t27f/scene_bg.t27",
"spec_hash": "sha256:be66b1113d05d634b2bfb26a1b3d455e2a24b1fd5a4f98da28c9e821978be1cf"
},
{
"spec": "specs/t27f/scene_lex.t27",
"spec_hash": "sha256:a531db018ba0776b1d044fe39b323ba9f8c739fc60b06b57f6bab538022585c9"
},
{
"spec": "specs/t27f/scene_raster.t27",
"spec_hash": "sha256:7be7118d865aa65fd1ccb989ab160df2feb46c9ded0a15ca6510b747301ee4a6"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:970e740bc66feb58d25d6a6c00dbbb68f04591d579ff9653927ebe360fc5ddc5",
"gen_hash_rust": "sha256:df9e11ebaa9016d09dd8de06397d531fe0825509137183537e3afe922115ee4c",
"gen_hash_verilog": "sha256:5cae54c058c0dfc82c481516fee95ff46f84c92adef1c254ea3fbbeae244a948",
"gen_hash_zig": "sha256:19b0aec74782b50d6ea48603e4ce51e3317f44a5ae4cbcde63cb48ffd9965767",
"module": "scene_graph",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T18:19:12Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:ae37d6259842a3b6854548adff272260a35a8c7652c509f952ed1908b94d5706",
"spec_path": "specs/t27f/scene_graph.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 4,
"total": 4,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10",
"zig": "0.16.0"
}
}
Loading
Loading