{"_id":"@bycrux/timeline-core","_rev":"7-54b8e4e7ce01a0663af3932dea5496f8","name":"@bycrux/timeline-core","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@bycrux/timeline-core","version":"0.1.0","_id":"@bycrux/timeline-core@0.1.0","maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"dist":{"shasum":"d784cf79d262361d2d4565b082a04c461d3f2cc6","tarball":"https://registry.npmjs.org/@bycrux/timeline-core/-/timeline-core-0.1.0.tgz","fileCount":47,"integrity":"sha512-LiQZvUOlVoJmcKfasWqdhKDXZ823D8NsYRMXm2ROlo4KBSHE7ZE1g4uWYdMTurxZvBmZGNB9CGsjkawUc8q4Sw==","signatures":[{"sig":"MEUCIQCwhfu/gQRd/Yu5tR1B5lJwN+RJ3VcNwImdda5SjzLs6wIgZXzi8sJFRZSBZoqm3EhI4+Yu78mNZB7drtZEsYUUvkY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423852},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"gitHead":"0936e5443eaf53587a38e9e181963fdb4aa82bc6","private":false,"scripts":{"test":"node --test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sampadilla","email":"sam@bycrux.com"},"_npmVersion":"11.6.0","description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","directories":{},"sideEffects":false,"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/timeline-core_0.1.0_1787764194963_0.8356993162113602","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bycrux/timeline-core","version":"0.2.0","_id":"@bycrux/timeline-core@0.2.0","maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"dist":{"shasum":"0acdfe514a6afd6f6c003c47b4784a214473d309","tarball":"https://registry.npmjs.org/@bycrux/timeline-core/-/timeline-core-0.2.0.tgz","fileCount":50,"integrity":"sha512-9Ej/5G+tm1DnzHg/m8JEv7lUhfphUo0v0a676kVNwc3fbDELTbifDuMyJ7LJexbZU11F/3EWBUhKlwOmCGSUdQ==","signatures":[{"sig":"MEYCIQDq04Q6FwP0j0cV1M76mLSPc1A1Fu/094fpjOsl6F/tXwIhAK55txSfpapx1NSr1VMmZ6R/UgV/YhrDAoprG6NXLEMe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":482796},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"gitHead":"87de7cdbd81d0980b16b67e7a708bf4c413b5b60","private":false,"scripts":{"test":"node --test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sampadilla","email":"sam@bycrux.com"},"_npmVersion":"11.6.0","description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","directories":{},"sideEffects":false,"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/timeline-core_0.2.0_1787813760634_0.014120184609174524","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bycrux/timeline-core","version":"0.2.1","_id":"@bycrux/timeline-core@0.2.1","maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"dist":{"shasum":"e017eac05b9febc05b24a1780a704340b71b9922","tarball":"https://registry.npmjs.org/@bycrux/timeline-core/-/timeline-core-0.2.1.tgz","fileCount":50,"integrity":"sha512-74VnbJRcDNxWDwdIBwdK825FU5e4db2m5oFtt5B8B1McXVgwi9JXejEvES8TETkQkS0MBzC60or49EAnbDEh3g==","signatures":[{"sig":"MEUCIQDFO7/Wev23fWoqA1mfH5YAYqUJWxcRS6BIbfoghmonYAIgElse8mk7y1GtAHsvcW8GR+63qifwVA4nuAUHH5jmREc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":483335},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"gitHead":"f1a2345e70ed829a145c4f0baaa243c1b95bc6e1","private":false,"scripts":{"test":"node --test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sampadilla","email":"sam@bycrux.com"},"_npmVersion":"11.6.0","description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","directories":{},"sideEffects":false,"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/timeline-core_0.2.1_1787898642272_0.9748805163812062","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bycrux/timeline-core","version":"0.2.2","_id":"@bycrux/timeline-core@0.2.2","maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"dist":{"shasum":"19b863a9b23f2bd654566706645f5cf8c0d96d4e","tarball":"https://registry.npmjs.org/@bycrux/timeline-core/-/timeline-core-0.2.2.tgz","fileCount":50,"integrity":"sha512-gDKfpvls9ojKN0ZWcSuSRJyOMrGtsSRN5FM7BzbPyB39iZQy3mniFVR2+ppEvqra6WQWre+yjILa2gbwrTsaMA==","signatures":[{"sig":"MEUCIQDpNypfuzGr9zOffGIjRRTZauIjB1WV+2WhaiB6WMeQEwIgOcVpBIMnw9IQPXScnJWhhoVi8KAG6oc/mwAUOgGNnxM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICa2NsMSKFkg1PXL5jq7nkjkaXIlDK+sG9Gg0uXYexwdAiEA9LPZj/W1aLpfedJ43119ZfkKmqpZYQj9YRrI75IBANo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":483335},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"gitHead":"a79ea8a53362a2f24a1b3c7679d5573f8799cdb4","private":false,"scripts":{"test":"node --test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sampadilla","email":"sam@bycrux.com"},"_npmVersion":"11.6.0","description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","directories":{},"sideEffects":false,"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/timeline-core_0.2.2_1790407953293_0.09052330636570582","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@bycrux/timeline-core","version":"0.2.3","_id":"@bycrux/timeline-core@0.2.3","maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"dist":{"shasum":"112bb6ce97ecd0580dfcd4589008551fc6d70ce4","tarball":"https://registry.npmjs.org/@bycrux/timeline-core/-/timeline-core-0.2.3.tgz","fileCount":50,"integrity":"sha512-gvxlQmYgk2OhSw+LPMUJ7+4wIPc+A/oSqQ1wG0xV0X7X/lJXFkqedoBkx6xw2FIyArlbRpXz9rIYheq7xnVf7w==","signatures":[{"sig":"MEYCIQCsvZQ9E2IJZ0vDio/jlqPKN7aAw+HzuGN11smFbj7omAIhAIdW0UixhVk6z72kosDigGm3FFl1ZLylHzNyA2ef6hMb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDcSkazRFbQXVAubko5IC15d7McCE8ZmJeNoTQVG36X+gIhAKFH41z5y00ihE+AgHi3ktD4DHDFkYED/XMRuTIR3fNS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":483335},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"gitHead":"7cf2d1f8accbe546980ca5eeec818a73e1dceba2","private":false,"scripts":{"test":"node --test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sampadilla","email":"sam@bycrux.com"},"_npmVersion":"11.6.0","description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","directories":{},"sideEffects":false,"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/timeline-core_0.2.3_1790495310550_0.5432029598551948","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bycrux/timeline-core","version":"0.2.4","_id":"@bycrux/timeline-core@0.2.4","maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"dist":{"shasum":"c33db8b73af88b2a8526e3b0b7c6f308c16716db","tarball":"https://registry.npmjs.org/@bycrux/timeline-core/-/timeline-core-0.2.4.tgz","fileCount":50,"integrity":"sha512-OYqD1+uYDbJ0rhtyAetmW35uL2XX67rh0mutfSdUbGb2gNrRIRLVTRYhtTaakMAvIUbYT8GQqPeOCatGTGcWHw==","signatures":[{"sig":"MEYCIQD5LPDpHneEr/QgEXZCgL8cP+NHDf/Z0gg7pKoAFIv5rAIhALecNrBUcBZ2PHkLmA0Fi0U/taCBZ4+as31b1H5YwwRx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDALdo4X3E46NA9J1ohM04xNgU8NLWBz0ylEsNgLP10BgIhAJ9xKFBxtHuvK4llDH6ZtftUsq3+HbkavyCvcSvuBln/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":483728},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"gitHead":"4583335c938914a1f1efbb4817317314121b6062","private":false,"scripts":{"test":"node --test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sampadilla","email":"sam@bycrux.com"},"_npmVersion":"11.6.0","description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","directories":{},"sideEffects":false,"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/timeline-core_0.2.4_1790634286212_0.7873472958075771","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@bycrux/timeline-core@0.3.0","dist":{"shasum":"143fb9bc0f2964acf949f5e35aece56370fcdd37","tarball":"https://registry.npmjs.org/@bycrux/timeline-core/-/timeline-core-0.3.0.tgz","fileCount":50,"integrity":"sha512-ixJnG6g2RZnE9s8aCPaE99AdjJ1KeoFBvqROmXdtgm3aVBfRLjVY0aft/xH+BJ20yLUSS/giWA6nkFbRjkPw3A==","signatures":[{"sig":"MEUCIQCOnnhXzU3kFr4u5IWXXa1wlHUONmsSBI1dxGuPOqxf9QIgR+ibr+XEY1ibBHnCUExL3HV0Tk20Fn3Kd1ElOhRqmrE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDhRt6ar5ZxRuiV5pE5gIYBRtJwXKsOxm+/Z4LNSDO/NwIhAOPnZRd56VswONsJ5Oq53Nl0qjYgCSThMwZQ18sezQkM"}],"unpackedSize":495843},"main":"./index.js","name":"@bycrux/timeline-core","type":"module","types":"./index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"gitHead":"8b28f48066bdfe9db07732a73b7d3183380cfeaf","private":false,"scripts":{"test":"node --test","typecheck":"tsc --noEmit"},"version":"0.3.0","_npmUser":{"name":"sampadilla","email":"sam@bycrux.com"},"_npmVersion":"11.6.0","description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","directories":{},"maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"sideEffects":false,"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/timeline-core_0.3.0_1790828227588_0.8889150899397487"}}},"time":{"created":"2026-08-26T17:09:54.848Z","modified":"2026-10-01T04:17:07.855Z","0.1.0":"2026-08-26T17:09:55.141Z","0.2.0":"2026-08-27T06:56:00.774Z","0.2.1":"2026-08-28T06:30:42.442Z","0.2.2":"2026-09-26T07:32:33.398Z","0.2.3":"2026-09-27T07:48:30.652Z","0.2.4":"2026-09-28T22:24:46.315Z","0.3.0":"2026-10-01T04:17:07.701Z"},"description":"Pure, dependency-free resolver for \"what is on screen at time T\", shared by Montaj's editor preview, render engine, and sample-frame.","maintainers":[{"name":"sampadilla","email":"sam@bycrux.com"}],"readme":"# @bycrux/timeline-core\n\nPure resolver for \"what is on screen at time T\" — the single source of\ntruth shared by Montaj's editor preview, render engine, and\n`sample-frame.js`.\n\n## Rules\n\n- **Zero build step.** Plain JS ESM with JSDoc types (`// @ts-check`), plus\n  a hand-written `index.d.ts`. No `dist/`, no bundler, no `prepare` step.\n- **Zero runtime dependencies.** `devDependencies` is `typescript` only.\n- **Pure.** No `Date`, `Math.random`, I/O, or globals. Same inputs always\n  produce the same outputs. `tsconfig.json` omits the DOM lib on purpose,\n  so accidental `window`/`document`/timer usage is a compile error.\n- **`index.d.ts` is normative.** It is the contract this package\n  guarantees — read it before reading the implementation.\n\n## Commands\n\n```sh\nnpm install        # first time / after package.json changes\nnpm run typecheck   # tsc --noEmit, strict checkJs over index.js + src/**\nnpm test             # node --test\n```\n\n## The corpus (fixtures/, expected/, KNOWN-DIVERGENCES.md)\n\n`fixtures/*.json` is a shared, committed corpus of `project.json`-shaped test\nprojects — no fixture depends on a real file on disk, so it runs the same on\nevery machine and in CI. `expected/*.json` is the frozen golden output of\nrunning the resolver (`index.js`) over each fixture.\n`test/corpus.test.mjs` recomputes every golden fresh on each run and\ndeep-equals it against the committed file.\n\nThe suite is **hermetic**: nothing reachable from `test/**`, at any depth,\nimports outside this package. A test at the end of `test/activation.test.mjs`\nsection 3 walks the whole static import graph and enforces that, so the\npackage can be copied anywhere and its tests still pass.\n\nTo regenerate the resolver goldens after a deliberate resolver change:\n\n```sh\nnode scripts/regen-goldens.mjs\n```\n\nThen **hand-audit the diff** against the legacy code paths cited in\n`src/*.js`'s module headers and in `KNOWN-DIVERGENCES.md` before committing —\na regenerated golden is not self-validating; see `fixtures/README.md` for the\nfull corpus map (which fixture pins which bug/divergence) and the documented\nshape of `expected/*.json`, including the source-window golden shape).\n\n### ⚠️ `expected/encode-args.*.json` are frozen pre-SP2 artifacts\n\nTwo files under `expected/` are not resolver goldens:\n`encode-args.source-crop.json` and `encode-args.source-crop-missing-dims.json`.\nThey hold the **render pipeline's** output (`collectAllItems` + `planSegments`\n+ `encodeSegment(..., {_dryRun:true})`) captured **before** render was swapped\nonto this package, and they are the only artifact proving that swap did not\nchange what ffmpeg is asked to encode.\n\n`scripts/regen-goldens.mjs` cannot write them. They are checked by\n`montaj_assets/render/test/encode-args-golden.test.mjs`, which also owns the\nstaged-opt-in regeneration path: `--regen` plus the env var gets you a\ncomparison, never a write. A golden whose bytes still match is left untouched;\na golden whose bytes CHANGED is refused with a diff and needs a further\n`--i-am-deliberately-changing-render-output`. **Overwriting them destroys the\nrender-output-unchanged gate permanently** — the generator is now the resolver,\nso a regenerated golden only ever says \"the resolver agrees with itself\". If\nthat test fails, fix the render code. See `fixtures/README.md` for the full\nwarning.\n\n`KNOWN-DIVERGENCES.md` is the registry of places where the editor preview and\nthe render engine already, independently, disagree with each other in\nproduction today. This package documents those; it does not fix them.\n","readmeFilename":"README.md"}