Skip to content
Merged
22 changes: 11 additions & 11 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,17 +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 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.
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 both platforms), 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
10 changes: 5 additions & 5 deletions docs/PRODUCTION-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -798,16 +798,16 @@ where a PR decides differently. One PR per item, in this order, each against tes
before it. 9.0 runs in Max on a Mac *and* on Windows before anything else: three releases in a
row shipped what only a host platform could show.

- [ ] **9.0 The spike,** in Max on both platforms: a throwaway second class in `tap.python~`'s
- [x] **9.0 The spike,** in Max on both platforms: a throwaway second class in `tap.python~`'s
binary answers what only Max can — one binary, two classes (D11) and the `init/` `objectfile`
mapping (or the stub external); `outlet_insert_after` before an obex-stored dumpout and
`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. *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.*
return. The answers go into the plan before 9.1. *Done 2026-10-09: run on a Mac (#43) and on
Windows (#45), Max 9.1.5, the same answers on both, 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>`.*
- [ ] **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