Close the remaining #24 gaps (#133–#137) #138

Merged
crowmaki merged 7 commits from issue-24-spec-gaps into main 2026-10-10 00:10:42 +00:00
Owner

Closes #133
Closes #134
Closes #135
Closes #136
Closes #137

This closes the last gaps in #24 that the audit found.

#133: Boards sent to H3 carry their Annotation layer

  • The new board_marks.rs draws each Panel's Notation symbols onto its Sketch, in the entry's colour, unless the Shot sends the clean sketch. board_images now uses it. A barred Panel is drawn first and fitted with bars after, so its marks line up.
  • Retired entries still draw. A freehand arrow that was never converted is left out: its reading is already Meaningless and kept out of the prompt, and an unexplained arrow would only confuse H3. This is recorded in CONTEXT.md.
  • No new Stale reason. Staleness hashes the bytes that are sent, so toggling clean already shows as a Board/Keyframes reason. A new staleness.rs test checks this.
  • The draw is byte-stable: only IEEE arithmetic and sqrt, with a pinned hash test. Boards with no marks keep their old bytes, so existing Takes don't go stale.
  • The Edit package Board stills come from board_images too, so they now carry the marks unless the Shot is clean.

Annotated Board as sent
Same Board with the clean toggle on

#134: New seed with original inputs on stale Takes

  • reroll_take takes RerollInputs::{Current, Original} (the RPC takes original_inputs: bool). Original rebuilds the job from the source Take's recorded inputs: references, Board, Keyframes, prompt, framing, frames and Performance slice. It records rerolled_from.
  • If a recorded input is no longer stored, it refuses with a clear message and queues nothing.
  • Take details and screening mode show "With original inputs" on stale Takes only. Batch new seed keeps current inputs.
  • Checked in the app: the new Take 1A-2 was queued, and it is stale for the same reason as 1A-1 (Lock snapshot 1 → 2).

Take details on a stale Take

#135: Over-budget badge on every Shot listing

  • The new OverBudgetBadge now replaces the inline badges in SetupsBlock, the Board view and ShotSlots.
  • New places: the Dailies coverage wall, the Animatic Line lane, and the Animatic Shot pickers (as text in the hint and the right-click menu).
  • Only forced drops count, as before. Existing core tests cover this.

Dailies coverage wall
Animatic Line lane

#136: Open a Project by double-clicking its .studio file

  • bundle.fileAssociations registers .studio as "AI Studio Project".
  • The single-instance plugin hands a second launch's .studio path to the running app. A relative path is taken from the launching process's folder.
  • A cold launch reads the path from argv. macOS RunEvent::Opened is handled too.
  • The window opens the file through the same path as File › Open, so ProjectLocked, missing-file, newer-schema and unreadable-file errors are the same.
  • No custom document icon. Tauri 2.12's FileAssociation has no icon field, so the OS shows the app icon. A custom icon would need a custom NSIS/WiX template or Info.plist.
  • Checked in the app: with the dev app running, I ran ai-studio.exe run-check-….studio from another folder. It exited at once, and the running window opened that Project.
  • Not checked: the installed association and a real double-click, and the macOS path.
  • Already on main and also hit through File › Open: if the window is on a Scene view when the Project changes, it shows "no scene …" for the old Scene id (visible in the screenshot below).

Running window after a second launch

#137: Carry the Project author into the Edit package

  • The Author field sits under Title in Project properties. Edits are undoable ("Change author"), and a blank author clears it.
  • manifest.json gets title and author. Scene and film .otio timelines carry them in metadata. An empty author is left out. FCPXML is unchanged.
  • Checked in the app: editing the author showed "Undo Change author", and Ctrl+Z restored it.

Project properties

Checks

  • cargo test --workspace --features studio-core/test-support: pass
  • bun run test: pass (286)
  • bun run check: 0 errors
  • I drove the UI changes in the dev app against a seeded demo Project, with a fake ComfyUI render for the Take.
Closes #133 Closes #134 Closes #135 Closes #136 Closes #137 This closes the last gaps in #24 that the audit found. ## #133: Boards sent to H3 carry their Annotation layer - The new `board_marks.rs` draws each Panel's Notation symbols onto its Sketch, in the entry's colour, unless the Shot sends the clean sketch. `board_images` now uses it. A barred Panel is drawn first and fitted with bars after, so its marks line up. - Retired entries still draw. A freehand arrow that was never converted is **left out**: its reading is already Meaningless and kept out of the prompt, and an unexplained arrow would only confuse H3. This is recorded in `CONTEXT.md`. - **No new Stale reason.** Staleness hashes the bytes that are sent, so toggling clean already shows as a Board/Keyframes reason. A new `staleness.rs` test checks this. - The draw is byte-stable: only IEEE arithmetic and `sqrt`, with a pinned hash test. Boards with no marks keep their old bytes, so existing Takes don't go stale. - The Edit package Board stills come from `board_images` too, so they now carry the marks unless the Shot is clean. ![Annotated Board as sent](https://git.crowmaki.me/attachments/892a880b-2e8e-4f1e-9454-607258fec607) ![Same Board with the clean toggle on](https://git.crowmaki.me/attachments/18373bbb-a371-425e-a2e7-7c95b37227b5) ## #134: New seed with original inputs on stale Takes - `reroll_take` takes `RerollInputs::{Current, Original}` (the RPC takes `original_inputs: bool`). Original rebuilds the job from the source Take's recorded inputs: references, Board, Keyframes, prompt, framing, frames and Performance slice. It records `rerolled_from`. - If a recorded input is no longer stored, it refuses with a clear message and queues nothing. - Take details and screening mode show "With original inputs" on stale Takes only. Batch new seed keeps current inputs. - Checked in the app: the new Take 1A-2 was queued, and it is stale for the same reason as 1A-1 (Lock snapshot 1 → 2). ![Take details on a stale Take](https://git.crowmaki.me/attachments/3ab57c53-d1cc-4284-b6cf-9656c5a2e7d4) ## #135: Over-budget badge on every Shot listing - The new `OverBudgetBadge` now replaces the inline badges in SetupsBlock, the Board view and ShotSlots. - New places: the Dailies coverage wall, the Animatic Line lane, and the Animatic Shot pickers (as text in the hint and the right-click menu). - Only forced drops count, as before. Existing core tests cover this. ![Dailies coverage wall](https://git.crowmaki.me/attachments/6a49a3a7-ee23-4830-8663-3f023169b3bd) ![Animatic Line lane](https://git.crowmaki.me/attachments/a4c0b9c4-7dca-4fa2-a402-6522cd7c39de) ## #136: Open a Project by double-clicking its .studio file - `bundle.fileAssociations` registers `.studio` as "AI Studio Project". - The single-instance plugin hands a second launch's `.studio` path to the running app. A relative path is taken from the launching process's folder. - A cold launch reads the path from argv. macOS `RunEvent::Opened` is handled too. - The window opens the file through the same path as File › Open, so `ProjectLocked`, missing-file, newer-schema and unreadable-file errors are the same. - **No custom document icon.** Tauri 2.12's `FileAssociation` has no icon field, so the OS shows the app icon. A custom icon would need a custom NSIS/WiX template or Info.plist. - Checked in the app: with the dev app running, I ran `ai-studio.exe run-check-….studio` from another folder. It exited at once, and the running window opened that Project. - **Not checked:** the installed association and a real double-click, and the macOS path. - Already on main and also hit through File › Open: if the window is on a Scene view when the Project changes, it shows "no scene …" for the old Scene id (visible in the screenshot below). ![Running window after a second launch](https://git.crowmaki.me/attachments/58ed5d9c-522a-40b0-950d-49e4f9586801) ## #137: Carry the Project author into the Edit package - The Author field sits under Title in Project properties. Edits are undoable ("Change author"), and a blank author clears it. - `manifest.json` gets `title` and `author`. Scene and film `.otio` timelines carry them in `metadata`. An empty author is left out. FCPXML is unchanged. - Checked in the app: editing the author showed "Undo Change author", and Ctrl+Z restored it. ![Project properties](https://git.crowmaki.me/attachments/2bce30fb-a639-49a5-96e7-05d0ce881a6a) ## Checks - `cargo test --workspace --features studio-core/test-support`: pass - `bun run test`: pass (286) - `bun run check`: 0 errors - I drove the UI changes in the dev app against a seeded demo Project, with a fake ComfyUI render for the Take.
Session::board_images now draws each Panel's Notation symbols over its
Sketch, in the entry's colour, unless the Shot sends the clean sketch.
The drawing lives in board_marks.rs and mirrors the editor's glyph
shapes. It uses only IEEE arithmetic and sqrt (no trig), so the same
Board, Notation set and ratio give the same bytes on every platform.
Marks are drawn on the Panel's own canvas before a barred Panel is
fitted with bars, so they stay aligned with the Sketch. Tiling and
one-slot-per-Panel both read board_images, so both carry the marks.
Retired entries still draw.

Decisions:
- Never-converted freehand arrows are left out. They mean nothing
  until converted, their reading is Meaningless and is already kept
  out of the prompt, and an arrow in the image that the prompt does not
  explain would only confuse H3. Recorded in CONTEXT.md.
- The clean toggle needs no new Stale reason. Staleness hashes the
  bytes board_slot_images sends, so toggling clean (and changing a
  symbol's colour) already shows as a Board/Keyframes reason when a
  Board has marks. A staleness test covers this.
- Subject names are not drawn as text; the prompt read-back carries
  them.
- Board marks: measure a dash with plain products instead of powi, so the
  draw keeps to IEEE arithmetic and sqrt as the module promises.
- A second launch resolves a relative .studio path against the launching
  process's directory, not the running instance's.
- Share the bring-forward steps and pass Project paths as paths.
The Line lane stacks a block's contents in a column, so the badge took
the text's row. It now sits beside the Shot label at the line's height.
crowmaki deleted branch issue-24-spec-gaps 2026-10-10 00:10:42 +00:00
Sign in to join this conversation.
No description provided.