Skip to content

Fix: Octatrack base, SRC SETUP's encoder E and the double-tap window for module machines (SETUP_ALL, LIST flags) - #943

Closed
npp1993 wants to merge 6 commits into
repeat98:mainfrom
npp1993:claude/ot-base-setup-all-list
Closed

npp1993 wants to merge 6 commits into
repeat98:mainfrom
npp1993:claude/ot-base-setup-all-list

Conversation

@npp1993

@npp1993 npp1993 commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Requested by Nathaniel

  • What was wrong or hard: Two things in the base's machine registry bit Analog BD over USB.
    • SRC SETUP's editor hook (mw_setup_edit6, taken from POLY8's shared hooks) leaves encoder E, slot 10, read-only for every module machine. That is POLY8's hidden slot, but it is Analog BD's HIGH, so HIGH never moved over USB (0.1.5 included).
    • A module machine without a pool opened its track's double-tap window on stock's sample list, which is empty for it. Its tracks are FLEX underneath, and stock picks the window's column from the track's type byte. The base then moved it to the machine list, which flickered; PICKUP opens straight on the list.
  • What this changes: Two opt-in machine flags, so POLY8, VECTOR, FM Synth and Analog BD 0.1.5 behave exactly as before.
    • MODWERK_MACHINE_SETUP_ALL (16) lets encoder E edit the machine's slot (mw_row_setup_all).
    • MODWERK_MACHINE_LIST (32) makes the window open on the machine list. A new owned site at 0x400788c4 (12 bytes, mw_chooser_column → mw_window_column) takes stock's column choice and keeps stock's rule for everyone else.
    • Also: events.json, the headers and EVENTS.md are regenerated; machine_ports.py knows the two flag names. The beta base is regenerated: b2810a87 after merging main at d6f1882b (Improvement: the Octatrack beta base carries the sample-editor service (Beat Slicer's base) #992's sample-editor service). It was 68e6a90b on main at fe5955b2, and cc74d638 before the first merge; the five base-bound packages only change requiredBase, and the machine recipes re-pin machine_ports.py.
    • The machines guide gets a note on SETUP two-state switches and the two flags.
    • The Analog BD 0.1.6 release that uses both flags follows as its own PR, stacked on this one.
  • How I checked it:
    • npm run pr:ready: Ready, after merging main (dbf75048, dd113bb7, and a9ae0de1 at d6f1882b). The last merge also re-pins the Tape Echo and Euclid standalone recipes to module-build.ts and the card-build assets Beat Slicer 0.1.66-experimental: first release, over USB on the base's sample-editor service #993 changed, without which octatrack:module-packages refuses. The base files were regenerated with their producers (events.py --write, npm run octatrack:base -- --beta --write, npm run octatrack:module-packages), not resolved by hand. Analog BD's controller hash is unchanged from main; only its source-policy hash moves (the machine_ports.py re-pin).
    • test_machine_registry.c covers both flags: a SETUP_ALL row, and the window column for a LIST machine, a pool machine, a stock FLEX track and a stock non-sample type.
    • ot_emu, card build: the double tap shows the machine list; T2's window switched to T1 shows the list; FLEX + RIGHT still opens FLEX's pool.
    • On a MKII, with this base plus Analog BD 0.1.6 (my build 9976a5e8, RAM boot, then flashed with 14 modules), reported by me (npp1993):
      • HIGH moves.
      • The double tap opens the machine list instantly with no flicker.
      • T2 → T1 shows the list.
      • The set survives a power cycle.
    • The run below is on 68e6a90b, this PR's base before Improvement: the Octatrack beta base carries the sample-editor service (Beat Slicer's base) #992 was merged in. Improvement: the Octatrack beta base carries the sample-editor service (Beat Slicer's base) #992 adds the sample-editor service and changes nothing in the machine registry; the run has not been repeated on b2810a87.
    • On a MKII, base 68e6a90b (this PR's merged base at the time, npm run octatrack:base -- --beta --out, identical to the committed package) RAM-booted over USB, with Analog BD 0.1.5 (7a1b08e8, flags off) kept, observed by me (npp1993), 27 Oct 2026:
      • Self-test passed: 1/1 module intact, longest frame 374 µs.
      • Double tap on a stock FLEX and a STATIC track opens their pool.
      • Double tap on a THRU and a PICKUP track opens the machine list.
      • Analog BD 0.1.5's double tap opens its 808/909 engine browser as before; encoder E on its SRC SETUP stays read-only.
      • Then flashed over USB (flash, written and verified into slot 2) and power-cycled: the unit started on 68e6a90b from the flashed slot (confirmed), Analog BD 0.1.5 still kept, self-test passed (1/1 intact).
      • With my other 13 modules reinstalled on top (Output Matrix and Recorder Loop Fix bound to 68e6a90b), all 14 are intact, but the self-test fails twice on CPU over 90 % (93.2 % and 93.1 %, named Air Chorus) with all 9 DSP effects running together. I have no run of this exact set on another base to compare, so I don't attribute it to this PR, which changes no DSP or tick code.
    • The earlier run above used 9976a5e8 (Analog BD 0.1.6-experimental: TYPE and FIXD switches, SETUP reorder, LPF OFF clockwise, 808 variation, leaner DSP #944's base) with Analog BD 0.1.6, not this PR's base.
    • Not checked: FM Synth, POLY8 and VECTOR on the unit (unchanged by design, flags off).
  • What the guides lacked or got wrong, and where I fixed it: docs/module-guides/machines.md did not say how to make a SETUP control a two-state switch, or that encoder E is read-only for module machines over USB. Added to the Track machines checklist.

🤖 Generated with Claude Code

…for module machines (SETUP_ALL, LIST flags)

The base's SRC SETUP editor hook (machine_registry.s, from POLY8's shared
hooks) left encoder E (slot 10) read-only for every module machine, POLY8's
hidden slot; Analog BD keeps HIGH there, so HIGH never moved over USB. A machine
now sets MODWERK_MACHINE_SETUP_ALL to edit it.

A track whose machine has no pool opened its double-tap window on stock's
(empty) sample list, because Analog BD and FM Synth tracks are FLEX
underneath; the base corrected it afterwards, which flickered. A new owned site
at 0x400788c4 (mw_chooser_column) lets a MODWERK_MACHINE_LIST machine open on
the machine list at once, as PICKUP does.

Both are opt-in: POLY8, VECTOR, FM Synth and Analog BD 0.1.5 are unchanged
(Analog BD 0.1.6 sets both). Beta base regenerated; the base-bound packages
only change requiredBase; the machine recipes re-pin machine_ports.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@repeat98

Copy link
Copy Markdown
Owner

Thanks, this reads well. Both flags are opt-in, nothing in machine-ports.json sets them here, the regenerated base matches its sources, and the host test covers the new paths. Two things before I merge:

  1. The unit run was on a different base. The MKII results are from 9976a5e8, which is Analog BD 0.1.6-experimental: TYPE and FIXD switches, SETUP reorder, LPF OFF clockwise, 808 variation, leaner DSP #944's base (it also carries Analog BD 0.1.6's controller policy). This PR publishes cc74d638, which no unit has booted yet. The new site at 0x400788c4 runs on every track's double tap, not only on module machines, so I'd like one short run on the base this PR finally publishes, with Analog BD 0.1.5 (flags off):

    • double tap on a stock FLEX and a STATIC track opens their pool
    • double tap on a THRU or PICKUP track opens the machine list
    • Analog BD 0.1.5's engine browser still opens, and encoder E on its SRC SETUP stays as it was
    • a power cycle keeps the set

    I can run this on my own unit if you can't; just say so. Then put the result in the description.

  2. Merge order. Analog BD 0.1.6-experimental: TYPE and FIXD switches, SETUP reorder, LPF OFF clockwise, 808 variation, leaner DSP #944 contains this commit, so this one goes first and Analog BD 0.1.6-experimental: TYPE and FIXD switches, SETUP reorder, LPF OFF clockwise, 808 variation, leaner DSP #944 right after it. Other base pull requests are ahead in the queue (Improvement: Octatrack base events for MIDI tracks' KEY (ev_midi_note_key, ev_arp_setup_knob, ev_arp_setup_text) #857 is ready now), so expect one merge of main and a rebuild of the base before this goes in. The unit run above should then be on that rebuilt base, not on cc74d638; I'll tell you its hash.

Everything else looks fine: the changelog entry is there, no event or table index is added (only one owned site in ot_machines, 48 to 49, and flag bits 16 and 32), and the other machines' recipes only re-pin machine_ports.py.

@repeat98

Copy link
Copy Markdown
Owner

#857 is in now, so this is the merge of main and the base rebuild I mentioned. Please merge main and regenerate the base files with their producers rather than resolving them by hand (base-binding.json, the elemod, the variants and the module packages conflict now). Then the short run from my earlier comment on that rebuilt base, with Analog BD 0.1.5. If you'd rather I do it on my unit, just say.

npp1993 and others added 5 commits October 27, 2026 10:24
Regenerated with their producers: events.py --write, then
npm run octatrack:base -- --beta --write (beta base 68e6a90b) and
npm run octatrack:module-packages (only requiredBase moved).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Regenerated with their producers: events.py --write, then
npm run octatrack:base -- --beta --write (beta base b2810a87) and
npm run octatrack:module-packages (only requiredBase moved). The Tape
Echo and Euclid standalone recipes re-pin module-build.ts and the
card-build assets repeat98#993 changed, or octatrack:module-packages refuses.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@repeat98

Copy link
Copy Markdown
Owner

Thanks for the run on 68e6a90b and for regenerating everything with the producers. One small thing: the new checklist line in docs/module-guides/machines.md points at EVENTS.md, which main renamed to HOOKS.md (sdk/machines/octatrack/HOOKS.md). The PR description has the same old name. Could you fix both? #944 picks the fix up when you merge it in there.

repeat98 added a commit that referenced this pull request Oct 28, 2026
…X2 swaps keep their block, with the fix/base-oct28 bundle and the Python firmware codec (#1017)

* Fix: Octatrack base, SRC SETUP's encoder E and the double-tap window for module machines (SETUP_ALL, LIST flags)

The base's SRC SETUP editor hook (machine_registry.s, from POLY8's shared
hooks) left encoder E (slot 10) read-only for every module machine, POLY8's
hidden slot; Analog BD keeps HIGH there, so HIGH never moved over USB. A machine
now sets MODWERK_MACHINE_SETUP_ALL to edit it.

A track whose machine has no pool opened its double-tap window on stock's
(empty) sample list, because Analog BD and FM Synth tracks are FLEX
underneath; the base corrected it afterwards, which flickered. A new owned site
at 0x400788c4 (mw_chooser_column) lets a MODWERK_MACHINE_LIST machine open on
the machine list at once, as PICKUP does.

Both are opt-in: POLY8, VECTOR, FM Synth and Analog BD 0.1.5 are unchanged
(Analog BD 0.1.6 sets both). Beta base regenerated; the base-bound packages
only change requiredBase; the machine recipes re-pin machine_ports.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP POLY8: the card machine chooser draws names and the mark by the list's row

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2-experimental: version and release notes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: card packages compiled from this tree

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: performance record wording and generated catalogue

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8: the card chooser's cursor reaches every machine row (UP/DOWN clamps to the last row)

Stock's five chooser UP/DOWN handlers clamp the machine list's cursor to
row 5. With POLY8 at row 5 and VECTOR, FM Synth or Analog BD after it, the
list scrolled but the cursor stayed on POLY8. The composition's count sites
now set each clamp to the last row (card builds only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: card packages compiled from this tree (cursor clamps)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8: the clamp pokes guard stock's moveq #5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: card packages compiled from this tree (clamp guards)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: USB port pins for the new source; its USB package rebuilds byte-identical and stays at 0.3.1

machine-ports.json pins POLY8's new manifest and shared-machine.s and lets the
base's ot_machines own the chooser-name pointer (0x4007865e). The machine
recipes pin that file, so their sources move; POLY8, VECTOR, FM Synth, Scale
Quantizer and Analog BD rebuild byte-identical. The card-only clamp pokes are
not in the USB form (Elekloader's port runs the manifest as octabam_poly8).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: release notes, changelog, README and manifest summary for the cursor clamps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: card packages compiled from the final tree

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: generated catalogue

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: native comparison (193 images, 87 refusals, 0 mismatches of 280 selections)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: testing record (emulator only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: the private VECTOR+FM group bridge takes the chooser-name pointer with the clamps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: owner approval (#842, #941, #942)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: card packages compiled from the merged tree

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Octatrack base: module machines can own their SRC SETUP page (SETUP_PAGE)

Over USB the base draws and edits SRC SETUP for every module machine row
(mw_setup_draw6, mw_setup_edit6) and shows the track's backing pool's
FLEX/STATIC setup there, so a machine with setup rows of its own (VECTOR's
page 2: SEED, SPAN, OFST, ROT, RPT, DIR) had none (#972).

A machine that sets MODWERK_MACHINE_SETUP_PAGE (64) contributes a
struct modwerk_machine_setup: the 80-byte struct modwerk_machine, ABI 1,
then two words, page(stock) and knob(index, delta). While SRC SETUP's
cursor is on its row and the current track is its own, the drawer shows
the page it returns and encoders A-F go to knob first (nonzero takes the
turn; 0 lets stock edit the backing pool's byte, with encoder E's rule as
before). Records without the flag are read exactly as before, and a base
without it reads the first 80 bytes, so POLY8, VECTOR 0.2.4, FM Synth and
Analog BD 0.1.5 are unchanged. Flags 16 and 32 stay free for #943.

machine_ports.py emits the two words for a port that lists SETUP_PAGE;
the registry's host test covers the row, track, flag and encoder rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR (USB package): SRC SETUP page 2 through the base's SETUP_PAGE record

VECTOR's port listed st_setup_draw6 and st_setup_edit6 in replaces (the base
owns those sites), so its own page 2 (SEED, SPAN, OFST, ROT, RPT, DIR) was
dropped from the package and SRC SETUP showed the stock FLEX/STATIC setup
on a VECTOR track (#972). The port now sets SETUP_PAGE and names the card
build's own st_setup_page and st_setup_knob, which the base asks on
VECTOR's row. st_setup_page's test that SRC SETUP's cursor is on row 5 (the
card's VECTOR row) is dropped in the package's source variant: over USB the
row is 5-8, and the base asks only on VECTOR's own row. control.s is
unchanged, so the card build is too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR 0.2.5-experimental: version, notes and its recaptured machine recipe

The USB package changes (SETUP_PAGE record, one test less), so VECTOR's
machine recipe is recaptured from the stock OS (hashes only; the eight
copies move by the 10 dropped bytes) and every machine recipe re-pins
machine_ports.py, machine-ports.json and vector_runtime.py. Card build
unchanged; the README gains a section at its end.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Octatrack base: the machine chooser's cursor reaches the last row

#922 made the double-tap TRACK chooser draw its rows from the list's scroll
offset, but stock's five UP/DOWN handlers clamp the cursor with moveq #5
twice each (0x40078c22, 0x40078cb0, 0x40078d2e, 0x40078dee, 0x40078e7c and
6 bytes on). With two or more machines the cursor stopped at row 5. The base
owns the ten bytes as ot_machines count sites and writes the last row, 4+n,
never below stock's 5 (addresses and guards as POLY8 0.3.2's card pokes).
The registry's host test checks the clamps for 0 to 3 machines; the
machines guide's chooser item and the base changelog say so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR 0.2.5: the MKII result over USB, recorded as a functional hardware report

The owner's unit, 27 October 2026, driven over USB by the coordinating
session on a development twin of the release base (e6e75d75, the b1b2ca58
build plus --dev): SRC SETUP page 2 draws and edits, the stock setup shows
on STATIC rows and tracks, Analog BD's page on its row. Recorded word for
word in TESTING.md and as the 0.2.5 qualification's functional hardware
report, with what was not tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR 0.2.5: the card UI captures cover 0.2.5 (its card build is 0.2.4's bytes)

The isolated build of 0.2.5 changes only version fields in the card
package assets: VECTOR's card build is byte-identical to 0.2.4's (image
cabcc296...), so its eight captures document 0.2.5 as they stand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR 0.2.5: tests and pins follow the release

vector.test.ts: 0.2.5 publishes a reported functional hardware result; the
9 October owner exception still covers only 0.2.4; the card evidence records
(captures, behaviour, persistence, core tests) stay 0.2.4's, bound to the
unchanged native source. The quick-test guide and the source-scope test pin
0.2.5; Analog BD's composition proofs take the new module source tree hash
(VECTOR's card bytes are unchanged). The changelog's known issue names what
the unit run did not cover.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR 0.2.5: the hardware report's source revision is this branch's 0.2.5 source commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Analog BD companion proofs re-exported natively for POLY8 0.3.2's source tree (212 rows identical; only moduleSourceTreeSha256 moves)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR 0.2.5 package; Octatrack beta base (SETUP_PAGE, chooser cursor clamps)

Rebuilt with npm run octatrack:base -- --beta --write on main. Analog BD's
trust row follows its source policy (machine_ports.py, machine-ports.json);
its package bytes are unchanged. The five base-bound packages only change
requiredBase (--base-only). VECTOR's USB package (18,354 bytes, sha256
45c962ca) is rebuilt alone with its strict stock-free scans.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* VECTOR 0.2.5: source-built card assets; Analog BD proofs' tree hash; module catalogue

Isolated Docker build (modwerk-source-tools) and modules:import
--development: only version fields move for VECTOR, its card bytes are
0.2.4's. Analog BD's composition proofs take the new module source tree
hash (as d0aab7e); modules:generate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Re-pin Tape Echo's and Euclid's standalone recipes to the rebuilt shared assets

VECTOR 0.2.5's isolated build changes version fields in dsp-packages,
descriptor-recipes, menu-recipes and rom-packages, which both recipes pin.
octatrack:module-packages -- --check: every published package identical
(Play Modes held at 0.1.1 as on main).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Analog BD native observations: re-pin module-adapters/machine_composition.py

The AB probe takes only machine_composition.FLAGS from that file, which POLY8
0.3.2 leaves unchanged; the diff touches POLY8's source pins and the private
VECTOR+FM bridge only, which the AB fixtures never build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tape Echo and Euclid standalone recipes re-pin the four rebuilt shared asset JSONs; both packages rebuild byte-identical

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP POLY8: the base's ot_machines owns the chooser's ten cursor-clamp bytes (replaces)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: the chooser's ten cursor-clamp bytes in both manifest forms; over USB the base's ot_machines owns them (needs fix/machine-setup-pages' base)

machine-ports.json replaces the clamps with the chooser-name pointer, so the USB
package leaves them out and rebuilds byte-identical (dc2ce372...) on a base that
owns them. Pins of manifest.py and machine-ports.json follow (machine recipes,
the private group adapter, Analog BD's native observations).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: card packages compiled from this tree (object bytes unchanged)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: native comparison for the final source (193 images, 87 refusals, 0 mismatches of 280)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: shared-window burn probe for the USB base's DSP loader; meter reads the report at the base's length

--dsp-burn-window ADDR runs the --dsp-burn loop from a shared-window P address
(calibration builds only). On the owner's MKII (28 Oct 2026, dev twins, core 0,
stopped, same project): baseline 2,119.2 idle passes a frame; 2,000 cycles in
private P 2,018.8 (100.4 passes); the same loop from P:0x36000 1,915.7 (203.5):
code fetched from the window costs twice.

device.mjs meter asked for a 66-word report; bases answer only their own
length (78-85 words), so every read failed. It now uses reportView().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: the DSP receiver's packet operations run from the shared window; wide FX2 buffers stay out of block 3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Octatrack base: FLEX tracks no machine owns render unguarded (#999)

The frame guard skipped ordinary sample tracks whenever FM Synth (RENDER_FLEX) was installed, because
mw_source_render_impl sent unowned FLEX tracks to its render through guarded(). Only machines' own tracks
are guarded now. Host test: an unowned track renders through F's RENDER_FLEX render in late frames with no
shed (the old dispatch fails it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: the resident base patch on the split receiver (engine ops stay in private P)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: regenerate the beta base (ccc21bc8) with the receiver's packet operations in the window; docs and changelog

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: records: the real Air Chorus/BBD limit, unit results on ccc21bc8 and its twin

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Build the Octatrack tooling with Modwerk's own firmware codec

sdk/firmware_codec holds the section format of Elektron OS images (aplib.py packs, elz.py depacks), the .syx
transport and ColdFire instruction lengths, for every machine. Every script that runs the pinned Elekloader
checkout now puts it on sys.path through firmware_codec.use_elekloader(), which serves these modules in place
of the checkout's codec/ and isa/ (an import finder first on sys.meta_path; it refuses if the checkout's codec
was imported first). sdk/tests/test_firmware_codec.py checks the codec against vectors of the modules it stands
in for and fails on any script that imports elekloader without use_elekloader() or reaches the checkout another
way.

The recipes that pin a build's inputs record the files actually used (firmware_codec.inputs()): CC Map, Mute
Modes, Tape Echo, Euclid and the five machine packages, refreshed after rebuilding every published USB package
byte-identical with the new tooling (Tape Echo's and Euclid's pins also take the page builder files they had
fallen behind). The beta base built from unchanged sources with this codec equals the committed one byte for
byte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: an FX swap keeps its track's own buffer block (as stock); the no-room box in the player's words

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: changelog for the FX swap and the no-room box

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: changelog wording

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Regenerate the beta base (6541d7e9) from the combined source; relink the base-bound packages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Machine recipes name the merged tooling's inputs (VECTOR, FM Synth, Scale Quantizer): every published package rebuilds byte-identical

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* POLY8 0.3.2: owner re-approval covers the clamp bytes in both manifest forms (f1a2500)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: the shared-window record in its own document; the traps and the beta plan do not grow

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: machines.md names HOOKS.md (EVENTS.md was renamed on main)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Import the source-built card assets (03006a5) and pin Tape Echo's and Euclid's recipes to them

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Analog BD's composition proofs bind the merged source tree (212 native proofs identical); the codec rule names elekloader-vendor.ts, which only edits the kit NOTICE (#1016)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Nathaniel Pawelczyk <nathaniel.pawelczyk@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@npp1993 npp1993 closed this Oct 28, 2026
@npp1993

npp1993 commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks! This landed in #1017 (its bundle contains this head), and main's docs/module-guides/machines.md already points at HOOKS.md, so I'm closing this one.


Generated by Claude Code

npp1993 added a commit to npp1993/modwerk that referenced this pull request Oct 28, 2026
…nto claude/analog-bd-0.1.6

Generated files regenerated with their producers.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

# Conflicts:
#	docs/module-guides/machines.md
#	public/octatrack-modules/analog-bassdrum/0.1.6-experimental.mwrm
#	scripts/module-source.test.mjs
#	sdk/machines/octatrack/HOOKS.md
#	sdk/machines/octatrack/base-binding.json
#	sdk/machines/octatrack/elekloader/runtime_events.h
#	sdk/machines/octatrack/events.json
#	sdk/machines/octatrack/include/modwerk_events.h
#	sdk/machines/octatrack/module-adapters/analog_bd_native_observations.json
#	sdk/machines/octatrack/module-adapters/controller-policies.json
#	sdk/machines/octatrack/module-adapters/machine-recipes.json
#	sdk/machines/octatrack/module-adapters/machine_ports.py
#	sdk/machines/octatrack/module-adapters/standalone-recipes.json
#	src/engine/assets/analog-bd-composition-proofs.json
#	src/engine/assets/bootstrap-package.json
#	src/engine/assets/coldfire-packages.json
#	src/engine/assets/descriptor-recipes.json
#	src/engine/assets/dsp-packages.json
#	src/engine/assets/menu-recipes.json
#	src/engine/assets/module-build.json
#	src/engine/assets/octatrack-base-fills.json
#	src/engine/assets/octatrack-base-sources.json
#	src/engine/assets/octatrack-base-variants.json
#	src/engine/assets/octatrack-base.elemod
#	src/engine/assets/octatrack-module-packages.json
#	src/engine/assets/platform-writes.json
#	src/engine/assets/requested-packages.json
#	src/engine/assets/resident-dsp.json
#	src/engine/assets/rom-packages.json
#	src/engine/assets/usb-audio-packages.json
#	src/engine/assets/utility-packages.json
@npp1993
npp1993 deleted the claude/ot-base-setup-all-list branch October 30, 2026 16:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants