9 Commits

Author SHA1 Message Date
calesthio
9482eddeff fix: recover bounded defects from PR backlog 2026-08-03 02:14:01 -07:00
xucailiang
b9b9b82b64 fix: harden Kling integration verification
Isolate Kling contract tests from the singleton registry so discovery state cannot leak into later selector tests. Align lip-sync face, audio, and timing payloads with the current official API and extend the live smoke coverage.
2026-07-10 20:53:45 +08:00
xucailiang
5a23fe6cf5 Merge branch 'main' of https://github.com/calesthio/OpenMontage into codex/kling-official-phase-1 2026-07-07 15:03:07 +08:00
xucailiang
7c5dfdd31a Add official Kling API providers 2026-07-07 14:56:40 +08:00
calesthio
8fc3e9fbd1 backlot: fix dogfood findings + global type scale
Fixes surfaced by the "How Salt Changed History" run:

- Decisions rail showed a stale choice. Contract now requires a superseding
  decision_log entry when a logged choice changes mid-run; the board collapses
  by category+subject and renders the latest as current, tagged "revised"
  (AGENT_GUIDE Decision Communication Contract; board.js renderDecisions).
- Assets gate jumped by a draft render. The review surface is the filmstrip:
  render per-scene stills to snapshots/<scene_id>.png (scripts/atelier_snapshots.py)
  and STOP; the full/draft render is the compose stage, post-approval
  (checkpoint-protocol, bespoke-composition).
- Broken thumbnails / missing scenes. A .tsx "animation" asset is no longer a
  renderable visual — resolve snapshots/<scene_id>.* or a shot-spec placeholder;
  add <img onerror> fallback and a BESPOKE placeholder (state.py, board.js).
- Clicking a card video did nothing. .thumb video had no sizing, so the frame
  and click box drifted; add object-fit:cover. Click-to-play on the render-hero
  player; narration is clickable -> modal with the full text (board.css/js).
- Type too small everywhere. Add one --fs-scale (1.16) knob; every font-size is
  calc(px * var(--fs-scale)) so text scales proportionally and reversibly,
  verified for zero overflow at desktop + tablet widths.
2026-07-03 06:55:43 -07:00
calesthio
1d60f0da14 backlot: fix all five dogfood findings (F-01..F-05)
- F-01: cost bar crit (red) state past 90% of budget
- F-02: normalize() hardens fetched board state against sparse payloads
- F-03: /thumb 404s for videos with no extractable poster frame instead
  of serving raw video bytes
- F-04: checkpoint artifact path refs only resolve inside the project dir
- F-05 (board half): stall detection — in_progress stage with no disk
  activity >10min renders red 'stalled?' + header badge flips to STALLED?;
  verified against the real wedged why-cities-glow project
- eval harness from dogfood session committed (visual regression +
  interaction smoke, capture watcher, server/gate test suites) +
  regression tests for each finding; 46 backlot tests green, visual eval
  green (restage-before-capture note logged)
2026-07-02 08:22:03 -07:00
calesthio
811480d39b backlot: README showcase + screenshot pipeline, unlisted-stage placement fix
- README 'Watch It Happen' section with four staged screenshots (fictional
  demo productions, generated placeholder art — no private project content)
  + governance section notes enforced approval gates
- scripts/backlot_screenshot_stage.py: stages 4 demo projects in 4 pipeline
  states against OPENMONTAGE_PROJECTS_DIR and captures the shots with
  Playwright — reproducible README imagery
- lib/paths.py: OPENMONTAGE_PROJECTS_DIR env override (checkpoints, events,
  and the board all follow one root); backlot/state.py now imports it
  (was still defining its own copy — the exact drift the review warned of)
- undeclared-stage checkpoints (e.g. a legacy 'idea' run under a cinematic
  manifest) now slot into their canonical rail position instead of dangling
  after publish, drawn dashed + italic with an 'unlisted' note
2026-07-02 07:20:17 -07:00
calesthio
64e44612d9 backlot phase 3: in-browser replay, live-run fixes, simulation driver
- replay mode: scrub a completed run from checkpoint history + event
  timestamps — stage rail rewinds, script/storyboard/renders appear at
  their real moments, generating shimmer replays; ~20s full-run playback
- stage history_entries exposed in BoardState (powers replay + versions)
- entrance choreography plays on first paint only (not on SSE refreshes)
- live-run fixes found by driving a simulated production against the
  board: null rendered by native append, activity ticker showing closed
  starts as running, scene-id label handling for 'scene-N' ids
- scripts/backlot_simulate_run.py: drives a fake production through the
  REAL contract (init_project, in_progress heartbeats, gated
  awaiting_human -> approved, per-scene events, growing manifest) —
  live-board verification + demo driver
- backlot/README.md
2026-07-01 23:57:06 -07:00
calesthio
0f10381f2b feat(atelier): repo-root projects/, scaffolder, schemas (F1 + F3 + F5)
Closes the remaining three atelier audit gaps.

F1 — atelier projects live under repo-root projects/<slug>/ (the
established OpenMontage convention), not under remotion-composer/.
_render_via_atelier now auto-stages source files into
remotion-composer/projects/<slug>/ via mtime-skip copy when the entry
isn't already under the composer tree. Originally tried a directory
junction, but webpack walks up from the entry's REAL location to
resolve node_modules — junctions get dereferenced and module resolution
fails. Copy keeps source-of-truth under projects/, is invisible to the
user's project view, and is cheap (typical project is a few small .tsx
files). Output stays wherever output_path says. effective_entry is
returned in tool data for transparency.

F3 — scripts/scaffold_atelier_project.py generates the engine
boilerplate (index.tsx / Root.tsx / Composition.tsx / art-direction.md /
props template / README) ONLY. No creative content emitted — the
Composition.tsx is a deliberately blank black placeholder with prominent
TODOs. This removes the friction that nudged agents back to templated
mode while making it impossible to ship the scaffold unauthored (review
correctly flags black frames / silent audio as 'revise'). Verified
end-to-end: scaffold → render → review fires the right warnings.

F5 — schemas extended to know about atelier:
  - decision_log: 'composition_mode' added to category enum.
  - proposal_packet.production_plan: composition_mode + art_direction.
  - edit_decisions: composition_mode + bespoke{entry, composition_id,
    art_direction, props_path, public_dir, scale, crf, concurrency}.
  - final_review.checks: 'atelier' block (stock_reuse_detected,
    offending_imports[], art_direction_declared, art_direction).
  - final_review.recommended_action: 're_author' added.
  - final_review.transcript_comparison: allow null word_accuracy /
    transcript_matches_script (pre-existing latent bug surfaced here).
Both pass and fail shapes of the atelier render's final_review now
validate against the updated schema.
2026-06-27 11:15:36 -07:00