Turn the lane sideways without changing what it means
The cel sheet is a second projection of the same lane rows: frames run down, lanes run across, and each occupied cell carries the timeline cel's exact selection address. The shared action strip proves the point in the browser test by selecting a cell and issuing the existing hold command. Before exposing that second entrance, fix the boundary mistakes it revealed. Nested commands now convert the open playhead through their enclosing instance path. Overwrite composes blanking with non-rippling placement as one transaction. Picture-rate and pose sampling select only the generated base frame while hand corrections retain the node's authored frame. Stack validation follows covering replacement layers so a document accepted by the validator cannot throw solely because a later offset sees a different shape. 429 tests, 5,767 assertions; both browser flows; 56 Django tests; optimized frontend build.
This commit is contained in:
parent
7a54bfca56
commit
2f1c9b9c02
15 changed files with 387 additions and 100 deletions
|
|
@ -1,14 +1,14 @@
|
|||
# Lane and cel handoff
|
||||
|
||||
Status (2026-09-30): the lane model is implemented through its commands. Cels are
|
||||
ordinary nodes with their own playback clock, a lane draws them as one row, the
|
||||
cel commands all exist, and correction layers evaluate and survive regeneration.
|
||||
What is missing is a second view and the commands that make a correction.
|
||||
Status (2026-09-30): the lane model is implemented through its commands and its
|
||||
first two views. Cels are ordinary nodes with their own playback clock, the
|
||||
timeline draws them as one row, the cel sheet draws frames down and lanes across,
|
||||
and both views issue the same commands. Correction layers evaluate and survive
|
||||
regeneration. What is missing is the commands that make a correction.
|
||||
|
||||
Seven commits on branch `lanes`, off `624242b`. `master` is untouched and can be
|
||||
fast-forwarded. Each commit message is the argument for its change and is worth
|
||||
reading before touching what it did — they are the design record, more than this
|
||||
file is.
|
||||
The commits beginning at `3d3c1bb` are the argument for the model and are worth
|
||||
reading before touching what they did — they are the design record, more than
|
||||
this file is.
|
||||
|
||||
3d3c1bb An occurrence is a node, with a clock of its own
|
||||
9446829 Reuse, duplicate and make unique: deciding what is shared
|
||||
|
|
@ -65,10 +65,9 @@ decision, not a cleanup.
|
|||
and never shrinks it. Blanking the end of a shot leaves empty frames at the
|
||||
end, because deriving the window from the extent would make deleting the last
|
||||
drawing silently shorten the film. `lane/finish`.
|
||||
- **Placing ripples; overwrite is `blank` then `place`.** Overwrite is not a
|
||||
policy argument and should not become one until there is a reason `blank`
|
||||
cannot serve. An argument whose second value is unimplemented is worse than
|
||||
no argument.
|
||||
- **Placing ripples; overwrite is `blank` then non-rippling placement.**
|
||||
`lane/overwrite-drawing` composes those pieces as one transaction. Insertion
|
||||
retains its ripple rule; overwrite does not move any surviving cel.
|
||||
- **A position inside a cel refuses and names `split`.** One command must not
|
||||
quietly perform two. The UI offers the retry.
|
||||
- **A correction has no time space of its own.** Its `:support` and its values'
|
||||
|
|
@ -88,27 +87,19 @@ decision, not a cleanup.
|
|||
|
||||
## Next steps, in order
|
||||
|
||||
1. **The cel sheet.** The doc's own test that the document is separate from its
|
||||
presentation: frames down, a column per lane, one cell per frame naming the
|
||||
drawing. It needs NO new model — `symbol/lane-cels` and the existing commands
|
||||
are the whole API. The obligation is that the same command issued from the
|
||||
sheet and from the timeline produces identical document changes and the same
|
||||
selection. This is the recommended next piece: it is self-contained, it is
|
||||
specified, and it is the first real evidence the model is not shaped by the
|
||||
timeline that grew up with it.
|
||||
2. **The commands that make a correction** — Constant adjustment, Ramp, Return
|
||||
1. **The commands that make a correction** — Constant adjustment, Ramp, Return
|
||||
motion over a selected range, per `lane-model.md`. The evaluator is done and
|
||||
has no opinion about how a range or a motion shape is chosen, which is now a
|
||||
view question. A panel also needs to offer `clip/conflicts` for resolution.
|
||||
Note the one open question: a correction needs a stable `:id` from somewhere,
|
||||
and cel ids come from the caller because this namespace is pure.
|
||||
3. **Slip source and retime.** Both have real design questions open and the doc
|
||||
2. **Slip source and retime.** Both have real design questions open and the doc
|
||||
says to refuse rather than approximate: retime needs a defined warp and
|
||||
interpolation behaviour, and is not moving keys whose numbers happen to fall
|
||||
inside a selection.
|
||||
4. **Deleting reused content.** Reference discovery exists (`node/sources`,
|
||||
3. **Deleting reused content.** Reference discovery exists (`node/sources`,
|
||||
`clip/places`, `clip/contains-symbol?`); the policy does not.
|
||||
5. **Collaboration.** `lane-model.md` is explicit that one leaf per channel does
|
||||
4. **Collaboration.** `lane-model.md` is explicit that one leaf per channel does
|
||||
NOT solve two people editing different keys of the same channel. No conflict
|
||||
policy exists for that.
|
||||
|
||||
|
|
@ -129,9 +120,12 @@ decision, not a cleanup.
|
|||
- **`lane/lane-frame`** converts a symbol frame to a lane frame, or returns nil
|
||||
through a stepped or looping lane where there is no single answer. Nil refuses;
|
||||
it never snaps.
|
||||
- **`channel/conflict-with`** is the single rule for "can this layer apply to
|
||||
this base", used by the validator, by `conflicts`, and by the regeneration
|
||||
that marks them.
|
||||
- **`channel/conflict-with`** is the rule for whether one offset fits a base,
|
||||
used by `conflicts` and regeneration. Validation additionally follows prior
|
||||
replacement layers, so it cannot approve a stack that throws when read.
|
||||
- **Generated sampling applies to the base, not the hand correction.** Picture
|
||||
rate and pose selection may choose an earlier generated frame; correction
|
||||
support and values still read the node's current authored frame.
|
||||
- **Two test patterns worth copying.** `the-cursor-agrees-with-the-specification-in-any-frame-order`
|
||||
holds the optimized cursor to `value-at` in forward, backward and random order
|
||||
— add a case to it for any new channel shape. And `drawn` in `lane_test`
|
||||
|
|
@ -171,7 +165,7 @@ decision, not a cleanup.
|
|||
|
||||
From `frontend/`:
|
||||
|
||||
npx shadow-cljs compile test && node out/node-tests.js # 424 tests, 5,749 assertions
|
||||
npx shadow-cljs compile test && node out/node-tests.js # 429 tests, 5,767 assertions
|
||||
npx shadow-cljs compile app # the bundle Django serves
|
||||
npx shadow-cljs release app # then `compile app` again — see above
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
# The Lane Model
|
||||
|
||||
Revised 2026-09-30. Target design. Cel ownership, source playback, the
|
||||
content and cel commands, placement anywhere in a lane, a one-row cel strip
|
||||
and the correction-layer evaluator are implemented; the commands that produce a
|
||||
correction, overwrite, the retiming commands and the remaining views are not.
|
||||
content and cel commands, placement anywhere in a lane, overwrite, a one-row cel
|
||||
strip, a frame-down cel sheet and the correction-layer evaluator are implemented;
|
||||
the commands that produce a correction and the retiming commands are not.
|
||||
See the status note under
|
||||
[Proof obligations](#proof-obligations-and-implementation-order).
|
||||
|
||||
|
|
@ -530,22 +530,23 @@ re-measurement for good; and an incompatible offset threw in the read path,
|
|||
which would have taken the stage down on exactly the case the model says to
|
||||
report.
|
||||
|
||||
Still unbuilt: overwrite as a placement policy (which is now `blank` then
|
||||
`place`, composed inside one transaction), slip source, retime, and deleting
|
||||
reused content. A lane cannot hold AUDIO cels — `lane-problems`
|
||||
Overwrite is `blank` followed by non-rippling placement, composed inside one
|
||||
transaction; insertion keeps its ripple rule. Still unbuilt: slip source,
|
||||
retime, and deleting reused content. A lane cannot hold AUDIO cels — `lane-problems`
|
||||
requires visual ones, though this document says a lane may hold either and
|
||||
should reject only a mixture.
|
||||
|
||||
What is NOT implemented is a command that produces a layer — the doc's Constant
|
||||
adjustment, Ramp and Return motion — and with it the question of how a view
|
||||
offers those three over a selected range, and how it offers a conflict for
|
||||
resolution. Overwrite, the range and retiming
|
||||
commands (blank, trim, move, slip source, retime) and the cel-sheet view
|
||||
are also not implemented; a refusal is the current behavior where the model
|
||||
demands an explicit choice nobody has made yet. The suite stands at 424 tests
|
||||
and 5,749 assertions, with `frontend/test/browser/sequence.mjs` driving the
|
||||
editor through create, hold, overflow, undo, reuse, make unique, duplicate,
|
||||
split, insert, trim, move and blank. Rewrite tests that encode superseded
|
||||
resolution. Slip source and retime are also not implemented; a refusal is the
|
||||
current behavior where the model demands an explicit choice nobody has made yet.
|
||||
The cel sheet is the same projected cels and selection addresses with its axes
|
||||
turned: frames down and lanes across, so commands selected there and in the
|
||||
timeline have identical targets. The suite stands at 429 tests and 5,767
|
||||
assertions, with `frontend/test/browser/lane.mjs` driving the editor through
|
||||
create, hold, overflow, undo, reuse, make unique, duplicate, split, insert,
|
||||
trim, move and blank. Rewrite tests that encode superseded
|
||||
behavior rather than preserving behavior to keep them green.
|
||||
|
||||
Build small adversarial documents and test their domain operations before
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue