Observation
- Project sequence
- 19
- Observed
- 2026-08-29 07:26:24.356Z
- Source
- upstream · https://jamjar.dev/mmm/v0
- Previous commit
- mmm-observation:sha256:3de1bfc46db8da7a34b1cfb9fbabbf2db5f71930b40e48ba22821941ec143b8a
OBSERVED MMM COMMIT #280
CANONICAL RECORD VIEW
{
"backend": {
"author": {
"email": "drschwabe@fastmail.com",
"name": "Derrick Schwabe",
"time": 1787984747
},
"commit": "git:sha1:26518795fca299b777976f242d8127d41014e5a1",
"committer": {
"email": "drschwabe@fastmail.com",
"name": "Derrick Schwabe",
"time": 1787984747
},
"manifest": "mmm-manifest:sha256:6c62b61b92ebce5f375a662c7dd4d838dd24138a61d1fe6395be5e5e63891c01",
"message": "Add undo and redo\n\nCTRL+Z undoes, CTRL+Y and CTRL+SHIFT+Z redo. Moves, deletes, pastes, resizes\nand property edits all step back.\n\nHistory records a snapshot of state.nodes on every render/nodes where the\ndocument differs from the last one. Everything that changes anything already\nfires that event, so no module has to describe how to reverse itself, and\nanything added later is undoable without knowing history exists.\n\nSnapshots are cloneDeep, which is cheap even for meshes full of inline\nbase64: JS strings are immutable, so cloning an object holding one copies a\nreference. A snapshot costs one object per node; history caps at 50 steps.\n\nVolatile fields — selected, processing, template — are excluded from the\ncomparison, so clicking between nodes never becomes an undo step. A restoring\nflag stops a restore recording itself, and history resets on load so undo\ncannot reach into a mesh that is no longer open.\n\nThe canvas colour is not covered: it lives on state, not in state.nodes.",
"objectFormat": "sha1",
"parents": [
"git:sha1:1fb7a422d60eb5b07fa402cfea5badb3b46df745"
],
"ref": "refs/heads/master",
"summary": "Add undo and redo",
"tree": "git:sha1:25d567b811f13f8f546666eda10e64e83b602864",
"type": "git"
},
"issuedAt": "2026-08-29T07:25:37.165Z",
"previous": "mmm-revision:sha256:618fc65cfc305afe47838e6f517dbbbbe8d8a9e385917c32d4dc1ee0e6bd2998",
"project": "mmm1np06566gf6u8fpyj84u2emf25l98qad36700d2nlep6jzqdknp8qkyd3xu",
"protocol": "mmm/0-alpha",
"sequence": 19,
"type": "mmm/revision"
}