Skip to content

sdg: IP 0001 — foundational machine surfaces for an external spec UI - #7

Open
lzrscg wants to merge 325 commits into
mainfrom
claude/xspec-ui-apis-4df8fa
Open

lzrscg wants to merge 325 commits into
mainfrom
claude/xspec-ui-apis-4df8fa

Conversation

@lzrscg

@lzrscg lzrscg commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Improvement Proposal specs/patches/0001-external-ui-apis.md (Stage: Proposed), drafted from the seed "Foundational APIs for an external spec UI" and finalized against the Developer-confirmed scope: CLI-only connection (no service/watch surface), UI-owned text editing (no content-mutation commands), saved-files-only analysis.

Proposed SPEC.md change areas: reference occurrences with source ranges; source ranges for code locations; a whole-document structural view (tag-range decomposition, imports, comments, occurrences, direct position resolution, multi-file form); a per-file parse-local availability contract for the new surfaces; a workspace inventory with invocation-anchored root; structured diagnostics with stable codes and ranges; rename/move previews; machine-interface identification.

Also carries the preceding Liaison commits on this branch (PHILOSOPHY.md updates, seed intake) and consumes specs/tmp/SEED.md.

Process notes: branch claude/xspec-ui-apis-4df8fa is this session's harness-designated push branch and stands in for patch/external-ui-apis (recorded in the patch header). Merge happens only at Phase 11 per specs/DEVOPS.md.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2


Generated by Claude Code

lzrscg pushed a commit that referenced this pull request Aug 3, 2026
…rfect files (iter 8)

Applied:
- I1: change 4 now states the text-value principle for files with findings —
  Markdown compilation's removal rules classify constructs by syntactic form,
  never by validity or resolution (imports removed by form, tags removed with
  every spelled attribute, non-inventoried constructs preserved as content);
  resolution enters only via text(...) replacement, already the unavailable case.
- I2: identity definedness disambiguated — chain conditions (presence,
  well-formedness, structural validity) are inherited; uniqueness constrains the
  section's own spelled identity alone, so a uniquely spelled descendant of
  duplicate-id ancestors keeps its defined identity; defined identity does not
  imply defined prefixes, and occurrence resolution / the target filter turn on
  the referenced identity's own definedness.
- O1: spread attributes appear among the view's raw attribute spellings by form;
  invalidity is a located finding, never a view omission.
- O2: position-resolution offset domain closed — a non-non-negative-integer
  offset value is the same usage error as a greater offset.
- O3: stable-code scoping stated as deliberate — codes cover exactly the
  numbered conditions plus refusal reasons; plain usage errors carry no code but
  still get the JSON error document when JSON output is in effect.

Rejected:
- O4: the Branch header's mapping is deliberate harness bookkeeping — pushes go
  to the designated branch and the mapping is recorded in the patch header and
  PR #7; stripping it mid-process would name a branch nothing pushes to.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
lzrscg pushed a commit that referenced this pull request Aug 10, 2026
…R gets no pull_request runs

Scaffolding audit for IP 0001 (Tests Specified): the existing layout,
vitest projects, npm scripts, network-denial wrapper, and E-6 exchange
wiring already cover every TEST-SPEC/CERTIFICATIONS addition; new tests
and fixtures are Phase 9/10 content under existing globs. The one gap:
PR #7 is unmergeable against main (specs/PHILOSOPHY.md conflict), and
GitHub creates no pull_request-event workflow runs for a conflicted PR
(zero runs across 45 commits). Add the working branch to ci.yml's push
trigger so the TEST-SPEC-required tests run on every push to the branch
head — the channel sdg/initial-build already used — with checks
attaching to the PR's head commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
claude and others added 28 commits August 11, 2026 22:06
…031)

Four arms on two workspaces: file-form move delta both directions
(destination set generated, recorded origin set removed), rename [] both
directions, the record-deleted move whose generated is the full post-move
regeneration set with removed [] and nothing written (graph data still
absent), and T6.6-4(d)'s created-target staging with the new file's derived
paths under generated. Expected sets composed from the premise build's
observed writes under the 13.1 name shape plus the 13.2/7.3 Markdown
destination, with a diagnosed partition self-check; section-13.3's
T13.3-2 graph-data helpers exported for the shared operational definition.
Red-as-diagnosed at the first preview invocation; body proven green against
a conforming shim and red against five deviations at exactly the diagnosed
assertions; test:self unchanged (4 planned mid-loop reds).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… (FP-032)

New H-3 record-staging adapter (shape-blind garbage over T13.3-2's
operational path set, product-written files only, loud otherwise; the
isGraphDataKey predicate moves there, section-13.3 re-exports). T6.6-6:
intact-record reference preview, then both corrupt-state previews in one
whole-root compare — full plan with delta explicitly unavailable and the
one located-nowhere unreadable-record finding (path .xspec), the refused
identity-unchanged rename reporting its refusal alone — then the real
move proceeding on the same state, applied mapping == previewed mapping,
check clean after. S-5 gains the staging guards; traceability maps
T6.6-6 to 6.6 + 14.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… (FP-033)

New corrupt-state arm: the product performs a review split (its
decomposition recorded durably, SPEC 10.7; original id pinned gone), then
the recorded decompositions member is garbled by the new shape-aware,
value-blind stageGarbleDecompositions transformation (session-staging.ts;
creation-parameters garble refactored into a shared structural-type-flip)
and the full corrupt-session contract is asserted. S-5 gains the
decompositions staging guards (74 tests, green). Suite section-10.1
unchanged 3 failed / 1 passed (pre-existing FP-001/FP-002-class product
gaps); test:self unchanged 4 planned mid-loop reds; arm soundness proven
by direct probes against the built product.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…-034)

Context arm (metadata-consistency): one edit removes D's d reference and
deletes sibling T's section; after resolve, re-authoring T invalidates
through the context node's absent-to-present flip alone. Origin arm
(dependency-consistency): X->T->D; a d-list edit on D derives X's item
(scope X, context {T}, origin {D}); after resolve, one edit removes T's
reference and deletes D's section — invalidation through the origin
node's present-to-absent flip alone. Purity asserted in-test via
assertHashPremises (extracted from runSensitivityArms, fail-loud on
missing captures); item composition via assertSoleContext/Origin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…node (FP-035)

The next --json payload's range clause now has full coverage (TEST-SPEC
10.7, SPEC 10.7/1.7): origin entries decode and assert a node-level
current source range (forbidden when the after side — the current
presence — is absent), the walk reaches the code-impact item whose
present code-location scope is byte-asserted against the named unit's
precomputed construct range with no text, and deleting the code file
flips the same item's scope to absent — no text, no range. S-5 guards
the new origin decode both ways (74/74). Red-as-diagnosed at the first
origin-entry range (the product presents no origin or code-location
ranges); staging and every downstream value probe-verified against the
built product. Self-tests: unchanged 4 planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…rms (FP-036)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…-037)

T12.0-1/-3/-4's shared full-surface sweep gains occurrences, view, at,
inventory, and version as clean-domain read steps, and T12.0-1 gains the
JSON-only parity arm: the surfaces of SPEC 10.7, 11, and 12.6 (the query
subcommands, the five new surfaces, review export) rerun without --json
and must emit the same single document — byte-identical stdout at the
same exit code (product-to-itself, H-4).

Red-as-diagnosed: T12.0-1 green -> red at `occurrences --json` (exit 2
unknown command, the new-surface product gap), query parity arms passing
before it; T12.0-3 red at the same step; T12.0-4 keeps its pre-existing
FP-002-class first failure. test:self unchanged: 4 planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
T12.0-10 stops being alias-only: register the gated-read (failing
workspace + valid-twin byte-compare), masking, past-the-gate
corrupt-session, and within-class-2 no-configuration /
configuration-error-precedes arms in section-12.0-ii.ts; the
rename/move/baseline arms stay cross-references to T6.4-4/T6.5-5/
T6.3-4. H-7 map gains "T12.0-10": ["12.0"] and the alias comment is
updated per FP-003's note.

Red-as-diagnosed at the failing-premise form-exact findings decode
(FP-001-class); direct probes prove all later arms sound and expose
two real precedence gaps (parse-local checks gated; malformed value
reported after configuration load). test:self unchanged: 4 planned
mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…P-040)

Seven steps join GITLESS_STEPS: occurrences, bare view, at, inventory,
version after the query steps, and the --preview invocation of rename and
of file-form move each directly before its real operation. Title extended
to the full TEST-SPEC surface; traceability and certification untouched.
T12.0-12 turns red-as-diagnosed at the first new step (occurrences: exit 2
unknown command against the stub product); the later steps are proven
sound by direct probes in sweep order. test:self keeps its unchanged 4
planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… (FP-041)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
Rebuild T12.2-3 as TEST-SPEC's three per-state pins: on T12.2-2's
missing-arm state graph data stays absent around `check` (absence pinned
as a staging premise, whole-root compare-around); on its isolated mismatch
state (refresh-then-revert staging, both premises pinned) and on an
edited-source-without-rebuild state carrying per-file and unit staleness
together, graph data and every derived file stay byte-identical around
both the human and the `--json` invocation. Each state asserts its own
staleness report (unit-form condition-10 finding for missing/mismatch,
all-14.10 for edited source), so state reachability is positively
established.

Suite file unchanged 3 failed / 3 passed (T12.2-3 red-as-diagnosed at the
FP-001-class form-exact decode; arm soundness and the byte pins proven by
direct probes against the built product). test:self unchanged: 4 planned
mid-loop reds (certification-document x3 -> FP-091; S-1's 7 unmapped keys
-> stage G).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…-043)

Four minimal exit-0 dispatch arms on the existing fixture — occurrences,
view, at, inventory — each invoked bare (JSON-only surfaces, SPEC 11):
occurrences through the existing form-exact decoder (definitive empty
enumeration), view through a new scoped decodeViewFilesReport, at through a
new full-form decodeAtReport, inventory through the scoped recorded datum.
S-5 gains both decoders' guards; traceability unchanged. Suite file stays
2 failed / 2 passed with T12.5-1 red-as-diagnosed at the patch-new
occurrences command; test:self keeps its 4 planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…ecord-discipline arm (FP-044)

T13.3-1 and both T13.3-2 refresh arms now sweep occurrences/view/at at
the identity/membership level (spans and per-file view content stay
T11.3-*/T11.4-*/T11.5-*'s home); T13.3-2's edit arm stages a d reference
so the three surfaces discriminate stale data; a new record-discipline
arm corrupts the record shape-blind and asserts each of the nine
refreshing reads answers finding-free at exit 0 with the corrupt state
neither read nor replaced — inventory reports recorded unavailable at
exit 1 after every read — until a successful build replaces it.
T13.3-2's traceability gains "14" (TEST-SPEC 14 lists it under 14.23).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…(FP-045)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… arms (FP-046)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
An identical twin workspace replays the held workspace's exact command
sequence (staging build and the review-status item lookup included) with
the seam flag alone removed; after each held-then-released arm the two
whole trees — sources, journal, sessions, derived files, graph data —
are compared byte-identically (H-4 product-to-itself, H-6 across
directories, no exclusions). Arms 4/5 pass each side its own workspace's
reported item ID. The sequence equality is the staging
VIOL-CORE-CHATTYREADS's passing analysis leans on, recorded as a header
constraint. CONF-CORE conformer 9/9; violator expected-failure sets
exact; suite 13.5 7/7 (product already seam-neutral; teeth proven by a
diverging-twin probe); test:self unchanged 4 planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…(FP-048)

- 14.21 failing-workspace half: check alone reports it beside the gate's
  findings; build and the gated review reads report exactly the gate's.
- 14.23 row: inventory (new scoped form-exact decodeInventoryFindings,
  S-5-guarded) and rename --preview report it; check reports exactly the
  14.10 unit form; query nodes, build, and check-after prove the reads
  leave the record unconsulted and the rebuild replaces it.
- 14.14 row: version answers exit 0 with one JSON document under the same
  invalid configuration that makes build/check exit 2.
- Availability rows: every sweep condition's finding accompanies the
  occurrences/view/at answers its staging's kind admits (all three for
  spec sources, occurrences alone for code sources) at exit 1 via the
  form-exact 12.7 decoders; 14.13/14.22 ride query nodes' gate report
  instead while all three surfaces answer finding-free at exit 0.

Suite section-14 unchanged (5 failed, first-arm FP-001-class decode; new
arms probed directly against the built product, red-as-diagnosed); S-5
82/82; test:self unchanged 4 planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…r (FP-049)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…atrix (FP-051)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
Register T11.2-3 in section-11.2.ts: discovered spec sources specs/a#b.mdx
and (Linux-staged) a non-UTF-8-named one keep full views with every node
identity, root included, explicitly unavailable; the condition-19 finding
accompanies exactly the answers whose consulted domain includes the file
(view: spec paths only; occurrences: all; at: the named file alone), the
non-UTF-8 path presented in the 12.7 marked byte form; the #-pathed code
source's text() call and bare marker still record occurrences with source
exactly the unavailability marker; root identity defined exactly when the
path is valid. Gate build pins the exact 14.19 multiset over condition-free
content, modifying nothing. Traceability: T11.2-3 -> ["11.2"].

Red-as-diagnosed at the gate build's form-exact findings decode against the
pre-patch product (which fires exactly the staged 14.19s in the old shape);
a scratch conforming fake ran the body green end-to-end and five deviation
fakes each failed diagnosed. test:self unchanged: 4 planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… (FP-053)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…ach arms (FP-055)

Register T11.2-6 in section-11.2.ts: two otherwise-valid pre-built
fixtures — a garbage journal line (14.13) and the markdown.outDir
directory replaced by a plain file (14.22) — where `view` of the
finding-free file answers complete and finding-free at exit 0 under
whole-root no-write compares, while the state surfaces through
`build` (exact multisets, concerned paths pinned) and `check`
(non-14.10-exact beside the journal; exactly {14.10,14.22} with both
paths pinned on the obstruction fixture, the swap-deleted emission
being definite per-file staleness). Traceability ["11.2"]; not in
CONF-AVAIL scope (expressly an Exclusions entry). Red-as-diagnosed at
the fixture-1 gate build's form-exact decode; conforming-fake scratch
run green end-to-end with five deviation fakes failing diagnosed;
test:self unchanged at the 4 planned mid-loop reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… fixtures (FP-056)

New section-11.3.ts (SUITE-53) registers T11.3-1: the complete record
sequence per index in occurrence order over the four T5.7-* fixtures
(identity-level tuples for T5.7-1/-4, byte-precise own ranges for T5.7-2,
full-record equality for T5.7-3), plus the source-unavailable arms over
T11.2-3's invalid-path code source and T11.2-4's resolution matrix —
every fixture imported from its owning module (section-5.7.ts and
section-11.2.ts gain export-only edits with stated order contracts), the
body re-earning every imported claim via slice and sortedness self-checks
before any product invocation. Traceability maps "11.3"; S-1's unmapped
set narrows 6 -> 5 keys; red-as-diagnosed at the pre-patch product's
unknown `occurrences` command.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… matrix (FP-058)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
- T2.1-3: same-identifier imports 14.15 within one ESM block and across blocks, never 14.20 (I4)
- T2.3-3 (new): embedding definition — whitespace/comments beside the call are embeddings; parenthesized, escaped, optional-call, comma-sequence, and await forms 14.16; two-call container 14.20 (C5)
- T2.4-2: TypeScript-only syntax in a spec source 14.20 with pinned offsets; `d={BASE.a<X>y}` 14.8; optional chain vs optional call split (C1)
- T2.7-1: fragments 14.16 from `<>` through `</>`; attribute-value expressions no container of 14.16; gated `query` channel replaced by the view (C6)
- T2.7-3: spread-attribute grammar pair (O3)
- T2.7-4 (new): every comment form of 2.7, ECMAScript whitespace classes between braces, comment-grammar parse failures with offsets (C4)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
- T1.7-2: constructor, decorator, export-exclusion, `default`, legacy `module`, and declaration-file ranges (C11)
- T3-3: 1.4's classes inside an ESM block (U+2028 between two imports keeps its line); T3-7 (new): JavaScript comments beside imports stay as content (C7, C4)
- T4-2: side-effect-only spec import valid in TypeScript, its specifier still held to the rule (C8)
- T4-5 (new): type-only import collisions root no chain, both orders (C10)
- T4.3-2, T4.5-3: TypeScript-only syntax dynamic (14.8) in a TypeScript source (C1)
- T4.4-1: condition 11's edge and occurrence via `occurrences`, resolving-argument requirement, `identities` form and the invalid-path `[]` (C12)
- T4.5-8: `occurrences` as the no-edge channel on a failing workspace; located declarator, binding-pattern, decorated, and export-prefixed forms; single-block staging (I1)
- T4.5-9 (new): a call through a colliding `text` identifier — 14.15 + 14.18, no `text`-call condition, no edge, no occurrence (C9)
- T4.6-1, T4.6-3: constructors, decorated units, legacy `module` namespaces, declaration files ambient by kind (C11)
- T5.7-2, T5.7-4: ECMAScript whitespace in token bounds; no-occurrence constructs extended (C4, C9, C12)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…close the review round

- T11.2-4: stray element with enclosed section and embedding — one condition-16 finding, the section in the tree, the embedding's occurrence, own/subtree text by form (I2)
- T12.7-1: condition 11's `identities` form pinned (C12)
- T14 index, T14-3, T14-4: new tests indexed, `d={]}` with its offset, reporter matrix extended (I3)
- T14-11: `d={}`/`d={ /* c */ }` as condition 20 at the closing brace; `d` expression, spread-entry, elision, colliding-declaration, and fragment ranges; encoding-failure offsets `41 E2 82 41`, `C0 80`, `ED A0 80`, truncated `41 E2 82` (C2, C13)
- T14-12 (new): the well-formedness contract — early errors and post-parse checks excluded (positive arms), parse failures with pinned offsets (negative arms) (C3)
- P-2, P-8: generators extended with the new comment, ESM-block, whitespace, and fragment forms (O2)
- T1.6-5: offset cross-reference

Rejected:
- O1: not a blocking spec problem — the ordinary-node-to-type-only-callee corner is a consumer type error 4.5 places outside xspec's validations, T4-4 already records it as asserted nowhere, and a Phase 4 jump-back for it would be disproportionate; the Reviewer may escalate it if judged blocking.

Review round closed: specs/tmp/REVIEW.md removed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…the comment forms beside an embedding call

Applied: C1 (T14-12 gains the positive arm `export { nope }` — well-formed, one
condition-16 finding at the statement whole, never 14.20 and never 14.15, the
import beside it proceeding normally on the 11.2 surfaces); I1 (T2.3-3 gains
positive arms for a block comment after the call, a line comment before it,
and the run-on `{// c}` form holding the call; P-2's generator draws the same
forms).
Rejected: none.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…isit

Applied: O1 (T4-4's declaration-modifier arm binds `t` by an ordinary
`import { text as t }` beside the type-only default binding, so an ordinary
`text` callee receiving a type-only-rooted chain is a definite fixture); O2
(T3-7 terminator arm: a semicolon-terminated import's `;` is removed with the
declaration and its `imports` range ends after it, T11.4-4); O3 (T11-6: `query
edges --from <path>#C.constructor` and `#C.then` answer, exit 0 — 12.0 judges a
code unit over the file's named units, never by 1.4); O4 (U+2029 twins in
T2.7-4, T3-3, and P-2's generator); O5 (T5.7-2: `d={// c` U+000A `BASE.a}` and
its run-on twin are well-formed `d` values whose occurrence spans `BASE.a`
alone). specs/tmp/REVIEW.md deleted.
Rejected: none.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…iage-return line-comment twin; close review round 3 of the revisit

Applied: O1 (T2.7-4: `{` U+0085 `}` and `{` U+200B `}` are 14.20 because
neither code point is ECMAScript whitespace or a line terminator — the
content is no empty expression — and neither begins any token, so it derives
no expression; the former "lex to no token" aside restated 14.20's accepting
criterion); O2 (T2.7-4: `{// c` U+000D `}` is a comment beside the U+000A
form — 14.20 runs a line comment through the first U+000A or U+000D — staged
with no later `}` in the file so a product ending line comments at U+000A
alone finds the container unclosed and fails; removed under T3-3's
merge-and-drop rule, its `comments` range `{` through `}`).
Rejected: none.
No Critical or Important items remained: HALT. specs/tmp/REVIEW.md deleted;
the IP's Stage line untouched (Tested; stages are not rewound on backward
jumps).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…ness refinement of SPEC.md and TEST-SPEC.md

Admit into CONF-MD's scope the forms T3-3 and P-2 now stage (an ESM block's two imports separated by U+2028, U+2029 at the class boundary, JavaScript comments beside imports, every comment form of 2.7 with ECMAScript whitespace between braces, embeddings with comments beside the call), state the accepting-side 14.20 classification the conformer needs, and bound VIOL-MD-CLASS's and VIOL-MD-CR's single deviations to the line model of 3. Update CONF-AVAIL's scope for T11.2-4's enclosure arm, T11.4-4's semicolon-terminated range, and the encoding-offset rule, pinning the usual comment and embedding forms by staging constraint. Add a precision clause to CONF-VALID's scope. Record in Exclusions why the well-formedness contract (T14-12 and the 14.20/14.16 arms of the 2.x and 14 tests), the type-only collision and colliding-text tests, T4.4-1's finding contract, and the further range forms justify no fixture. No conformer or violator added or removed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…on` as the hold path

Add the arm TEST-SPEC T13.5-1 names: `--test-hold` is value-taking by
name on every command (SPEC 12.0), so `build --test-hold --json` takes
`--json` as the hold path and leaves JSON out of effect — exit 2, stdout
byte-empty, no hold file at `./--json`, the workspace unchanged. The
CONF-CORE conformer passes the arm unchanged and the certification's
expected outcomes are unmoved; against the built product T13.5-1 now
fails diagnosed at this arm (the product reads `--json` as the JSON flag
and answers the error document on stdout). Remove Task 15 from the plan
and record what landed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…efreshing read on the deletion arm

Task 16 of the plan. The deletion arm's whole-workspace byte compare against
the post-build fixed point could hold only for a product whose refresh writes
a fresh record — the record is part of the graph data the operational deletion
removes, and a conforming refresh leaves it absent (SPEC 13.3) while every
`build` writes one — so the arm now follows the source-edit arm's shape:
outside the graph data byte-identical to W0, graph data present after each
read and byte-identical across the nine reads (12.0), and after every read
`inventory` reporting `recorded` exactly [] (new local `assertEmptyRecord`)
and `check --json` clean inside one compare-around, with a premise `inventory`
on the deleted state before any read. Module header, title, and traceability
("11.6") updated. Green through a stand-in that empties the record the
product's refresh writes (recorded in AGENTS.md); against the built product
T13.3-2 fails diagnosed at the first post-read `inventory` (the refresh writes
`build`'s eight-path record). Self project 357 passed / 1 skipped under the
unprivileged namespace.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… unresolved, read verbatim, the marker no type error

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…e characters, U+FFFD, and the verbatim spellings, each 14.4 pinned at the attribute

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… and U+FFFD as invalid boundary classes

Add `\`, `&`, and U+FFFD to P-1's weighted alphabet (weight 3 each, the
quote characters' weight) as invalid boundary classes of SPEC 1.4,
staged raw inside the quoted value SPEC 2.4 reads verbatim, U+FFFD as
the literal validly encoded code point; rewrite the module header's class
list and its "still to land" bullet. The oracle and the both-quote redraw
are unchanged (TEST-SPEC P-1: such a draw is not staged). On the fixed
seed set every certified flip class is still reached (segments 4 CTRL /
7 WIDE, tags 14 / 5) and each new character is drawn in both roles.
Certification green in the same shape (P-1 passes CONF-VALID, fails
exactly VIOL-VALID-CTRL and VIOL-VALID-WIDE); self project 357 passed /
1 skipped unprivileged; against the built product P-1 fails diagnosed
at the `\`-bearing segment draw `a\Ab` (built, exit 0), shrunk to `"`.
Record the landing in FIX_PLAN.md and remove Task 19.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…th legs: 14.19 with the plain-string concerned path, `at` by its spelling a malformed value, the glob-reached view its one route

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…n pitfalls in AGENTS.md

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… `view`'s resolved target, the code-group-only target, the above-root ascent past a real outside file, and the escape-spelled specifier read verbatim

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…port section-5.7's occurrence-unit renderers, for T2.4-5

The (file, range start) selector T14-2 used privately for a condition
staged more than once in one `build --json` sweep moves to support.ts,
and `renderOccurrenceUnit`/`expectedUnitMultiset` in section-5.7.ts are
exported: T2.4-5 (next commit) stages three 14.5 and two 14.6 findings in
one sweep and compares its `occurrences` record multiset the way T5.7-4
does. No test behavior changes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…ng literal read exactly as spelled, the escape-spelled marker no edge and no occurrence beside its escape-free control, the consumer type-checking clean

T2.4-5 joins test/suite/registry/section-2.4.ts (SUITE-08 now T2.4-1 …
T2.4-5; traceability "2.4", "1.4", "4.5", "5.7", "11.3", "14"). One
workspace: BASE holds `login` and `a`/`a.b`, the declaring file's head the
local `login` and `a`/`a.b`, src/app.ts the escape-free control marker —
the valid initial state builds (the prior generation the type-check
compiles against), then the edit appends the five MDX arms as exact parts
and the escape-spelled marker. `build --json` is pinned to exactly
{14.5: 3, 14.6: 2, 14.7: 1}, each finding within its own construct's
window; the consumer file type-checks clean; bare `occurrences` (exit 1,
the findings accompanying) lists exactly the control's record, its span
the bare chain — `query edges` refuses to answer on a failing workspace,
so the record is the edge's witness. Escape spellings are composed from
the backslash's code point.

Green through a stand-in that inserts the four owed findings and drops the
phantom records (a kept record is caught by the multiset, a mislocated
finding by its window). Against the built product T2.4-5 fails diagnosed
at the count assertion (`14.5 x2`): it resolves the interpreted spellings,
recording an occurrence for each — the known SPEC 2.4 deviation. Self
project 357 passed / 1 skipped under the unprivileged namespace. Task 22
removed from FIX_PLAN.md and recorded as landed; AGENTS.md notes the
stand-in rewrite.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…e values as invalid, each 14.17 finding pinned at the attribute's own range

SPEC 2.4 reads a quoted attribute value verbatim, so a coverage value spelled with a Unicode escape or a decimal character reference is neither required nor none (14.17); SPEC 14 locates an attribute condition at the attribute's own characters (the attribute range of 11.4). The invalid-value arms now pin that exact range instead of a containment window; the escape spelling is built from the backslash's code point. Against the built product the test fails diagnosed at the character-reference arm (the product interprets the reference and accepts the value, exit 0).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
T2.5-3's escape- and reference-spelled coverage arms landed at a59daa5; the plan drops the task.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…ntainer — one 14.16 brace through brace, no node in the view's tree, the container's bytes content in the enclosing text

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…nd the U+2029 class twin; record the kept form's residue-before-`<S` clause as a TEST-SPEC problem

Task 25 (partly). `test/suite/registry/section-3.ts`, T3-3's one fixture
(`DROP_SOURCE`/`DROP_COMPILED`) gains, per the current TEST-SPEC text:

- the drop form of the multi-line opening tag — `<S`, LF, `  id="mt1"`,
  LF, `>` on its own lines (flow context): one construct whose two interior
  terminators are deleted with it, the three lines merging into one left
  empty purely by the removal, dropped with its terminator (SPEC 3);
- the kept form with retained non-whitespace after the `>` — the same
  three-line tag opening at line start, `> bar` its third line, the merged
  line kept as ` bar` with its terminator;
- the U+2029 class-boundary twin: a line left holding only U+2029 is kept
  (SPEC 1.4) — neither violator classifies U+2029, so the arm is unmoved
  under both, as CERTIFICATIONS.md's VIOL-MD-CLASS entry states.

The kept form's "retained non-whitespace before the `<S`" clause is not
staged: `foo <S`, LF, `  id="x"`, LF, `> bar` is not well-formed MDX (14.20)
— a paragraph-continuation line beginning with `>` interrupts as a block
quote whatever its indentation (MDX disables indented code) and inside every
container, so the stock micromark mdxjs grammar and the product alike refuse
it; the bare `>` line closes a multi-line tag only when the tag opens at line
start (the concrete JSX flow attempt). The CONF-MD conformer's lexer would
accept it vacuously (it knows no block quotes) — a certification hazard.
Recorded, dated and with the resolutions open to the spec, in
`specs/tmp/TEST-SPEC-PROBLEMS.md`.

Conformer and violators unchanged: the lexer already reads a multi-line tag
as one construct. Certification outcomes unchanged — CONF-MD conformer 8/8;
VIOL-MD-CLASS fails exactly T3-3 and P-2; VIOL-MD-CR fails exactly T3-4 and
P-2. `npm run test:self` (unprivileged namespace): 19 files, 357 passed,
1 skipped. Typecheck and format clean. Against the built product the whole
section-3 file passes (T3-3 included: the product merges and drops/keeps the
tag's lines exactly as pinned).

FIX_PLAN.md: Task 25 amended in place (landed / blocked, how to resume per
each resolution); Task 25b added for T3-3's ESM-block arm (two imports on
one physical line separated by U+2028), which the refinement added and
CONF-MD's scope names but the conformer's `IMPORT_RE` line-start lexing does
not yet read — the analysis is in the task.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…st the stock grammar

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…6 to the U+000B/U+000C remainder; add S-9 fixture well-formedness; log SPEC 6.2/6.5 move contradiction

Review round 1 of the Phase 6 revisit (TEST-SPEC-PROBLEMS.md, T3-3).

Applied: C1, C2 (TEST-SPEC-level parts), I1, O1, O2.
- C1/O1: T3-3's multi-line opening tag now has three arms verified to derive
  under MDX 3 (drop form; in-line kept form `foo <S` / `  id="x"` /
  `  coverage="required"> bar</S>` -> `foo  bar`; flow-start kept form
  `<S` / `  id="x"` / `> bar</S>` -> ` bar`) and states the in-line tag's
  grammar constraint (paragraph-continuation lines only; closing tag within
  the paragraph). Resolves the logged T3-3 problem; TEST-SPEC-PROBLEMS.md
  deleted.
- C2: T6.2-3's impure arm staged with a U+000B/U+000C remainder (the one
  realization of 6.2's worked case that derives at origin and destination);
  plain remainders recorded as unstaged; P-5's section moves and oracle
  clause constrained to shapes that derive at the destination; S-6's vector
  given the stageable shape. The contradiction between SPEC 6.2's worked
  case, 6.5's insertion rule, and 6.5's validity promise is logged to
  specs/tmp/SPEC-PROBLEMS.md (verified with the full MDX 3 parse: tokenizer
  plus mdast tag matching; the AGENTS.md tokenizer-only recipe misses
  tag-matching failures).
- I1: S-9 fixture well-formedness self-test (deterministic fixtures, generator
  form vectors, per-draw gate; early-error allowances named).
- O2: section 16 preamble names the in-line construct constraint the
  generators compose under and the per-draw check.
Rejected: none.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…rite, admissible import offsets, ESM-aware removal, fixed created-file form

Applied: C1, C2, C3, C4, C5, C6, I1.
- 6.5 gains `refused-invalid-rewrite` (14): a section-form move whose exact
  edits would leave the origin or target file other than well-formed MDX, or
  a needed import addition with no admissible offset, is refused before any
  modification; the six reviewed shapes are named as instances; the validity
  promise now covers well-formedness and reference resolution.
- Import addition: placed only at an admissible offset (rewritten file
  well-formed, the added line an import declaration); latitude kept among
  admissible offsets; a created target file's initial content is fixed
  (declarations, an empty line, the moved text).
- Import removal: not made where it would demote the block's remaining
  declarations; the import stays unused (2.1).
- 6.2's example restated over the shape that derives on both sides with
  plain whitespace (opening tag ends its line, closing tag begins its line,
  verified against the full MDX 3 parse); the refused `body</S>`
  realization named, U+000B/U+000C excepted.
- I1: the keep-ID no-op sentence now excludes local-form references to nodes
  the origin keeps, which are rewritten to external form.
Rejected: none. O1 acknowledged (TEST-SPEC cascade; no SPEC change).
SPEC-PROBLEMS.md: resolution note appended; the file stays until HALT.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…tespace (I1)

Worked example restated over spaces and tabs on both boundary lines; the
`body</S>` realization refused unless the opening tag's trailing whitespace
contains U+000B/U+000C; the worked shape with such a character on one
boundary line only named as refused; 6.5's first named instance qualified
to match.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…file; local-form branch (I2)

Every spelling the moved text carries is judged from the target file; external
chains rooted at an origin binding the target lacks or binds elsewhere are
respelled through a binding the target holds or an added import; a reference
whose target's module is the referencing file's own is spelled in local form
(the target file's own references to the moved subtree included); the
validity promise and 6.4's by-construction sentence gain the local-form
branch; 14's added-import location phrase covers respelled chains.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
… outside sections (C1, O2)

Edits compose in pre-operation coordinates: replaced ranges whole, no addition
strictly inside another edit's range, insertions at a range's end after it and
at its start before it (the self-closing parent rewrite excepted), and at one
offset the target insertion before the added declarations, additions
contiguous in the implementation's order. Admissible offsets stand inside no
section construct of the composed file.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…ts first declaration (I3, O3)

Removals in one ESM block are judged together over the block as all would
leave it; where a comment or an indented declaration would head it, the
block's first declaration stays (unused, no removal reported) and the others
proceed; the clause is scoped to spec sources.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
…used-invalid-rewrite's identities (C2, O1)

New reason `refused-moved-import`: a section-form move whose moved text holds
an import declaration is refused before any modification, locating each
declaration (the travelling specifier would resolve from another directory,
its binding could collide, and origin-kept references rooted at it would lose
their binding; a valid-looking result could silently retarget edges, so the
refusal is blanket). `refused-invalid-rewrite`'s identities now name each
file whose would-be text is not well-formed and each file holding no
admissible offset. Round-2 resolution note appended to SPEC-PROBLEMS.md
(retained for the Reviewer's confirmation); REVIEW.md removed.

Round 2 applied: C1, C2, I1, I2, I3, O1, O2, O3 (commits eb22c7b, d43aae8,
3fc96ba, 565f80c, and this one). Rejected: none. O4 needs no SPEC change
(cascade note for TEST-SPEC/CERTIFICATIONS in Phases 6-7).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TyZ5zUv2UCkvTkM1tkYUp2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants