7.4 KiB
Independent actual-output acceptance oracle — proposal only
Source inspected: a629ae01d49bb3cb482a047eb41832ad4246a5c6. Derived from literal
bytes and existing source, not parser/emitter execution. Only string lengths and
literal substring offsets were evaluated. Future verification API/domain/equality
contract is not yet selected; all runtime acceptance remains pending.
Minimal real rename, one unchanged inherited policy
Entry/key main.arcadia has 12 ASCII bytes. Original exact source (final LF):
arcadia 8;
project p "Project" id "00000000-0000-0000-0000-000000000001" {
}
Desired differs only in project alias p -> next. Expected complete emitted
bundle is exactly one file under the same entry/key, containing (final LF):
arcadia 8;
project next "Project" id "00000000-0000-0000-0000-000000000001" {
}
Original source is 78 bytes; output is 81. The sole edit is original [19,20),
replacement next (four bytes); output alias is [19,23), display text [25,32),
UUID quoted token [37,75). Output retained O=(1 entry, 0 occurrences, 105 text),
where 105=81 source+12 map key+12 entry bytes. No output key/path is omitted.
Complete expected Project: schema_version=8; id=00000000-0000-0000-0000-000000000001; alias="next"; name="Project"; description=""; definitions, elements, relations, diagrams, artifact_links and traces are all empty maps. Expected warnings empty. This asserts every model field, not just the changed alias. E_original=E_actual=0.
Select original Limits entries=17, bytes=152 (or 151 negative), all other fields unchanged from an admissible roomy source8 profile; keep the same ProjectLimits through original parse/index/plan/emission/verification. Never tighten live policy.
| Stage | Logical entries | Logical text | Derivation |
|---|---|---|---|
| Original syntax retained | 12 | 8 | U1 + M11; alias1+name7 |
| Original resolver peak | 16 | 10 | Project catalog +4 entries, two alias copies |
| Original typed index retained | 13 | 9 | One global name; no typed headers/expressions |
| Original ordinary index retained | 14 | 9 | One authored project header |
| Rename plan peak/retained | 16 | 9 | R1 name target + namespace Q1 (then dropped), M1 edit |
| Emission overlap | 17 | 114 | Plan16/9 + output O1/105 |
| Output strong syntax retained | 13 | 116 | C1 + U1 + M11; C105 + T11 |
| Output resolver peak | 17 | 124 | Syntax13 + project catalog4; two four-byte alias copies |
| Output resolved retained/equality | 13 | 116 | Catalog dropped; E_actual0 equality scratch |
| Owning accepted bundle after verification owners drop | 1 | 105 | Only actual output O remains |
Original indexing/transient peaks do not exceed the original resolver/plan/emission entry ceiling17 for this empty model; prior emitted-overlap source tests explicitly use entries17 and bytes114 through the real predecessor path. The new proposed 152/151 byte profiles are looser than that already authored predecessor boundary. No new verification allocation occurs while the old authored owner remains live.
Exact new byte boundary and timing
Scanner validation of the output UUID reserves raw payload36 before decoding. No grammar text exists during that file scan: C105+W36=141 (display payload7 is smaller). Grammar first retains alias4 and display name7, hence T11. Its UUID consumer reserves P36 while T11 remains live: 105+11+36=152, before the existing serde decode. Valid decode D36 transfers then UUID parsing drops/refunds it; final T11 and W0. Project has no projected ordinary values or textual keys.
Therefore 152 is the full-pipeline positive byte cap and 151 isolates the new
actual-output grammar producer refusal, after predecessors/emission and scanner
have fit. Expected source path main.arcadia, code invalid_source, message
Source8 index/output byte limit exceeded., ordinary transported span [37,38),
line2 column27, no related locations. Raw quoted extent is [37,75), but the
ordinary error transport intentionally retains its one-byte start representation.
Do not expect this refusal at the former unverified-emission114 boundary.
Entry cap17 permits the whole pipeline, but cap16 refuses emission first: plan16 plus O1 cannot fit. Thus it cannot demonstrate a later verification/resolver entry refusal. Equality reserves zero here; no equality-specific minus-one case exists. A different justified fixture is needed for any proposed late entry gate.
Equal-byte corruption controls (not genuine emitted results)
Start each control from a fresh legitimately emitted pending owner under roomy unchanged inherited limits. Mutate only in the private fixture harness. Equal UTF-8 length preserves O numerically; production must not expose mutation/constructors.
- Output alias [19,23):
next->nope. Valid alias and otherwise empty model; parse/admission should pass, complete Project equality must reject. - Output name [25,32):
Project->Changed. Valid decoded display name, same seven bytes; parse/admission should pass, non-name equality must reject. - Version byte [8,9):
8->?. Equal bytes, malformed source; scanner/parser must reject before model equality. Do not claim a successful wrong-model case.
Each failure must drop pending verification state, return no accepted owner, and leave original source and desired unchanged. Do not recursively format models. The new verifier's semantic-mismatch message is deliberately unspecified here.
Actual expression count larger than original, unchanged O
Use the same project wrapper with this exact single body line:
calculation c "C" id "00000000-0000-0000-0000-000000000002" { result Number; body 10000; }
Original source168 bytes; a genuine project p->next rename emits171 bytes, O=(1,0,195).
Desired includes the unchanged Number calculation c, same ID/name, no parameters,
and literal10000 expression. Original arena E=1. On a fresh pending corruption
fixture replace output expression [160,165) 10000 with 1 + 2 (five bytes).
The bytes still describe a Number calculation, now binary Add with two numeric
children: actual raw-expression arena E_actual=3. Bundle lengths/keys/entry/O
remain unchanged; complete equality must reject its different body. Use roomy
entries/bytes4096 from the original parse, not a policy replacement after emission.
The equality reservation must derive 3 from the freshly resolved actual output, not trust pending's old scalar1. This fixture proves provenance/count selection; its unequal root variants may short-circuit comparison and do not prove a frontier actually exceeding1. Lowering already reserves five entries per actual node, while equality requests only E_actual. No isolated equality-cap-minus-one refusal is claimed; the earlier lowering peak may dominate. A meaningful additional wide/deep positive and target-shape mismatch must be justified independently.
Source basis and limits
At the pinned source, rename/emission.rs:6 defines the sealed pending fields;
its output_slots counts all source/key/entry bytes, and emit_changed_unverified
reserves old plan+O before copies and drops old source before constructing pending.
rename/emission/tests.rs already pins literal NEXT and predecessor17/114.
mixed/project.rs:245/:315 reserve the project alias/owner/table catalog; catalog
storage releases before returning resolved state. mixed/project/accounting.rs
seeds syntax and lower scratch independently; LowerStorage::all uses5N+2A.
budget.rs::quoted_text and raw_tokens StringEvent implement the P/D timing above.
These are logical storage derivations, not allocator/RSS or runtime test claims.