Skip to content

Commit 67527db

Browse files
olwangclaude
andcommitted
docs(selfhost-ledger): record Milestone 2n — RS0201 gated (28 codes); RS0202 blocked on constructor-inline sub-case
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 5c09911 commit 67527db

1 file changed

Lines changed: 69 additions & 0 deletions

File tree

docs/ledgers/rss-selfhost-ledger.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,3 +1292,72 @@ gap is VM value-representation / intrinsic-dispatch cost (the next big lever).
12921292
RS0013.
12931293
- **Next slice:** `expr_type_root` + the error-type map are ready for RS0210
12941294
(operator), RS0207 (argument), RS0208 (return).
1295+
1296+
### Milestone 2n — call-signature cluster slice: RS0201 UNNAMED_ARGUMENT GATED (28 codes); RS0202 blocked (constructor-inline sub-case)
1297+
1298+
- **Goal:** add the call-resolution/param-signature cluster — RS0201 (unnamed
1299+
argument) and RS0202 (missing data effect). Both need callee param signatures
1300+
and light receiver-type inference.
1301+
- **Measure-first (one run, both codes in target, rss emitting neither):** the
1302+
whole-corpus oracle set is small and bounded — **5 RS0201 files, 9 RS0202
1303+
files**:
1304+
* RS0201: `fail/ast-call-unnamed-nested.rss` (`String.concat("prefix", ..)`),
1305+
`fail/call-unnamed-and-missing-argument.rss` (`combine(read "a", ..)`, a
1306+
`pub fn`), `fail/features-and-call-style.rss` (`Image.save(read image, ..)`),
1307+
`fail/malformed-empty-call-argument.rss` + `samples/ast/mal_empty_call_arg.rss`
1308+
(`Log.write(, message: ..)` empty slot).
1309+
* RS0202 (4 distinct oracle sub-cases): argument-effect (`File.write`/
1310+
`Image.resize`/`ResourcePool.borrow`/`Log.write`/same-file `Cache.put`),
1311+
receiver-call self-effect (`read cache.put(..)` vs `self: mut`), constructor
1312+
inline managed field (`Boxed(image: read image)`), and match-scrutinee effect
1313+
(`match xs { [a,b] => .. }` with no `read`/`mut`/`take`).
1314+
- **RS0201 built (committed):**
1315+
* `collect_call_fn_sigs``pubFns` (public unqualified fn names) + `dottedFns`
1316+
(dotted method fn names, e.g. `Cache.put`), the same-file call-resolution
1317+
table.
1318+
* `call_requires_named` / `is_core_named_namespace` — call-kind classifier
1319+
mirroring the parser's `is_qualified_namespace_receiver` (uppercase dotted
1320+
head ⇒ qualified). Fires only for public same-file unqualified fns and a
1321+
**measure-first-curated** core namespace allowlist `{String, Image, Log}`;
1322+
receiver calls, private helpers, variant/type constructors, same-file methods,
1323+
and unknown/imported namespaces are skipped (FP-safe).
1324+
* `args_have_unnamed` / `seg_is_unnamed` — arg splitter respecting `()[]<>{}`
1325+
nesting **and closure param pipes `|a, b|`**, with the malformed empty-slot
1326+
and lone-trailing-comma rules.
1327+
- **FP discipline:** first run at a broad rule surfaced 14 false positives — all
1328+
from (a) closure multi-param commas `|acc, val|` splitting a named arg, and
1329+
(b) qualified calls to user/imported sum-variant or unknown namespaces
1330+
(`ChatMessage.system(..)`, which the oracle leaves UNKNOWN_CALLEE with no naming
1331+
diagnostic). Fixed by pipe-toggling the splitter and by curating the qualified
1332+
fire-set to `{String, Image, Log}` (the only namespaces the oracle actually
1333+
flags). A `)`-guard that mis-read a previous statement's close-paren as a
1334+
complex receiver was removed (it FN'd `Image.save`).
1335+
- **RS0202 — NOT landed (blocked):** it is a file-level OR flag over FOUR oracle
1336+
sub-cases; greening requires all nine oracle files AND zero FP over 619
1337+
constructor/call-heavy files. The **constructor-inline-managed-field** sub-case
1338+
(`fail/constructor-inline-managed-field.rss`) is the blocker: the oracle rule
1339+
(`checks/body/fresh.rs::constructor_arg_uses_managed_inline_value`) fires only
1340+
when the field is a non-Copy, non-`handle` INLINE struct/class field AND the
1341+
value is a *managed* binding (`let`-bound, or crossing a handle, or a
1342+
non-`fresh` managed-returning call) — a classification needing per-field
1343+
`handle`/`weak` parsing, Copy/type-kind resolution, and `let`-vs-`local`-vs-
1344+
param-vs-`fresh` binding tracking. No token-level approximation is FP-safe
1345+
across the many legitimate `T(field: read x)` constructor calls in the corpus,
1346+
and missing this one file leaves RS0202 red. Deferred; the arg-effect stdlib
1347+
map (`File.write`→file:mut, `Image.resize`→image:mut, `ResourcePool.borrow`
1348+
pool:mut, `Log.write`→message:read) + same-file receiver-method self/param
1349+
effects + the match-scrutinee scan (the other 8 files) are straightforward once
1350+
a safe constructor-inline rule exists.
1351+
- **Gate:** `checker_parity_corpus` **619/619 ok, 0 mismatches, 0 run-failures**
1352+
at **28 codes** (RS0201 added). Green.
1353+
- **Env note:** the Docker dev stack was factory-reset mid-slice (0 images/
1354+
containers/volumes); verified on the host toolchain (`cargo 1.95.0`,
1355+
`aarch64-apple-darwin`) instead — same `checker_parity_corpus` test, 1730s.
1356+
- **CHECKER_TARGET_CODES (28):** RS0002, RS0003, RS0004, RS0005, RS0006, RS0007,
1357+
RS0008, RS0009, RS0010, RS0011, RS0012, RS0016, RS0017, RS0021, RS0024, RS0028,
1358+
RS0033, RS0029, RS0023, RS0035, RS0027, RS0014, RS0018, RS0019, RS0022, RS0101,
1359+
RS0013, RS0201.
1360+
- **Next slice:** RS0202 once a FP-safe constructor-inline-managed-field rule is
1361+
found (parse field `handle`/`weak` + Copy/type-kind + `let`/`local` binding);
1362+
the arg-effect + receiver-self + match-scrutinee sub-cases reuse
1363+
`collect_call_fn_sigs` and the arg splitter directly.

0 commit comments

Comments
 (0)