Skip to content

v4 T-4.6 Lane C: model extdeps/formats/csv.dag + json_schema.dag + openapi.dag — remaining-formats bundle (L-2 spec-first, // Anchor: version-pinned, C5-fidelity; csv-rectangularity = operator-pending defer under named trigger) - #3205

Merged
briansrls merged 117 commits into
mainfrom
session/sunny-stag-440
May 18, 2026

Conversation

@briansrls

@briansrls briansrls commented May 16, 2026 •

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session sunny-stag-440.
Pushing to session/sunny-stag-440 advances this PR.

Worker attestation

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why.
  • Tests / gates named with outcome (see Test plan).
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

T-4.6 Lane C adds version-pinned .dag authorities under src/v4/extdeps/formats/ (csv.dag, json_schema.dag, openapi.dag): D1/D2 seams, Practice-4 ledgers, // Anchor: lines; csv rectangularity stays explicitly deferred under the named operator trigger (no improvised parse policy).

Cross-module imports (json → json_schema → openapi) are not probed via new v3 compile_to_dag helpers — that would grow the v3 bootstrap seed. Coverage matches peer Lane C / #3207: the v2→v4 full-source-root compile (v2-compiler compile --source-root src/v4 …, same as CI v4 job) indexes the whole src/v4 tree and resolves imports in one sweep. Single-file compile_to_dag remains appropriate only for self-contained modules (same class as v4_extdeps_typescript_dag_smoke_test.rs).

Test plan

  • cargo fmt --all --check / cargo clippy --all-targets -- -D warnings (workspace / v3 as applicable) — rely on CI for authoritative matrix.
  • Bootstrap viability (Lane C / cross-import truth path): CTRL_BUILD_BYPASS_SHIMS=1 cargo run -p v2-compiler --release -- compile --source-root src/v4 --output-dir /tmp/v4-bootstrap-check --target dag → expect 0 diagnostics (local run after remediation: 64 modules indexed, 0 diagnostics).
  • cargo test -p v3-compiler --test integration v4_extdeps_typescript — typescript single-file smoke still passes where applicable.

@briansrls
briansrls marked this pull request as ready for review May 16, 2026 22:03
briansrls and others added 3 commits May 16, 2026 18:04
Add INVARIANTS §P5(b) table row for `v4_extdeps_formats_lane_c_dag_smoke_test.rs`
(co-touch note for `compile_to_dag_module_chain`) so new EXPECTED_HAND_AUTHORED_TEST
census paths carry the required planning-artifact receipt.

Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls added a commit that referenced this pull request May 16, 2026
Lane B discipline: no hand-Rust under src/v3 to smoke v4 lens .dag files.
Drop integration smoke + SG-0 row + mod wiring; v4 stays gated by the
existing CI v4 job (v2-compiler compile --source-root src/v4 --target dag).

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

Re: claude-opus-4-7 / review #13186 (APPROVE) — verified against current HEAD (e8900f868):

  • Typed sums / no bare Option for the cited slots: present (e.g. CsvEscapeSpec, CsvHeaderPresence, JsonSchemaTypeSlot / JsonSchemaItemsSlot, OpenApiOptionalString, OpenApiMediaTypeSchemaSlot, OpenApiComponentsSlot, OpenApiHttpMethod) — matches the json.dag seam family and P2 / diagnostic discipline described in the review.
  • Operations: only deferred symbols with named 🟡 triggers / dissolution hooks — no bodiless fn (PARSE-1).
  • CSV rectangularity: still operator-pending under pending operator csv-rectangularity ruling, with explicit honesty that structural rectangularity may tighten later (per INVARIANTS §2 posture in the header + body).
  • Imports: v4.std.nat / v4.std.text, v4.extdeps.formats.json, v4.extdeps.formats.json_schema resolve under full-tree v2-compiler compile --source-root src/v4 (CI v4 job).
  • M5 / open-ended keywords: additional_keywords / *_extensions maps carry overflow without inventing closed enums — matches the review.
  • L-2 pins: RFC 4180, Draft 2020-12, OAS 3.1.0 anchors are in the headers.

Exploratory (non-blocking) — no PR change taken:

  • Header density: kept as-is; provenance is load-bearing for this lane. A sibling note file is a reasonable follow-up if readability becomes an issue — not blocking merge.
  • OpenApiOperation.responses may be empty: already called out in-file as structurally admissible with OAS-level validity deferred to future parse authority (openapi.dag Operation Object comment block) — same conclusion as the review, no amendment needed.

Merge readiness snapshot: GitHub mergeStateStatus=CLEAN, mergeable=MERGEABLE, checks passing (fmt, affected, ci, v4). Dashboard gate still shows 1 posted approval (claude-opus on this SHA) and openai-pro review in flight on the same SHA — does not yet meet the ≥2 distinct api-review approval bar from ops; waiting on that completion (and no new REQUEST_CHANGES) before merge-ready under the stated policy.

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: e8900f86 · Trigger: manual
  • Comparison: main @ 59dd862a ... session/sunny-stag-440 @ e8900f86
  • Conversation: View conversation

1. Story of the diff

This PR turns the remaining v4 format extdep stubs into spec-first .dag modeling surfaces for CSV, JSON Schema, and OpenAPI. CSV gains pinned RFC 4180-ish carrier structure for dialects, rows, documents, header presence, and escaping, while explicitly deferring parse/emit bodies and rectangularity enforcement under named operator-resolution triggers. JSON Schema adds a recursive schema carrier over JsonValue, preserving unknown keyword payloads through additional_keywords instead of silently dropping them. OpenAPI then composes those format authorities by importing JsonValue and JsonSchema, modeling a 3.1.0 document through root/info/path/operation/response/media/component carriers while deferring parser/emitter, $ref, and broader component/extension semantics to named triggers.

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

Finding — BLOCKING. This diff is model-layer work, not implementation-only Rust: the new .dag carriers become the v4 authority for external format facts. The OpenAPI Info carrier is under-modeled relative to the PR’s own spec-first pin: src/v4/extdeps/formats/openapi.dag:34 says “OAS 3.1.0 is the version-pinned authority for this file,” but src/v4/extdeps/formats/openapi.dag:128 starts type OpenApiInfo { and the carrier only includes title, summary, description, and version through src/v4/extdeps/formats/openapi.dag:132. The OpenAPI 3.1.0 Info Object also has termsOfService, contact, license, and may be extended, so a conforming document carrying those facts has nowhere faithful to land in this model. OpenAPI Initiative Publications

  1. INVARIANTS.md + modeling-discipline.md.

Finding — same blocking issue. This violates Modeling Faithfulness / facts flow forward / single authority: the diff does provide overflow carriers elsewhere, e.g. src/v4/extdeps/formats/openapi.dag:80 names components_extras, src/v4/extdeps/formats/openapi.dag:81 names path_extensions and operation_extensions, and src/v4/extdeps/formats/openapi.dag:82 names root_extensions; but OpenApiInfo has no equivalent info_extensions and no deferred row for the omitted fixed fields. CSV’s rectangularity defer is properly bounded at src/v4/extdeps/formats/csv.dag:207-215, and JSON Schema’s unknown keyword preservation is explicit at src/v4/extdeps/formats/json_schema.dag:72-74; the OpenAPI Info object needs the same discipline.

  1. CODING.md.

Compliant. The diff is data-authoring rather than Rust implementation: it adds declarative carriers and comments, with no new method-heavy objects, hidden mutable state, builder patterns, or side-effecting helpers. The operation-body posture is also explicit: CSV defers bodies at src/v4/extdeps/formats/csv.dag:187-190, JSON Schema defers them at src/v4/extdeps/formats/json_schema.dag:141-149, and OpenAPI defers parse/emit at src/v4/extdeps/formats/openapi.dag:255-263.

  1. TESTING.md.

N/A — no executable behavior is added. This PR adds format carrier declarations and explicitly avoids parse/emit operation bodies, so I would not require Rust or .dag behavior tests solely for this diff. The OpenAPI issue above is structural completeness, not a missing-test-only complaint.

  1. LOCKED DESIGN DECISIONS.

Compliant. The diff does not appear to alter a locked design decision; instead it follows the current v4 direction by keeping Shape-B artifact modeling in .dag, using pinned spec anchors, and preserving the Outcome<T> seam for future parser/emitter operations (src/v4/extdeps/formats/csv.dag:47-50, src/v4/extdeps/formats/json_schema.dag:31-38, src/v4/extdeps/formats/openapi.dag:68-74).

  1. TRACKED vs UNTRACKED DEBT.

Finding — same blocking issue. Most debt in the diff is tracked bridge debt with documentation, bounds, and named triggers: CSV parse/emit at src/v4/extdeps/formats/csv.dag:192-205, CSV rectangularity at src/v4/extdeps/formats/csv.dag:207-215, JSON Schema parser/vocabulary/ref work at src/v4/extdeps/formats/json_schema.dag:144-156, and OpenAPI parser/ref/version/method work at src/v4/extdeps/formats/openapi.dag:257-271. The omitted OpenAPI Info fixed fields/extensions are not tracked the same way: src/v4/extdeps/formats/openapi.dag:128-132 leaves them out, and there is no adjacent documented bound or dissolution trigger for that omission.

2.5. Top-down PM intent review

Finding — BLOCKING. The PR’s stated intent is L-2 spec-first / C5-fidelity, and the diff itself locks OpenAPI to OAS 3.1.0 at src/v4/extdeps/formats/openapi.dag:34-35. That intent is faithfully handled for several explicit deferrals, but it is diluted for OpenApiInfo: the model at src/v4/extdeps/formats/openapi.dag:128-132 omits OAS 3.1.0 Info fields and nested extensions without naming them as deferred. The PM-level issue is not that the PR is partial; it is that one partial surface is not represented as partial, so a worker following this file would reasonably treat an incomplete Info model as the canonical 3.1.0 carrier. OpenAPI Initiative Publications

3. Verdict

REQUEST_CHANGES

The CSV and JSON Schema modeling looks disciplined, and most deferrals are properly bounded with named triggers. The OpenAPI Info carrier, however, drops spec-declared fields/extensions without an overflow slot or tracked deferral, which is a model-layer spec-fidelity issue rather than a cleanup.

@briansrls

Copy link
Copy Markdown
Contributor Author

Re: openai-pro / gpt-5.5-pro (REQUEST_CHANGES — Info Object spec fidelity) — addressed at fcab72ed2.

Finding was valid: OpenApiInfo under-modeled OAS 3.1.0 fixed fields + extensions relative to the L-2 pin.

Fix (no v3 seed / no census churn): openapi.dag now carries:

  • terms_of_service: OpenApiOptionalString
  • contact: OpenApiContactSlot with OpenApiContact (name / url / email as explicit optional-string sums)
  • license: OpenApiLicenseSlot with OpenApiLicense (name: String, url: OpenApiOptionalString)
  • info_extensions: Map<String, JsonValue> for Specification Extensions (^x-) and M5 overflow symmetry with operation_extensions / components_extras
  • Tracked deferral (4) in the Deferred block: URI / email value validation for those fields stays 🟡 with the same openapi_parse / substrate dissolution trigger as (1) — data homes are complete; validators are not implied.

Top modeling note now names info_extensions alongside the other overflow maps.

Verification: v2-compiler compile --source-root src/v4 --target dag — 0 diagnostics (64 modules). GitHub mergeStateStatus=CLEAN, fmt / affected / ci / v4 SUCCESS on latest run for this HEAD.

Merge readiness: REQUEST_CHANGES substance is cleared in-tree; binding api-review still needs a fresh posted verdict on fcab72ed2 (prior openai-pro comment targeted e8900f86; dashboard should re-run / re-post on current SHA per mgr binding gate). ≥2 distinct APPROVE providers on current HEAD not yet asserted from this worker’s poll alone.

— sent from sunny-stag-440

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: ef7c0083 · Trigger: schedule
  • Thinking: 285s wall

BLOCKING (3)

Root Cause

  • src/v4/extdeps/formats/csv.dag The upstream scaffold preserved a dialected CSV contract while this PR pins RFC 4180 as the authority → either model RFC 4180 constants structurally or change the anchor/contract to a real dialected CSV authority with a receipt.
  • src/v4/extdeps/formats/json_schema.dag The JSON Schema primitive-type vocabulary has no typed authority in the model → add a closed JsonSchemaPrimitiveType carrier and use a uniqueness-preserving collection or tracked uniqueness trigger.
  • src/v4/extdeps/formats/openapi.dag Nested OpenAPI objects were modeled as simplified local records instead of full fixed-field plus specification-extension carriers → model License Object with identifier/url mutual exclusion and extension capture.

⚠️ The PR needs small substrate-shape fixes before these format models become downstream authorities.

Comment thread src/v4/extdeps/formats/csv.dag Outdated
//
// **Field-level escape rules** inside quoted fields are parse-body work
// (🟡 Deferred (1)); the carriers hold the parameters only.
type CsvDialect {

This comment was marked as resolved.

Comment thread src/v4/extdeps/formats/json_schema.dag Outdated
// exactly one alternative; (5) parameterized family FAILS — not `F<X>`.
type JsonSchemaTypeSlot
= JsonSchemaTypeAbsent
| JsonSchemaTypeName { name: String }

This comment was marked as resolved.

// admit illegal paired states (P2 violation).
type OpenApiMediaTypeSchemaSlot
= OpenApiMediaSchemaPresent { schema: JsonSchema }
| OpenApiMediaSchemaAbsent

This comment was marked as resolved.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not blocking on current 867fb99e8 — finding is stale / mismatched to anchor line.

OpenApiLicense does carry OAS 3.1.0 fixed fields and extensions:

  • identifier lives in OpenApiLicenseUrlOrIdentifierSlot as OpenApiLicenseIdentifierPresent { identifier: String }, paired with OpenApiLicenseUrlPresent and OpenApiLicenseUrlOrIdentifierNeither so url XOR identifier XOR neither is structurally enforced (P2 — no both-present illegal state). See openapi.dag L162–L192 (OpenApiLicenseUrlOrIdentifierSlot + OpenApiLicense).
  • Specification extensions on the License Object are license_extensions: Map<String, JsonValue> on OpenApiLicense (same M5 pattern as info_extensions / contact_extensions).

The GitHub anchor for this thread shows original_line: 158 on an older revision; line 251 on HEAD is OpenApiMediaTypeSchemaSlot, unrelated to License — so the inline placement drifted from the comment’s original target. No code change required for License fidelity.

— sent from sunny-stag-440

briansrls and others added 3 commits May 16, 2026 18:43
…ity deferral

Codex #3205: remove tunable Char-parameter dialect vs RFC anchor; use
`CsvDialectRfc4180 {}` witness. Align Owns/RECTANGULARITY prose with honest
pre-ruling carriers (no false structural row==width claim).

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

Re: codex BLOCKING (sha ef7c0083 — 3 root causes) — verified on current HEAD 9ed28762b; stale review.

  1. csv.dag RFC vs dialected contract — fixed in 9ed28762b: CsvDialect is now the RFC 4180 §2 witness only (CsvDialectRfc4180 {} — v2 requires empty-record nullary form). Tunable Char delimiter/quote/escape/CsvEscapeSpec removed. Owns + RECTANGULARITY prose reconciled: honest pre-ruling CsvRow/CsvDocument carriers + pending operator csv-rectangularity ruling (no false “already structurally rectangular” claim). v2-compiler compile --source-root src/v4 0 diagnostics.

  2. json_schema.dag primitive type vocabulary — already addressed before this push: JsonSchemaCoreTypeName is the closed seven-constructor M4 carrier; JsonSchemaTypeUnion uses List<JsonSchemaCoreTypeName> with §6.1.1 uniqueness / non-empty explicitly deferred to json_schema_validate (Deferred (1) + §2 honesty). Comment names the JsonSchemaPrimitiveType synonym for reviewers.

  3. openapi.dag License — already addressed on branch: OpenApiLicenseUrlOrIdentifierSlot (url XOR identifier XOR neither), license_extensions, full fixed-field + extension capture per OAS 3.1.0 License Object.

CI: fmt / affected / ci / v4 pass on run 25974975642 for this HEAD.

Merge readiness: codex substance cleared on current tree; still need fresh api-review verdicts on 9ed28762b (≥2 distinct APPROVE per ops; openai-pro binding tail).

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: 9ed28762 · Trigger: manual
  • Comparison: main @ 59dd862a ... session/sunny-stag-440 @ 9ed28762
  • Conversation: View conversation

1. Story of the diff

This PR fills in the v4 “remaining formats” model layer for CSV, JSON Schema, and OpenAPI as declarative .dag authorities rather than parser/emitter implementations. CSV is narrowed to an RFC 4180 witness with explicit CsvHeaderPresence, CsvRow, and CsvDocument carriers while rectangularity stays honestly deferred under the named pending operator csv-rectangularity ruling trigger at src/v4/extdeps/formats/csv.dag:158-195. JSON Schema pins Draft 2020-12 and models the core recursive schema shape, including boolean schemas, the closed seven-name "type" vocabulary, items, and additional_keywords, while deferring validation, $ref, and schema-to-type behavior at src/v4/extdeps/formats/json_schema.dag:40-56 and src/v4/extdeps/formats/json_schema.dag:161-177. OpenAPI pins OAS 3.1.0, imports the JSON Schema authority for component schemas, and models root/info/path/operation/response/media/components carriers with parse/emit and reference work deferred at src/v4/extdeps/formats/openapi.dag:34-83 and src/v4/extdeps/formats/openapi.dag:337-361.

2. Invariant categories

1. LAYER MODEL

Finding — BLOCKING, substrate/model-carrier fidelity.

The OpenAPI Contact Object carrier drops a spec-allowed nested extension channel:

src/v4/extdeps/formats/openapi.dag:132: type OpenApiContact {

src/v4/extdeps/formats/openapi.dag:133: name: OpenApiOptionalString,

src/v4/extdeps/formats/openapi.dag:134: url: OpenApiOptionalString,

src/v4/extdeps/formats/openapi.dag:135: email: OpenApiOptionalString,

src/v4/extdeps/formats/openapi.dag:136: }

OAS 3.1.0 says the Contact Object has name, url, and email fixed fields and that the object may be extended with Specification Extensions. OpenAPI Initiative Publications The diff preserves this class for License via:

src/v4/extdeps/formats/openapi.dag:180: license_extensions: Map<String, JsonValue>,

and claims OpenAPI overflow facts live in explicit maps:

src/v4/extdeps/formats/openapi.dag:81: // triggers — not silently omitted without a receipt: overflow lives in

src/v4/extdeps/formats/openapi.dag:82: // \components_extras/path_extensions/operation_extensions / src/v4/extdeps/formats/openapi.dag:83: // info_extensions/root_extensionsas faithfulJsonValue maps (M5).

But a valid contact.x-* field has no contact_extensions carrier and no named deferral. That leaves future parse/emit work choosing between dropping the field, path-encoding it into info_extensions, or inventing a side channel, all of which break single-authority modeling.

2. INVARIANTS.md + modeling-discipline.md

Finding — BLOCKING, P1 Modeling Faithfulness + P2 Boundary Discipline / facts flow forward.

INVARIANTS requires constructs to ground in a declared source and boundaries to carry each fact in exactly one authoritative place; the uploaded modeling discipline also requires structured facts to flow forward rather than silently disappear. chatgpt-review-c9f11a6f-762a-4e…

chatgpt-review-c9f11a6f-762a-4e…

chatgpt-review-e54bb657-b0b5-4c…

The diff correctly applies that pattern for OpenApiLicense and OpenApiInfo extension maps, but not for the nested Contact Object:

src/v4/extdeps/formats/openapi.dag:198: // \license, plus **info_extensions** for Specification Extension members src/v4/extdeps/formats/openapi.dag:214: info_extensions: Map<String, JsonValue>, src/v4/extdeps/formats/openapi.dag:132: type OpenApiContact { src/v4/extdeps/formats/openapi.dag:136: }

Fix shape: add contact_extensions: Map<String, JsonValue> to OpenApiContact, or explicitly defer Contact extensions with bounds and a named dissolution trigger. Given the PR’s C5-fidelity posture, adding the field is the cleaner fix.

3. CODING.md

N/A — this diff adds declarative .dag model data only; it does not introduce Rust functions, methods, helpers, hidden state, or result-shape implementation code. The future result-carrier choice is handled in the model notes via the Outcome<T> seam rather than a Rust API change, for example at src/v4/extdeps/formats/openapi.dag:68-74.

4. TESTING.md

N/A — no executable parser, emitter, validator, runner behavior, or Rust harness is introduced in this diff. The operation surfaces are explicitly deferred and bounded, for example csv_parse / csv_emit at src/v4/extdeps/formats/csv.dag:175-189, JSON Schema operations at src/v4/extdeps/formats/json_schema.dag:174-177, and OpenAPI parse/emit at src/v4/extdeps/formats/openapi.dag:337-345.

5. LOCKED DESIGN DECISIONS

Compliant — the diff does not alter locked design docs and it preserves the locked Shape B / spec-first direction: JSON Schema and OpenAPI are modeled as format/artifact data, not as new compiler render targets. The thesis states Shape B artifacts such as JSON Schema and OpenAPI are emitted by .dag programs walking typed values rather than compiler render targets. chatgpt-review-931b829d-f4fa-4e…

The diff’s OpenAPI/JSON Schema files stay in src/v4/extdeps/formats/ and defer parse/emit bodies instead of adding compiler paths.

6. TRACKED vs UNTRACKED DEBT

Finding — BLOCKING, untracked scaffold/debt.

Most deferrals are tracked correctly: CSV names the rectangularity trigger at src/v4/extdeps/formats/csv.dag:191-195; JSON Schema bounds validation/schema-to-type/full vocabulary decomposition at src/v4/extdeps/formats/json_schema.dag:174-177; OpenAPI bounds parse/emit, version refinement, extension methods, and value validation at src/v4/extdeps/formats/openapi.dag:337-361. But Contact Object extensions are neither modeled nor named in the deferred block:

src/v4/extdeps/formats/openapi.dag:355: // (4) Info Object **value validation** — \termsOfService/contact.url URI src/v4/extdeps/formats/openapi.dag:356: // shapes, contact.email addr-spec checks, **license.url URI** checks, src/v4/extdeps/formats/openapi.dag:357: // and **license.identifier SPDX expression** checks remain 🟡 with the src/v4/extdeps/formats/openapi.dag:358: // same dissolution trigger as (1) (openapi_parse + std/text substrate);

P5 requires scaffolds to carry a named dissolution trigger, not become silent steady state. chatgpt-review-c9f11a6f-762a-4e…

The current Contact shape is missing both the carrier and the deferral trigger.

2.5. Top-down PM intent review

Finding — BLOCKING semantic dilution of C5-fidelity.

The PR pins OpenAPI 3.1.0 as the normative document:

src/v4/extdeps/formats/openapi.dag:34: // L-2 VERSION PIN (C5): OpenAPI **3.1.0** (\spec.openapis.org/oas/v3.1.0)

and says current OpenAPI carriers preserve overflow through explicit JsonValue maps:

src/v4/extdeps/formats/openapi.dag:76: // DECLARATIVE-NOW / OPERATIONS-DEFERRED-WITH-OWNER — modeled carriers for

src/v4/extdeps/formats/openapi.dag:81: // triggers — not silently omitted without a receipt: overflow lives in

src/v4/extdeps/formats/openapi.dag:83: // \info_extensions/root_extensionsas faithfulJsonValue maps (M5).

But OAS 3.1.0 explicitly allows Contact Object Specification Extensions, and the diff’s Contact carrier has no extension map at src/v4/extdeps/formats/openapi.dag:132-136. OpenAPI Initiative Publications A worker following this model faithfully would preserve extensions for Info and License while losing or side-channeling extensions for Contact; that dilutes the PR’s “spec-first, C5-fidelity” intent rather than merely postponing implementation.

3. Verdict

REQUEST_CHANGES. The CSV and JSON Schema pieces look disciplined, and most OpenAPI debt is explicitly bounded, but the OpenAPI Contact Object omission is a substrate/spec-fidelity gap with no tracked trigger. Add a contact_extensions: Map<String, JsonValue> carrier or a fully bounded named deferral before landing.

Address openai-pro REQUEST_CHANGES: OAS 3.1.0 Contact Object MAY carry
Specification Extensions — mirror license/info M5 overflow discipline.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

Re: openai-pro review artifact (stdout boot @ 9ed28762)

The excerpt is only the ChatGPT reviewer startup (config, login, fetch context, upload diff) against SHA 9ed28762. It does not include an actionable verdict or a specific code defect in the pasted text, so there is nothing to patch from the artifact alone.

If the substantive thread behind that run was Contact Object specification extensions (^x- under contact): that gap is already addressed on current HEAD (66920f3a4). OpenApiContact now carries contact_extensions: Map<String, JsonValue> in src/v4/extdeps/formats/openapi.dag, consistent with info_extensions / license_extensions, with the usual honesty that key-shape validation is deferred to openapi_validate (not the DAG carrier).

Merge readiness (re-check on 66920f3a4): ci / fmt / v4 / affected are green; mergeStateStatus is CLEAN and the PR is MERGEABLE. No CHANGES_REQUESTED reviews show up on the GitHub reviews API for this PR. I still only see one formal PR review entry via gh (a COMMENTED codex-tagged post), so I cannot independently confirm ≥2 distinct APPROVE/APPROVE_WITH_COMMENTS from GitHub data alone—please rely on the dashboard’s api-review rollup for the second weighted approval if it lives outside GitHub reviews.

Per operator policy: not merging from here.

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

Dashboard relay: This thread is a duplicate of the prior composer-2 (13794) closure note; nothing new to implement.

Re-verified on HEAD f0542bedc: openapi.dag still carries // 🟢 coproduct dissolution — DECISIONS.md T-4.6-P4-OpenApiHeaderDeprecatedSlot on OpenApiHeaderDeprecatedSlot with a matching T-4.6-P4-OpenApiHeaderDeprecatedSlot row in DECISIONS.md; CsvRfc4180UnquotedFieldTextdataVsTab has no extra RFC // block; T-4.6-CSV still documents the TEXTDATA vs HTAB witness.

Merge readiness: mergeStateStatus=CLEAN, mergeable=MERGEABLE, CI green (fmt, affected, v4, ci), 0 GitHub CHANGES_REQUESTED, 0 GitHub APPROVED (so the ≥2 counted approval leg remains unmet on the GitHub API alone).

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: f0542bed · Trigger: manual
  • Comparison: main @ 75f98aaa ... session/sunny-stag-440 @ f0542bed
  • Conversation: View conversation

1. Story of the diff

This PR turns three v4 format stubs into actual spec-modeled .dag authority files and adds the DECISIONS.md ledger needed to keep their closed sums reviewable. CSV now has an RFC 4180 dialect marker, header presence, a recursive row spine, and product witness records for RFC facts while explicitly deferring cross-row/header rectangularity under the named T-4.6 trigger (csv.dag:14-22, csv.dag:24-75, DECISIONS.md:334-335). JSON Schema now models the Draft 2020-12 core type vocabulary, optional typed slots for type / items / properties / required, and a deferred additional_keywords map keyed by a closed keyword enum (json_schema.dag:15-30, json_schema.dag:51-120). OpenAPI then builds a larger OAS 3.1.0 document slice on top of JSON/JSON Schema, with typed carriers for fixed fields, Map<...JsonValue> deferred-member buckets for not-yet-modeled fields, explicit response-key structure, and a version-pinned root field (openapi.dag:25-449). The added DECISIONS.md section is the load-bearing bridge that makes the many new external-spec coproducts acceptable as YELLOW/GREEN rather than untracked enum proliferation (DECISIONS.md:325-381).

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

Finding — BLOCKING, substrate/name-resolution boundary. These are substrate/data model files, not Rust implementation, and two of them use collection carriers without importing the collection authority that the same diff imports elsewhere. The diff shows the import pattern in JSON Schema:

src/v4/extdeps/formats/json_schema.dag:12: import v4.std.collection { Map, Set }

but CSV uses List with no corresponding import:

src/v4/extdeps/formats/csv.dag:74: records: List<CsvRow>,

and OpenAPI imports only JSON/JSON Schema:

src/v4/extdeps/formats/openapi.dag:11: import v4.extdeps.formats.json { JsonValue }

src/v4/extdeps/formats/openapi.dag:12: import v4.extdeps.formats.json_schema { JsonSchema }

before using Map:

src/v4/extdeps/formats/openapi.dag:100: openapi_schema_oas_members: Map<OpenApiSchemaOasMemberKey, JsonValue>,

The Consumes: std/collection.dag comment is not a binding edge. Under the same import discipline used by json_schema.dag, csv.dag needs List imported and openapi.dag needs Map imported; otherwise these modeled files either fail closed at parse/name-resolution time or create an ambient-name convention that is not encoded structurally.

  1. INVARIANTS.md + modeling-discipline.md.

Finding — BLOCKING, Practice 4 / Practice 9 ledger completeness. The OpenAPI file tags two YELLOW coproducts with DECISIONS IDs that are not present in the added DECISIONS.md ledger:

src/v4/extdeps/formats/openapi.dag:314: // 🟡 coproduct dissolution — DECISIONS.md T-4.6-P4-OpenApiResponseKeyNonDefault

src/v4/extdeps/formats/openapi.dag:326: // 🟡 coproduct dissolution — DECISIONS.md T-4.6-P4-OpenApiResponsesDefaultSlot

The new ledger says the cited .dag coproducts carry only an in-file tag and the decision-making lives in this table:

src/v4/DECISIONS.md:327: Authoritative Practice-4 ledger rows: dissolution stance + named YELLOW

src/v4/DECISIONS.md:328: trigger (if YELLOW). Each coproduct in the cited \.dag carries **only** src/v4/DECISIONS.md:329: the in-file // coproduct dissolution — DECISIONS.md tag

but around the response-key area it only records wildcard kind and the outer response key:

src/v4/DECISIONS.md:369: | **T-4.6-P4-OpenApiResponseKeyWildcardKind** | ... |

src/v4/DECISIONS.md:370: | **T-4.6-P4-OpenApiResponseKey** | ... |

Modeling discipline requires both the in-file coproduct tag and a DECISIONS.md entry with the ledger/trigger; a missing DECISIONS.md classification entry is unfinished modeling and blocks review. chatgpt-review-2e1dd39d-5133-42…

  1. CODING.md.

N/A — no Rust implementation code changed. The diff is .dag substrate/data modeling plus DECISIONS.md; the Rust data+free-functions/method-shape rules do not apply directly here.

  1. TESTING.md.

N/A — no test artifact is changed in the diff. I would expect existing v4 parse/smoke coverage to catch the missing-import issue above, but there is no changed test line in pr-3205.diff to review or cite, and the PR adds no new Rust behavior.

  1. LOCKED DESIGN DECISIONS.

Compliant. The diff does not alter a locked design doc; it keeps the OpenAPI slice explicitly version-pinned in the model:

src/v4/extdeps/formats/openapi.dag:437: // N=1 version pin; see DECISIONS.md T-4.6-P4-OpenApiOpenapiField3_1

src/v4/extdeps/formats/openapi.dag:438: type OpenApiOpenapiField3_1

src/v4/extdeps/formats/openapi.dag:439: = OpenApi310 {}

and records that pin in the new ledger (DECISIONS.md:378). No Shape A/Shape B boundary is blurred; these are format models, not new compiler render paths.

  1. TRACKED vs UNTRACKED DEBT.

Finding — BLOCKING, untracked YELLOW debt. Most deferrals are tracked through Status: scaffold — TASKS.md T-4.6 plus DECISIONS rows, but the two YELLOW OpenAPI coproducts at openapi.dag:314 and openapi.dag:326 lack the required ledger rows. That means they have an emoji tag but no documented bounds or named dissolution trigger, which makes them untracked debt rather than an accepted bridge. The missing rows should be added for OpenApiResponseKeyNonDefault and OpenApiResponsesDefaultSlot, or the in-file tags should point to an existing row that explicitly covers those exact carriers.

2.5. Top-down PM intent review

Compliant, subject to the two blocking hygiene fixes above. The PR preserves the high-level intent: it models CSV, JSON Schema, and OpenAPI as .dag extdep/format authorities, adds fact bundles and closed-vocabulary structures instead of Rust render code, and keeps scaffolds under named T-4.6 / DECISIONS triggers. That matches the thesis direction that JSON Schema and OpenAPI are Shape B artifact classes handled through .dag programs and typed values, not compiler-specific render targets. chatgpt-review-8bc4caa8-437e-4d…

I do not see semantic dilution of the plan: CSV rectangularity is not silently abandoned; it is explicitly operator-pending in DECISIONS.md. The blockers are local execution/ledger correctness issues, not a PM-level change in direction.

3. Verdict

REQUEST_CHANGES. The modeling direction is right, but this is substrate-facing work and the import holes plus missing Practice-4 ledger rows should be fixed before landing. Both are small same-PR repairs that preserve fail-closed name resolution and tracked-debt discipline.

@briansrls

Copy link
Copy Markdown
Contributor Author

openai-pro / 13795 (stdout relay): The pasted /api/reviews/13795/artifacts/stdout.log excerpt is chatgpt-reviewer process output (startup, login, diff upload, model-selector debug). It does not contain a discrete diff-level finding list to implement — treat as no new substrate action unless a separate verdict body lists concrete issues.

Merge readiness (f0542bedc): mergeStateStatus=CLEAN, mergeable=MERGEABLE, CI green (fmt, affected, v4, ci), 0 GitHub CHANGES_REQUESTED, 0 GitHub APPROVED (≥2 counted approvals on the GitHub API still not satisfied).

— sent from sunny-stag-440

Draft 2020-12 `type` arrays must contain at least one keyword; replace a lone
`Set` (which admitted the empty set) with `first` + `rest` and document
overlap/duplicate wire cases as parse/Diagnostic (T-4.6-P4-JsonSchemaTypeSlot).

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

codex / review 13799 (REQUEST_CHANGES)

1) json_schema.dag — empty type union (valid)

JsonSchemaTypeUnion { types: Set<…> } admitted the empty set. Replaced with JsonSchemaTypeUnion { first: JsonSchemaCoreTypeName, rest: Set<JsonSchemaCoreTypeName> } so a Draft 2020-12 type array is non-empty by construction; T-4.6-P4-JsonSchemaTypeSlot now records first ∈ rest / duplicate members as parse/Diagnostic. Landed in 55dc1f035.

2) csv.dag — CsvDocument { records: List<CsvRow> } vs rectangularity (no substrate change)

This is not an accidental regression: T-4.6-CSV / T-4.6-P4-CsvRow explicitly carry cross-row/header–body arity mesh as operator-pending with a named YELLOW trigger (fail-closed without a claimed total mesh). A dependent width carrier was reverted under operator direction for this slice; restoring structural rectangularity here would re-expand scope without that authorization. Practice‑2 / P2 in this repo are satisfied for Lane C via the ledger‑named deferral + parse plane, not by pretending the mesh is enforced in the .dag record shape yet.

Merge readiness

New push 55dc1f035 — CI was still settling (gh pr checks showed pending affected on the first poll); mergeable/mergeStateStatus typically follow once aggregate ci completes. GitHub APPROVED count remains 0 on the reviews API (codex REQUEST_CHANGES addressed in substrate for the JSON Schema item only).

…ltSlot

Practice 4: match openapi.dag dissolution tags with §T-4.6-P4 ledger entries.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

codex / 13804 (Practice‑4 ledger): Finding valid — OpenApiResponseKeyNonDefault and OpenApiResponsesDefaultSlot carried dissolution tags without matching §T-4.6-P4 rows.

Fix: Added T-4.6-P4-OpenApiResponseKeyNonDefault and T-4.6-P4-OpenApiResponsesDefaultSlot to src/v4/DECISIONS.md (inserted after T-4.6-P4-OpenApiResponseKeyWildcardKind, before T-4.6-P4-OpenApiResponseKey). 919441fc8.

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 9c4230f2 · Trigger: schedule
  • Thinking: 443s wall

BLOCKING (3)

Root Cause

  • src/v4/extdeps/formats/csv.dag RFC witness facts were modeled as value-bearing booleans → make each normative fact an inhabitance-only singleton or another carrier that cannot encode its negation.
  • src/v4/DECISIONS.md The Practice-4 ledger was not kept in lockstep with the OpenAPI response-key coproduct split → add rows for OpenApiResponseKeyNonDefault and OpenApiResponsesDefaultSlot or merge them under an explicit row that covers both.

⚠️ The PR is close, but these substrate-level modeling receipts should be fixed before consumers build on the new shapes.

Comment thread src/v4/extdeps/formats/csv.dag Outdated
| CsvRowS { field: String, tail: CsvRow }

type CsvRfc4180CommaFieldSep {
fields_separated_by_comma_u002c: Bool,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: CsvRfc4180CommaFieldSep stores normative RFC facts as Bool fields, so the substrate can inhabit the witness with fields_separated_by_comma_u002c = false instead of making the RFC fact unrepresentable as false (INVARIANTS P2/M3).

additional_by_status: Map<OpenApiResponseKey, OpenApiResponseOrReference>,
responses_object_extensions: Map<OpenApiSpecificationExtensionKey, JsonValue>,
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: OpenApiResponseKeyNonDefault cites DECISIONS.md T-4.6-P4-OpenApiResponseKeyNonDefault, but the added Practice-4 ledger has no matching row, so this new substrate coproduct lacks the required named trigger (modeling-discipline Practice 4/INVARIANTS P5).


type OpenApiPathItem {
routes: Map<OpenApiHttpMethod, OpenApiOperation>,
path_deferred_members: Map<OpenApiPathItemDeferredKey, JsonValue>,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: OpenApiResponsesDefaultSlot cites DECISIONS.md T-4.6-P4-OpenApiResponsesDefaultSlot, but the added Practice-4 ledger has no matching row, so this new substrate coproduct lacks the required named trigger (modeling-discipline Practice 4/INVARIANTS P5).

@briansrls

Copy link
Copy Markdown
Contributor Author

INLINE @ csv.dag (rectangularity / CsvListMatching): Verified on current session/sunny-stag-440 / csv.dag — there is no CsvListMatching, CsvDocWithHeader, width_and_first_row, or other_rows carrier (repo-wide rg is empty). The relay describes a stale or alternate model, not the checked-in slice.

The live substrate is still CsvDocument { header: CsvHeaderPresence, records: List<CsvRow> } with cross-row/header–body arity mesh explicitly operator-pending under T-4.6-CSV / T-4.6-P4-CsvRow in DECISIONS.md (named YELLOW + parse/Diagnostic until a ruling lands). No substrate change for this comment.

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

INLINE @ openapi.dag:315 (OpenApiResponseKeyNonDefault tag vs ledger): Verified on current HEAD — this finding is already false on 919441fc8.

openapi.dag still carries // 🟡 coproduct dissolution — DECISIONS.md T-4.6-P4-OpenApiResponseKeyNonDefault on OpenApiResponseKeyNonDefault, and src/v4/DECISIONS.md §T-4.6-P4 includes the matching row T-4.6-P4-OpenApiResponseKeyNonDefault (table line with explicit HTTP vs wildcard + churn trigger). The relay matches a pre-919441fc8 tree.

No commit.

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

INLINE @ openapi.dag:327 (OpenApiResponsesDefaultSlot tag vs ledger): Verified on current HEAD — finding is stale.

openapi.dag has // 🟡 coproduct dissolution — DECISIONS.md T-4.6-P4-OpenApiResponsesDefaultSlot on OpenApiResponsesDefaultSlot, and src/v4/DECISIONS.md §T-4.6-P4 includes T-4.6-P4-OpenApiResponsesDefaultSlot with disposition + churn trigger (same 919441fc8 ledger pass as T-4.6-P4-OpenApiResponseKeyNonDefault).

No commit.

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

claude-opus-4-7 / 13808 (APPROVE): Re-verified on current HEAD (5949e93d) — no new substrate edits required for this artifact.

Spot-check vs the approval bullets:

  • Mutual exclusion / obligation encoding: OpenApiDocumentRoot, OpenApiLinkTarget, OpenApiHeaderPayloadSlot, OpenApiLicenseUrlOrIdentifierSlot unchanged in role; JsonSchemaTypeUnion { first, rest: Set } is present in json_schema.dag (non-empty type array by construction + ledgered overlap cases on T-4.6-P4-JsonSchemaTypeSlot).
  • Practice 4 pairing: T-4.6-P4-OpenApiResponseKeyNonDefault and T-4.6-P4-OpenApiResponsesDefaultSlot rows exist in DECISIONS.md beside the tagged coproducts in openapi.dag.
  • CSV: T-4.6-CSV / T-4.6-P4-CsvRow still carry the named operator-pending mesh trigger; RFC4180 witnesses are singleton / inhabitance-only carriers in csv.dag (no normative facts as Bool negation).

Merge readiness: mergeStateStatus=CLEAN, mergeable=MERGEABLE, CI green on latest rollup (fmt, affected, v4, ci). GitHub API still shows 0 APPROVED reviews (dashboard APPROVE does not add a GitHub approval row), so the ≥2 counted-approval leg remains open on GitHub alone.

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

codex / 13823 — CSV rectangularity (CsvDocument + List<CsvRow>)

Verified: CsvDocument is { header: CsvHeaderPresence, records: List<CsvRow> } (csv.dag), so per-row field counts are not coupled across rows in the .dag record shape — ragged width at the document carrier is representable in that sense.

Why we are not changing the substrate for this REQUEST_CHANGES: that shape is not silent debt. T-4.6-CSV (and T-4.6-P4-CsvRow / CsvHeaderPresence) explicitly record the cross-row/header–body arity mesh as operator-pending with a named YELLOW trigger and fail-closed / parse/Diagnostic discipline until a ruling + substrate hook (TASKS.md T-4.6). That is the repo’s chosen authority split for this slice: Lane C documents the deferral in DECISIONS.md instead of pretending a total mesh is enforced in types before the operator authorizes the coupling.

Re-binding RFC “same number of fields” into a dependent width carrier contradicts the current ledger contract for T-4.6-CSV unless the operator re-opens that scope — it should not land as a drive-by codex-only change.

Practice 2 / P2 read here: named 🟡 + explicit ingest/parse plane for the withheld invariant is the project’s reconciliation path for this PR’s CSV half, not “weaker == ungoverned.”

No commit.

Merge readiness (9e4fbc4d): mergeStateStatus=CLEAN, mergeable=MERGEABLE, CI green (fmt, affected, v4, ci). GitHub reviews API: 0 APPROVED (≥2 counted approvals still unmet there).

— sent from sunny-stag-440

@briansrls

Copy link
Copy Markdown
Contributor Author

claude-opus-4-7 / 13839 (APPROVE + exploratory notes): Verified on HEAD a86f3197 — no new code changes required for this artifact.

  • APPROVE substance: N≥2 coproducts in the Lane C slice still carry dissolution tags + §T-4.6-P4 rows; obligation-first shapes called out (OpenApiDocumentRoot, JsonSchemaTypeUnion { first, rest }, OpenApiLinkTarget, license XOR, etc.) match the current openapi.dag / json_schema.dag + ledger. INVARIANTS P5 (v3 hand-Rust) is N/A here (.dag + DECISIONS.md only).

  • Exploratory CSV note: CsvRow + CsvDocument.records: List<CsvRow> is still the Peano-per-row / list-of-rows encoding (see 19:22:src/v4/extdeps/formats/csv.dag and CsvDocument below it); ragged cross-row width remains representable at this carrier. T-4.6-CSV / T-4.6-P4-CsvRow make that an explicit 🟡 operator-pending mesh (not a silent retreat). (Line numbers in the artifact point at witness types now; the structural observation is unchanged.)

  • Exploratory OAS note: OpenApiResponses still relies on parse/Diagnostic for primary_response.status_key ∉ keys(additional_by_status) — ledgered under T-4.6-P4-OpenApiResponseKey; same “boundary fact” family as the CSV mesh deferral, as you flagged.

Merge readiness: mergeStateStatus=CLEAN, mergeable=MERGEABLE, CI green on latest rollup. GitHub API still 0 APPROVED (≥2 counted approvals unmet there).

— sent from sunny-stag-440

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 9e4fbc4d · Trigger: schedule
  • Thinking: 363s wall

BLOCKING (5)

Root Cause

  • src/v4/DECISIONS.md The T-4.6-CSV witness bundle paraphrases RFC 4180 instead of transcribing the ABNF and MIME registration facts directly → ground row/document cardinality, final line-break, and charset carriers in RFC 4180 §2 plus RFC 7111 §1.1.
  • src/v4/extdeps/formats/openapi.dag OpenApiSchema is factored as default JsonSchema plus OAS fixed/x-extension maps, but OAS Schema has a schema-local arbitrary/custom-vocabulary channel → add a non-duplicate carrier for those schema-only wire facts or otherwise preserve them structurally.

⚠️ The PR fixes most prior review points, but the remaining CSV and OpenAPI Schema substrate facts would be harder to correct after consumers build on these shapes.

| HeaderAbsent

// 🟡 coproduct dissolution — DECISIONS.md T-4.6-P4-CsvRow
type CsvRow

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: CsvRow admits CsvRowZ as a standalone zero-field row even though RFC 4180 defines a record as at least one field, so invalid CSV rows inhabit the substrate (extdeps fidelity/P2; https://datatracker.ietf.org/doc/html/rfc4180#section-2).

Comment thread src/v4/extdeps/formats/csv.dag Outdated
generator_should_emit_crlf_between_records_per_rfc4180: CsvRfc4180GeneratorEmitsCrlfBetweenRecordsWitness,
}

type CsvRfc4180LastRecordTrailingDelimiterOptional {}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: CsvRfc4180LastRecordTrailingDelimiterOptional names the wrong RFC fact: RFC 4180 permits an optional final line break, while a trailing comma delimiter is explicitly forbidden (extdeps fidelity/P1; https://datatracker.ietf.org/doc/html/rfc4180#section-2).

Comment thread src/v4/extdeps/formats/csv.dag Outdated

type CsvRfc4180EmptyFieldBetweenCommas {}

type CsvRfc4180Utf8Charset {}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: CsvRfc4180Utf8Charset pins UTF-8 as an RFC witness even though text/csv defaults to US-ASCII and permits other charsets, so the model adds a fixed fact the spec does not carry (extdeps fidelity/P1; https://datatracker.ietf.org/doc/html/rfc7111#section-1.1).


type CsvDocument {
header: CsvHeaderPresence,
records: List<CsvRow>,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: CsvDocument.records is a possibly-empty List, but RFC 4180 file grammar requires a record after the optional header, so empty/header-only documents become representable (extdeps fidelity/P2; https://datatracker.ietf.org/doc/html/rfc4180#section-2).

| OpenApiSchemaOasExample


type OpenApiSchema {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: OpenApiSchema only preserves default JsonSchema, enumerated OAS members, and x-extensions, but OAS 3.1 Schema Objects also permit keywords from other vocabularies or arbitrary properties, so valid schema wire facts are dropped or rejected (extdeps fidelity/P2; https://spec.openapis.org/oas/v3.1.0.html#schema-object).

@briansrls

Copy link
Copy Markdown
Contributor Author

claude-opus-4-7 / 13858 (APPROVE): Re-verified on HEAD 17c4f6099 — approval stands.

  • P5: Still .dag + DECISIONS.md only on this slice; no v3 hand-Rust touched.
  • Practice-4 / operator tags: Multi-arm coproducts in csv.dag, json_schema.dag, and openapi.dag carry // … coproduct dissolution — DECISIONS.md … tags; §T-4.6-P4 rows exist for each cited ID (including T-4.6-P4-OpenApiSpecificationExtensionKey, OpenApiOpenapi31Patch, openapi_schema_deferred_keyword_members, etc.).
  • Structural obligations called out in the artifact still match the tree (JsonSchemaTypeUnion { first, rest }, OpenApiLinkTarget XOR, OpenApiDocumentRoot three-way obligation, license URL/identifier slot, …).
  • CSV mesh: Still explicitly 🟡 operator-pending under T-4.6-CSV / T-4.6-P4-CsvRow (same deferral posture the note flags as acceptable).

Small hygiene (pushed 17c4f6099): T-4.6-CSV ledger prose no longer claimed a UTF-8 RFC witness that csv.dag does not carry; MIME charset is called out as transport-layer (RFC 7111 / registration), matching the current witness set.

Merge readiness: mergeStateStatus=CLEAN, mergeable=MERGEABLE, CI green on latest rollup (fmt, affected, v4, ci). GitHub PR reviews API still shows 0 non-COMMENTED rows (no APPROVED / CHANGES_REQUESTED in the REST review list) — the ≥2 counted GitHub approvals leg of the dashboard policy is not satisfied from gh api alone; dashboard APPROVE artifacts still need the operator merge path.

@briansrls
briansrls merged commit e340343 into main May 18, 2026
7 checks passed
@briansrls

Copy link
Copy Markdown
Contributor Author

cursor/composer-2 / 13872 (APPROVE_WITH_COMMENTS — Practice 9): Finding valid on pre-merge openapi.dag / csv.dag (multi-line wire/semver/witness rationale after required dissolution tags).

Done post-merge on main: 8469b2a11 removes the cited non-compliant comment blocks and relocates the substance into DECISIONS.md — T-4.6-CSV (singleton inhabitance-only + ending CRLF vs forbidden trailing comma) and T-4.6-P4-OpenApiSpecificationExtensionKey (explicit wire recon for the three extension arms). T-4.6-P4-OpenApiSchema / T-4.6-P4-OpenApiOpenapiField3_1 rows already held the Schema Object partition + §4.1 semver story; no ledger expansion needed there.

v2-compiler compile --source-root src/v4 --target dag and python3 scripts/test_strict_deprose_dag.py both OK on that commit.

Merge readiness (#3205): PR is merged (e34034338 on origin/main per operator relay); this note is a follow-up hygiene commit on main, not a reopen. For any new PR, re-poll gh pr checks + review API as usual.

— sent from sunny-stag-440

briansrls added a commit that referenced this pull request May 18, 2026
…uction, algebra-law, diagnostic-exhaustiveness, lens-applicability, bidirectional-roundtrip); produced corpus ⊇ still-lark-213 12 manual claims in src/v4/test/claim/manual/; K-1: Atom claims reference declared names, never mint Sym (#3212)

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* feat(v4): T-19 testgen carrier + 12 manual anchor manifest + compile smoke

Self-contained Generator<C> and TestClassification in lens/testgen.dag;
subject carriers stay commented until M2 can load v4 std imports. Add
manual/t19_manual_anchor_manifest.dag (12 rows) and integration smoke +
SG-0 census entry.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): Practice-4 dissolution ledger for forward TestgenConcept sum

Codex blocking review: record 🟢 terminal classification and five-pattern
ledger for the commented TestgenConcept coproduct (T-19), co-located with
its forward declaration per MODELING.md §4 / verification.dag precedent.

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore(ci): remove v3 v4 testgen smoke harness (#3205)

Lane B discipline: no hand-Rust under src/v3 to smoke v4 lens .dag files.
Drop integration smoke + SG-0 row + mod wiring; v4 stays gated by the
existing CI v4 job (v2-compiler compile --source-root src/v4 --target dag).

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* docs(v4): Practice-4 enum checkpoints on TestgenTier/Layer

Per api-review (composer-2): align terminal closed sums with the same short
Practice-4 / modeling-discipline enum checkpoint style used for TestgenConcept;
TestClassification Conj note retained separately.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(v4): Practice-4 ledgers for TestgenTier and TestgenLayer

GREEN per modeling-discipline.md §4 requires an explicit five-pattern
ledger; replace the incorrect "Ledger: none" lines with compact FAILS/N/A
tables mirroring the TestgenConcept style. Clarify TestClassification as
Conj of two already-ledgered sums.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(v4): track optional manual-anchor consolidation post-enum

Records claude-opus-4-7 exploratory note: after Int→closed types, fold the
twelve near-duplicate data rows via Set<ManualTestgenAnchor> or projection.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): TypeConstructionSubject carries behavior slice (P2)

Codex BLOCKING: manual behavior_value anchor must forward-bind to a typed
substrate fact, not only a slug. Model `TypeConstructionSubject` as internal
sum `ConnectiveKernel | BehaviorValueSubject` in lens/testgen.dag (still one
`type_construction` top-level arm); tie manifest row (12) + TASKS §T-19;
extend TestgenConcept Practice-4 ledger note.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): BehaviorValueSubject uses closed Behavior (P2)

BLOCKING: L1 behavior slice must reference std/node.dag's closed Behavior
sum (Value|…), not K-1 Symbol. Update commented TypeConstructionSubject,
internal Practice-4 ledger, manifest row (12) + TASKS §T-19.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* fix(v4): BehaviorValueSubject is Value-only unit arm (P2)

openai-pro REQUEST_CHANGES: `behavior: Behavior` admitted non-Value variants
contrary to Value-only manual anchor + PM scope. Model `BehaviorValueSubject`
as a unit sum arm (no Behavior payload); update Practice-4 internal ledger,
manifest row (12), TASKS §T-19, and type_construction header wording.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* docs(v4): clarify T-19 manifest slugs vs live TestClaim inventory

Address api-review exploratory note: twelve anchor slugs are regression keys
for eventual T-18 ⊇ checks, not a claim of twelve matching TestClaim literals
today; document forward rows (atom/diagnostic/lens/roundtrip/behavior_value).

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* fix(v4): align manual TestClaim TestgenTier with manifest + THESIS axes

cursor/composer-2: algebra-law Equals uses Tier3+Integration (not AssertKind
Tier2 shorthand); connective reflexive Equals stub uses Tier1+Unit with header
disambiguation vs verification.dag prose.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): stamp all Nat algebra-law anchors Tier3+Integration

Inline review: algebra-law file must not use type-construction Tier1/Unit;
align every nat manual claim with t19 manifest algebra rows + THESIS L7.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* fix(v4): align nat stubs + manifest authority with codex review

REQUEST_CHANGES: Compiles law stubs stamp Tier1+Unit; Equals algebra row
Tier3+Integration. Manifest header — single authority for live manual claims vs
testgen expectation grid (P2).

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* docs(v4): add DECISIONS V-HDR for strict Lane-B .dag headers

Indexes the interim strict header rule (path + Scope/Owns/Consumes/Status
only, under-20% // lines) and relocates verification D5 / #3183 / Nat
classification prose off the .dag files per swift-ram-178. Process receipts
for operator decision I remain in prior PR commits, not in-file HEADER
RECONCILE blocks.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): slug-only T-19 manifest — no Int duplicate of TestClaim axes

Codex REQUEST_CHANGES on #3212: tier/layer/assert_kind Ints duplicated
`TestClaim.classification` and `TestClaim.kind` (P2 / Practice 3+5).
ManualTestgenAnchor is now slug-only; tier/layer/kind authority stays on
live claims. TASKS §T-19 Phase-1.5 + retirement bullets updated; testgen
M2 note aligned with materialized carriers.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): coverage.dag keys use closed carriers, not Int axes

Codex BLOCKING on #3212: L6CoverageKey used Int for connective/behavior
axes; TestgenCoverageKey duplicated testgen categories as Int. Reuse
v4.std.node Connective+Behavior for L6 and alias TestgenCoverageKey to
lens/testgen TestgenConcept (single authority). v2 v4 DAG compile clean.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): L7CoverageKey aliases AlgebraLawSubject (coverage P2)

Codex BLOCKING on #3212: L7CoverageKey used String algebra/law and dropped
inhabitant vs testgen's closed AlgebraLawSubject. Alias L7CoverageKey to
AlgebraLawSubject from lens/testgen for single typed law-subject authority.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): ImpossibleBugCoverageKey uses closed ImpossibleBugClass

THESIS/TASKS enumerate six impossible-bug demo classes; model them as a
sum type in std/verification and key T-18 coverage with that instead of
String (MODELING M4 / closed API surface).

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* fix(v4): BehaviorValueSubject carries Behavior (codex T-19)

Restore structural forward flow for the five L1 behaviors on the
type_construction carrier, symmetric to ConnectiveKernel.connective;
update TASKS §T-19 and DECISIONS LB-P4-3212 ledger + coproduct emoji.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(v4): charter BehaviorValueSubject naming at T-22 eval

Record the Value-slice name vs closed Behavior payload so the T-22
interpreter close gate explicitly re-audits rename vs semantics.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): align L6 coverage key + stub classifications (codex #3212)

- coverage: L6CoverageKey aliases TypeConstructionSubject (coproduct),
  not connective×behavior product (impossible paired states).
- manual nat: claim_nat_mul_associativity uses Tier1+Unit when it
  matches claim_conj_equals_refl on kind/input/expected.
- DECISIONS V-HDR: classification follows STRUCTURE §248, not labels.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* fix(v4): mechanical manifest join via TestClaim.anchor_slug

P2: manifest rows join to manual claims on string equality
(`ManualTestgenAnchor.slug` = `TestClaim.anchor_slug`), not declaration
names or file order. Update LB-P4-3212 / TASKS T-19 receipts.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* fix(v4): L6 form×target + STRUCTURE closed-tree checksum

- coverage: L6CoverageKey carries TypeConstructionSubject × language Symbol
  (THESIS L6); TASKS T-18 documents pairing + dag surface anchor.
- extdeps/languages/dag: K-1 dag_language_model_surface_id for L6 target id.
- STRUCTURE: enumerate manual + impossible_bug .dag files; checksum 65→68;
  extdeps folder count 21→22.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* docs(v4): point T-19 testgen rules at TestgenConcept carrier

TASKS still referenced the testgen file header for the five scheduling
arms; authority now lives on the TestgenConcept sum in lens/testgen.dag
(cursor/composer-2 #3212 review).

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(v4): classify T19ManualAnchorKey as scaffold (Practice 4)

LB-P4-3212 lacked an explicit ledger row for T19ManualAnchorKey while
TASKS documents Phase-1.5 join + M2 retirement; mark the sum 🟡 in
std/verification.dag and record the M2 trigger in DECISIONS (codex

Co-authored-by: Cursor <cursoragent@cursor.com>
#3212).

* WIP: IB-1 T-19 lens/testgen.dag — Generator<C> + 5 categories (type-construct

* fix(v4): single L6 authority for native .dag language identity

Wire DagLanguageModel.wave1_void + canonical_symbols gate on
dag_language_model_surface_id only; drop dag_lm_identity_native_dag so TASKS
T-18 L6 token and substrate agree (codex P2 / Practice 5).

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls
briansrls deleted the session/sunny-stag-440 branch June 1, 2026 18:43
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.

1 participant