This repository was archived by the owner on Jul 18, 2026. It is now read-only.
Repository navigation
Claude/nomark intents resolvers tn n4 v - #1
Merged
Merged
Conversation
Lockfile was lagging the package.json version bumps already on this branch (engine 0.1.1→0.2.1, pro 0.1.1→0.2.0, create-nomark-engine 0.1.0→0.1.2). Surfaced by `npm install` during W1 resolver verification — no source change. https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
W2 — composition-data-verbs.ts: hermetic fixture exercising the 3 chosen
data-category compute verbs (ENRICH, DELETE, STREAM), anchored by FETCH and
EMIT. Per-backend expected outputs are NOT in this commit — surfaced for
owner shape-approval first per the SUR-000 gate pattern.
W3 — VUE_STYLE.md, SVELTE_STYLE.md: per-framework style contracts modeled
on REACT_STYLE.md (frozen 2026-04-18). Helper-per-verb naming carried over
as instructed. Vue uses `<script setup>` + `defineRender` (Vue 3.5+);
Svelte uses `{#snippet}` + `{@render}` (Svelte 5).
W3 — expected/vue/Dashboard.vue, expected/svelte/Dashboard.svelte: full
hand-authored byte-exact candidate fixtures equivalent to the existing
expected/react/Dashboard.tsx. Awaiting owner gate-2 ack to freeze.
No backend code in this commit. Tests still 104/104 — these are
draft-state files only.
https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
Adds two new surface target labels alongside `react`, both consuming the
same FIXTURE_SURFACE_COMPOSITION and emitting framework-native equivalents
of the React Dashboard.tsx fixture.
vue (`Dashboard.vue`):
- Single-file component, `<script setup lang="ts">` only — no `<template>`.
- Helper-per-verb returning `VNode`; render via `defineRender(() => ...)`.
- Hyphenated props ('data-monitor', 'aria-live') as quoted object keys.
- Null-filter at the composition root, not in individual helpers.
- Targets vue@^3.5 (defineRender stability).
svelte (`Dashboard.svelte`):
- Two `<script>` blocks: `module` exports DashboardState; instance binds
`$props()`. Below: one `{#snippet}` per verb in leaf-first order, then
`{@render outcome(state)}` as the entrypoint.
- `{#if}` for STATUS / GUIDE predicates; empty true-branch DOM = React null.
- Targets svelte@^5.0 (snippets + runes).
Wiring:
- `registerResolver('vue', ...)` and `registerResolver('svelte', ...)`.
- Harness `SURFACE_LABELS` → ['react', 'vue', 'svelte'] — byte-exact pass.
- Dispatcher snapshot test pinned at 9 backends (was 7); ambiguity tests
added for vue and svelte TargetTag rejection.
- Manifest test covers `resolveAll(comp, ['react','vue','svelte'])` →
3 entries, no warnings, correct file paths.
- API-smoke `availableTargets()` length pin bumped 7 → 9.
- README target table 7 → 9; corrected the "20 compute verbs" overclaim
to "7 of 20" while in this section.
Tests: 109 passed (was 104). Build clean. STYLE.md docs frozen on
gate-2 ack — DRAFT headers pending follow-up sweep.
https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
Both contracts now point at the actual byte-exact backends in commit 4e49754 (Vue + Svelte). The DRAFT status is replaced with APPROVED; the trailer references the original fixture commit (e027d0d) and the backend commit (4e49754) for traceability. https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
… backends All four compute backend files (TS, Python, Rust, SQL) gain three new verb handlers each, registered in the backend's handler map. Net +12 private emit methods + 12 dispatcher entries; no preamble/postamble changes (the new verbs slot into the existing Ctx + __execute pattern). ENRICH: splats `params.with` extras into each input row. Procedural backends use spread/dict-merge; SQL backends emit a view that adds the extras as additional columns from a `SELECT *` base. DELETE: opens the same DB connection PERSIST uses, runs `DELETE FROM <sink.table> WHERE <predicate>`, returns a receipt with `reversible: false` (the irreversibility is the point). SQL backends emit the bare DDL with quoted table. STREAM: materialises the source SELECT into rows. Procedural backends include a `// STREAM: host should adapt this to async iteration over a real cursor.` comment; SQL backends emit `-- STREAM <id>: cursor / iteration handled by host.` plus a bare `SELECT *`. Async-iterable emission is deferred — host wraps for now. Generated output for FIXTURE_DATA_VERBS_COMPOSITION reproduces with zero VERB_UNHANDLED warnings on all 6 backends; only the existing SQL EMIT fixed-spec warning remains. Tests: 109 passed unchanged (no new byte-exact pin yet — that's gate-2b: owner reviews generated output, then I freeze the 6 expected files + add the harness test). https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
…xact tests Owner ack'd the candidate output from commit 56e5426. Pinning the 6 generated files as the byte-exact contract for the data-verbs wave: - expected-data-verbs/typescript/archive_compaction.ts (5,660 bytes) - expected-data-verbs/python/archive_compaction.py (5,651 bytes) - expected-data-verbs/rust/archive_compaction.rs (9,465 bytes) + Cargo.toml - expected-data-verbs/sql-postgres/archive_compaction.sql (691 bytes) - expected-data-verbs/sql-sqlite/archive_compaction.sql (689 bytes) - expected-data-verbs/sql-mysql/archive_compaction.sql (717 bytes) New test file `composition-data-verbs.test.ts` parallels the harness pattern: one byte-exact backend test per compute label (6 tests), plus a procedural-no-warnings assertion and a SQL-EMIT-only-warning assertion. The localeCompare sort for filename comparison handles the "Cargo.toml" vs "archive_compaction.rs" case-fold ordering that bit default `.sort()` (uppercase 'C' < lowercase 'a' in ASCII). README target table footnote: "7 of 20 compute verbs" → "10 of 20" covering the new ENRICH/DELETE/STREAM handlers; remaining-13 → 10. Tests: 117 passed (was 109, +8). Build clean. https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
Three structured design docs, one per remaining wave, addressing the "complete all outstanding verbs" directive via the gate plan (option C): W4_RESILIENCE_DESIGN.md (178 lines): RETRY/COMPENSATE/ERROR. Inline-target IR shape avoids the "secondary verbs" problem; existing dispatcher unchanged. Per-backend emission shapes specified. Open questions: SQL emission strategy, ERROR catch matching, COMPENSATE non-DB sink semantics. W5_FLOW_DESIGN.md (236 lines): AWAIT/BRANCH/SPLIT/MERGE/GATE/SIGNAL/TERMINATE. Dual-form dispatcher: linear-chain (current) for non-flow compositions, graph-aware (new) when flow verbs detected. Existing fixtures stay byte-exact — explicit BC test specified. Per-verb emission shapes for all 4 compute backends. Highest risk wave; needs owner ack on refactor approach + IR shape additions before any code. W6_SURFACE_OUTCOME_DESIGN.md (188 lines): DECIDE/CONFIGURE/EXPLORE/AUTHOR/ONBOARD/COLLECT. Turns the read-only Dashboard interactive — proposes DashboardState v2 (selections + drafts), DashboardDispatch event convention, framework-agnostic semantic-HTML pattern table, new REACT/VUE/SVELTE_INTERACTIVE.md style contracts (existing 3 STYLE.md docs stay frozen for read-only). Backwards-compat via signature-flag dispatcher. Highest contract surface area. No backend code in this commit. After per-wave ack, implementation parallelizes across backends via subagents. https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
…ckends
Adds the 3 resilience-category compute verbs to all four compute backend
files. Compute coverage: 10/20 → 13/20. Per the W4_RESILIENCE_DESIGN
proposal acked along with the W5/W6 docs ("A k all").
Design: inline-target IR shape — each resilience verb embeds its target
as `{ verb, params }` rather than referencing a sibling verb id. The
existing linear dispatcher stays unchanged; existing W1/W2 fixtures
remain byte-exact (verified: 117 pre-W4 tests still pass).
Per-backend strategy (matches W4 design §4):
- TS: try-catch wrapping `__retry(async () => { ...inlined... })`
- Python: nested `_attempt()` async closure passed to `_retry`
- Rust: closure-based `retry(attempt, ...)` with `match` for error_route
- SQL: comment-only emission with three new fixed-spec warnings
(RETRY, COMPENSATE, ERROR) — host runtime handles all three
Open questions resolved per design proposals:
- Inline target IR: `{ verb, params }` (matches nested compositions)
- COMPENSATE non-DB sinks: SQL warning fixed-spec; procedural runs reverse
- ERROR catch matching: name-based string match across all backends
- SQL strategy: comment-only with new fixed-spec warnings
Fixture: `resilient_etl` — 4 verbs (RETRY-fetch, ERROR-validate,
PERSIST, COMPENSATE-rollback). Hermetic, 70 lines.
Tests: 125 passed (was 117, +8 W4: 6 byte-exact backend pins +
no-warnings + SQL-warnings-only assertions). Build clean.
README: "10 of 20 compute verbs" → "13 of 20"; remaining-7 list
explicitly enumerated as flow-category pending W5.
https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
…INATE)
Adds the 7 flow-category compute verbs across all 4 compute backend files
plus a dual-form dispatcher refactor. Compute coverage: 13/20 → 20/20
(full coverage). Per the W5_FLOW_DESIGN proposal acked along with the
W4/W6 docs.
Dispatcher refactor (core/ir.ts):
- New `hasFlowVerbs(c)` detector + `buildLinearChain(c)` helper.
- `isSelfDispatching` set: BRANCH, TERMINATE (route internally; no auto-
next). SPLIT does dispatch internally but resumes linear flow after
children complete (so MERGE runs).
- `splitChildIds(c)`: SPLIT-children are not in the linear backbone —
reachable only via SPLIT. They have null linear next.
- BRANCH conditional targets are also flow-targets (null linear next
unless explicit `next` set on the verb).
Per-backend strategy:
- TS: graph-form postamble emits __TerminateError class + try/catch in
run(); preserves linear-form when no flow verbs (BC-byte-exact).
- Python: same pattern with _TerminateError class.
- Rust: TERMINATE emitted as anyhow!("__TERMINATE: ...") tagged error;
run() pattern-matches the prefix to short-circuit cleanly.
- SQL: comment-only emission for all 7 flow verbs with new fixed-spec
warnings (VERB_UNEXPRESSIBLE_IN_SQL). TERMINATE emits a `ROLLBACK;`
on top of the comment — the only flow verb with semi-honored SQL.
Two new fixtures:
- flow_routing (BRANCH + TERMINATE): 6 verbs covering conditional path
selection and TERMINATE-with-cleanup.
- flow_parallel (SPLIT/MERGE/AWAIT/GATE/SIGNAL): 9 verbs covering 3-way
parallel fan-out with the rest of flow control.
Backwards compatibility — explicit guarantee per W5 design §7:
The linear-chain dispatcher emission for compositions WITHOUT flow
verbs is byte-equal to pre-W5 output. All existing W1/W2/W4 fixtures
(daily_fund_flow_etl, archive_compaction, fund_flow_dashboard,
resilient_etl) still pass byte-exact tests, verified at every step
of the refactor — 125 pre-W5 tests remain at 125/125 throughout.
Tests: 141 passed (was 125, +16 W5 — 8 routing + 8 parallel: 6 backend
byte-exact pins + 1 procedural-clean + 1 SQL-warnings each). Build clean.
Open questions resolved per design proposals:
- TERMINATE in SQL: emit `ROLLBACK;` plus comment.
- Host-injection convention: `globalThis.__gate/__await/__signal` (TS),
`globals().get("__gate__"/"__await__"/"__signal__")` (Python),
feature-flag stubs (Rust — host injects via trait object later).
- SPLIT context isolation: each branch gets a fresh Ctx; results
collected into ctx.values["<split_id>:branches"] for MERGE.
- MERGE strategies: 'all' (concat-flatten), 'first', 'majority' all
implemented in TS/Python/Rust.
- AWAIT timeout fallback: routes to `timeout_route` if set, else
returns null.
README: "13 of 20 compute verbs" → "all 20"; flow-category enumerated
as graph-aware dispatcher emission.
https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
…R/ONBOARD/COLLECT)
Adds the 6 outcome surface verbs across all 3 surface backends (react,
vue, svelte). Surface coverage: 5/11 → 11/11 (full coverage). Per the
W6_SURFACE_OUTCOME_DESIGN proposal acked along with W4/W5 ("A k all").
Detection + signature-flag dispatcher (path A per W6 design §7):
- New `hasInteractiveVerbs(c)` / `isInteractiveVerb(name)` helpers in
core/ir.ts.
- Each surface backend toggles `this.interactive` in `targetVerbs(c)`
(which runs before handlers fire). Read-only compositions emit the
W3 byte-exact Dashboard signature; interactive compositions emit
`Dashboard(state, dispatch)`.
DashboardState v2 + DashboardDispatch (interactive only):
- `selections: Record<string, unknown>` — DECIDE/EXPLORE/ONBOARD picks
- `drafts: Record<string, unknown>` — AUTHOR/COLLECT/CONFIGURE in-progress
- `DashboardDispatch = (event: { verb, id, action, payload }) => void`
Per-verb HTML pattern (framework-agnostic, identical attributes):
- DECIDE: `<form data-decide>` + per-option `<button data-option>`,
click → 'select'
- CONFIGURE: `<form data-configure>` + per-param `<label>+<input>`,
per-input change → 'set', `<button>Apply</button>` → 'apply'
- EXPLORE: `<section data-explore>` + `<input type='search'>` +
`<ul role='listbox'>` of results from `state.values[<source>]`,
search change → 'query'
- AUTHOR: `<form data-author>` + `<output>` placeholder + `<textarea>`
+ `<button>Save</button>`; textarea change → 'edit', save → 'save'
- ONBOARD: `<nav data-onboard>` + `<ol>` of step `<li>` + 'advance'/
'skip' buttons
- COLLECT: `<label>` + `<input>` matching CollectType, change → 'input'
Per-framework idiom adaptations (documented in INTERACTIVE.md docs):
- React: `onClick={() => dispatch(...)}` JSX events, `defaultValue`
for inputs.
- Vue: `onClick: () => dispatch(...)` h() prop convention,
`value: String(...)` for inputs.
- Svelte 5: `onclick={() => dispatch(...)}` lowercase HTML-attribute
events (post-`on:` deprecation), `{@const}` for derived locals,
`{#each}` for result lists, bare `required` boolean attribute.
Fixture: `admin_console` — 8 verbs, all 6 outcome verbs + MONITOR/ARRANGE
wrapper. Hand-authored byte-exact Dashboard.tsx/.vue/.svelte (SUR-000
pattern) THEN backends implemented to match. All three byte-exact on
first generated emission after a small fix to set `this.interactive`
in `targetVerbs` (which runs before handlers fire) rather than in
`emitPreamble` (which runs after).
Style contracts (frozen on owner ack):
- REACT_INTERACTIVE.md: detection rule, DashboardState v2, dispatch
convention, per-verb HTML, action codes, BC guarantee.
- VUE_INTERACTIVE.md / SVELTE_INTERACTIVE.md: framework-divergence-only
docs pointing at REACT_INTERACTIVE for the shared contract.
Backwards compatibility — explicit guarantee per W6 design §7 path A:
The W3 read-only `fund_flow_dashboard` fixture stays byte-exact through
the W6 PR. All 6 W3 backend tests pass unchanged. The `interactive`
flag is per-composition, not global — read-only compositions emit
exactly what they did pre-W6.
Tests: 146 passed (was 141, +5 W6: 3 byte-exact backend pins +
no-warnings + mixed-manifest entries). Build clean.
Open questions resolved per design proposals:
- Path A vs Path B (BC): A — signature-flag, preserves W3 byte-exact.
- dispatch as positional arg or context: positional — keeps emission terse.
- CONFIGURE submit semantics: per-input 'set' events for live state +
explicit 'apply' on submit.
- AUTHOR Schema representation: opaque string ref + `<output>` placeholder.
- EXPLORE scope: minimal (search + result list); filter/sort to W6.1.
- ONBOARD progress types: 'step' only for v1.
README: "5 of 11 surface verbs" → "all 11"; signature-flag emission
documented inline.
https://claude.ai/code/session_012VwPKCes8k2Fv2wTVucxLQ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.