Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ built yet.
fixtures (`python/maxtest_*.py`, copied into `python/` for a run) and `run.py`, which installs the
harness into Max's Packages, launches Max, drives it over OSC and reports. macOS, local only —
`runtime-tests/README.md` has what the first runs taught about writing one. Two sessions run only
when asked for: `soak` (plan 6.2, an hour) and `perf` (plan 6.3).
when asked for: `soak` (plan 6.2, an hour) and `perf` (plan 6.3). `runtime-tests/spike/` is the
throwaway 9.0 spike for `tap.python` (`-DTAP_PYTHON_SPIKE=ON`, off by default, compiles
`tap.python_spike.cpp` into the binary): its answers are in `docs/TAP-PYTHON-PLAN.md` under 9.0.
- **`scripts/install-runtime.{sh,ps1}`** — installs python-build-standalone CPython 3.13 plus attrs and
numpy into `support/` (gitignored), verified against `scripts/runtime.lock` (per-platform archive
SHA256s) and `scripts/requirements.lock` (pip `--require-hashes`, wheels only). Never hand-edit the
Expand Down Expand Up @@ -141,16 +143,17 @@ attaches all the zips + SHA256s to a release — a pre-release for 0.x, a draft
`&method_false` is its own import thunk (the SDK declares it without `dllimport`), so 1.0.1's
comparison reserved every name again, on Windows only. The object asks Max what it answers for a
name no class can have (`not_found_method()`) and compares with that (`found_method()`, 1.0.2).
And what the object itself registers answers its name too — its own messages *and attributes* —
so the guard must leave those out, or a reload reserves every field (1.0.1, found in Max). The
mock kernel is thinner than Max: when a stub decides a behavior, make the test's stub faithful
to the SDK (as `attr_args_offset` and `object_getmethod` are — the glue test's kernel answers an
unknown name with a function the module cannot take the address of, as Windows does, and an
added attribute's name, as Max does), and give each fake function a body of its own: MSVC's
Release link folds identical functions (`/OPT:ICF`), which once gave a fake "found" method
`method_false()`'s address on Windows only. Three releases in a row shipped what only a host
platform could show, and the third was Windows-only: a change to Max glue is verified in Max
on **both** platforms before it is tagged.
And what the object itself registers can answer its name too — its *attributes* do, and the
guard must leave them out, or a reload reserves every field (1.0.1, found in Max); its messages,
added with `object_addmethod()`, answer as unknown (the 9.0 spike, on the Mac), and are left out
as well. The mock kernel is thinner than Max: when a stub decides a behavior, make the test's
stub faithful to the SDK (as `attr_args_offset` and `object_getmethod` are — the glue test's
kernel answers an unknown name with a function the module cannot take the address of, as
Windows does, and an added attribute's name, as Max does), and give each fake function a body
of its own: MSVC's Release link folds identical functions (`/OPT:ICF`), which once gave a fake
"found" method `method_false()`'s address on Windows only. Three releases in a row shipped what
only a host platform could show, and the third was Windows-only: a change to Max glue is
verified in Max on **both** platforms before it is tagged.
- **Say what is true of a class once, what is true of an instance per instance.** Many objects can
share one class file; only the processor whose `load()` ran the file (`load_script` says so)
announces the class — its `Loaded` line and its diagnostics — through `announce()` (plan 6.7).
Expand Down
5 changes: 4 additions & 1 deletion docs/PRODUCTION-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,10 @@ row shipped what only a host platform could show.
`get<attr>` through it; the dispatch order of a class-level `anything` against instance methods
and attributes, and `object_getmethod()` on such a class; the thread of a `metro`-driven message
under Overdrive and under Scheduler in Audio Interrupt; `symbol` or `anything` for a `str`
return. The answers go into the plan before 9.1.
return. The answers go into the plan before 9.1. *Run on a Mac 2026-10-09 (#43, Max 9.1.5),
every question answered in TAP-PYTHON-PLAN.md under 9.0: the `init/` mapping works; `get<attr>`
needs the class's `dumpout` method; `int`, `float`, `bang` and `list` never reach a class-level
`anything`; a `str` is output as `symbol <s>`. Windows still to run.*
- [ ] **9.1 The core:** output items and their conversion in `value.h`; `message_info::return_count`
(depth-aware for string hints), `outlet_count()`, `call_with_output()`; the `bind_audio` option,
gating the tuple rule; a last parameter hinted `list[…]` or `np.ndarray` taking the remaining
Expand Down
Loading
Loading