Skip to content

v18 Continuum opening campaign#90

Closed
flyingrobots wants to merge 7 commits into
mainfrom
codex/v18-continuum-opening
Closed

v18 Continuum opening campaign#90
flyingrobots wants to merge 7 commits into
mainfrom
codex/v18-continuum-opening

Conversation

@flyingrobots
Copy link
Copy Markdown
Member

@flyingrobots flyingrobots commented May 21, 2026

Summary

  • Close the stale v17 release-runway cycle and move the standing signposts into the v18 Continuum compatibility campaign.
  • Correct the Continuum doctrine across active docs and backlog: git-warp and Echo are equal sibling Continuum participants; Continuum is the protocol for exchanging witnessed causal history.
  • Add the v18 charter, cross-repo Continuum contract matrix, and WARP optic realization map from the current Echo, Wesley, Continuum, warp-ttd, and paper evidence.
  • Add the first runtime-backed Continuum generated-artifact ingestion guard, including authority/family descriptors, a JSON file adapter, public exports, fixtures, and focused tests.

Validation

  • Pre-push IRONCLAD firewall passed on push: link check, lint, markdown gates, source/test/consumer/surface typechecks, policy gate, publication surface validation, and npm run test:local.
  • Full unit suite during push: 447 files passed, 6,808 tests passed.
  • Focused checks before the ingestion commit included markdownlint on touched docs, eslint on new source/tests, npm run typecheck:src, npm run typecheck:test, npm run typecheck:surface, npm run lint, npm run typecheck:policy, npm run lint:sludge, focused vitest, and git diff --check.

Notes

This is opened as a draft PR because it is the first batch of the v18 campaign. BEARING now tracks slices 1-10 plus slice 11, and slices 1-5 are checked off with evidence in hand.

Summary by CodeRabbit

  • Documentation

    • v17 release cycle completed and formally closed; branches merged and artifacts published
    • Added comprehensive v18 "Continuum Compatibility" release charter and design documentation
    • Updated release planning and backlog documentation for the v18 cycle
  • New Features

    • Implemented Continuum artifact validation and file-based descriptor ingestion framework

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 21, 2026

📝 Walkthrough

Walkthrough

This PR updates release-narrative documentation from v17 completion to v18 Continuum compatibility, introduces design specifications for v18 artifact interoperability, and implements the first Continuum artifact domain types and JSON ingestion infrastructure with validation and policy-gated admission.

Changes

V18 Continuum Compatibility and Artifact Ingestion

Layer / File(s) Summary
V18 documentation narrative and release closure
docs/BEARING.md, docs/VISION.md, docs/design/0124-*.md, docs/design/0145-*/, docs/method/backlog/, docs/method/retro/, docs/design/continuum-categories.tex
Reframes release-narrative context from v17 release-blocker DAG closure to v18 Continuum compatibility. Updates BEARING.md with v18 opening-campaign task list and updated "What just shipped/feels wrong/comes next" narrative; rephrases VISION.md to define git-warp and Echo as sibling Continuum participants; documents v17 cycle 0145 push/PR/review/merge completion; and standardizes terminology from "graph-substrate" to "graph-model" across backlog planning, triage, and task documentation.
V18 Continuum design specifications
docs/design/0146-*/, docs/design/0147-*/, docs/design/0148-*/, docs/design/0149-*/
Introduces four new design documents (cycles 0146–0149) specifying v18 Continuum compatibility requirements: charter establishes v18 as Continuum-participant interoperability work with WARP optic boundaries; contract matrix maps family responsibilities and artifact sources across Continuum, Wesley, Echo, git-warp, and warp-ttd; optic realization map describes how git-warp runtime facts map to the WARP optic tuple; and artifact ingestion spec defines the narrow generated-artifact ingestion path with policy-gated admission while rejecting local/handwritten mirrors.
Continuum artifact domain types and validation
src/domain/continuum/ContinuumFamilyId.ts, src/domain/continuum/ContinuumArtifactAuthority.ts, src/domain/continuum/ContinuumArtifactDescriptor.ts, src/domain/continuum/ContinuumArtifactIngestionPolicy.ts, src/domain/errors/ContinuumArtifactAuthorityError.ts, src/domain/errors/index.ts
Implements four core Continuum domain abstractions: ContinuumFamilyId validates and wraps one of four allowed family identifiers (receipt, settlement, neighborhood-core, runtime-boundary) with value equality and stable string form; ContinuumArtifactAuthority wraps authority postures (generated artifact/fixture, local/handwritten mirror) with isGeneratedAuthority query; ContinuumArtifactDescriptor normalizes incoming family/authority carriers into runtime types, validates required/optional string fields, freezes the targets list immutably, and provides hasTarget/hasGeneratedAuthority queries; ContinuumArtifactIngestionPolicy gates descriptor acceptance by asserting generated authority, throwing ContinuumArtifactAuthorityError with family/authority details on rejection.
Continuum artifact JSON file adapter
src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts
Implements ContinuumArtifactJsonFileAdapter to load and validate Continuum artifact descriptors from file paths (loadFile) or raw JSON text (loadString). Parses untrusted JSON by enforcing required non-empty string fields (familyId, version, sourceSchemaPath, generatedBy, artifactKind, authority), required non-empty targets string array, and optional witnessScope/artifactDigest fields. Rejects arrays and invalid shapes via AdapterValidationError. Wraps parsed fields in ContinuumArtifactDescriptor and passes through ingestion policy, allowing generated artifacts/fixtures while rejecting local and handwritten mirrors.
Public API exports for Continuum artifacts
index.ts
Extends the package entry-point to export Continuum artifact domain types, adapter, and error: adds ContinuumArtifactAuthorityError to error exports; adds named exports for ContinuumFamilyId, ContinuumArtifactAuthority, ContinuumArtifactDescriptor, ContinuumArtifactIngestionPolicy, and ContinuumArtifactJsonFileAdapter; and adds type exports for ContinuumFamilyIdValue, ContinuumArtifactAuthorityValue, and ContinuumArtifactDescriptorFields.
Tests and fixtures for Continuum artifact ingestion
test/fixtures/continuum/receipt-family-generated-artifact.json, test/unit/domain/continuum/ContinuumArtifactIngestionPolicy.test.ts, test/unit/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.test.ts, test/unit/domain/errors/index.test.ts, test/unit/domain/index.exports.test.ts
Validates Continuum artifact domain and infrastructure: ContinuumArtifactIngestionPolicy tests verify acceptance of generated artifacts/fixtures and rejection of mirrors with ContinuumArtifactAuthorityError; ContinuumArtifactJsonFileAdapter tests cover successful loads from JSON strings and files, authority rejection, and malformed JSON handling; package export tests confirm all Continuum artifact types and adapter are available and functional with correct instance typing; domain error tests verify ContinuumArtifactAuthorityError is exported. Receipt-family-generated-artifact fixture demonstrates the expected descriptor shape with family, version, schema path, generator, kind, authority, targets, witness scope, and digest.

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly Related PRs

  • git-stunts/git-warp#85: Main PR's checkpoint changes around v17 follow-up work (createCheckpointEnvelope + collectContentAnchorEntries) are directly aligned with per-OID readObjectType support and blob vs. tree anchor emission.

Poem

🐰 From v17's closure we now leap,
To v18's artifacts, safe and deep—
Continuum kinship, family ties,
JSON-born descriptors, authority wise.
Graph-model edges, ingestion's way,
A rabbit celebrates each new v18 day! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description includes a detailed summary and validation details, but does not address any of the four ADR checks required by the repository template. Complete the required ADR checks section by explicitly marking each of the four ADR conditions as satisfied or not applicable to this PR.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'v18 Continuum opening campaign' accurately summarizes the main objective of the PR: launching the v18 release cycle focused on Continuum compatibility, as confirmed by the summary and raw changes.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/v18-continuum-opening

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@flyingrobots flyingrobots changed the title [codex] v18 Continuum opening campaign v18 Continuum opening campaign May 21, 2026
@github-actions
Copy link
Copy Markdown

Release Preflight

  • package version: 17.0.0
  • prerelease: false
  • npm dist-tag on release: latest
  • npm pack dry-run: passed
  • jsr publish dry-run: passed

If you tag this commit as v17.0.0, release workflow will publish.

@flyingrobots flyingrobots marked this pull request as ready for review May 21, 2026 17:44
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (2)
test/unit/domain/continuum/ContinuumArtifactIngestionPolicy.test.ts (1)

9-19: ⚡ Quick win

Extract repeated descriptor literals into named test constants.

'receipt-family', '0.1.0', and related literals are duplicated across the helper and test cases. Centralizing them improves drift resistance and aligns with policy.

As per coding guidelines, "Avoid magic strings and numbers; use named constants instead".

Also applies to: 24-25, 31-32, 38-39, 45-46, 52-55

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/unit/domain/continuum/ContinuumArtifactIngestionPolicy.test.ts` around
lines 9 - 19, The helper function makeDescriptor and related tests use repeated
literal values (e.g., 'receipt-family', '0.1.0', schema path, generatedBy,
artifactKind, targets, witnessScope) which should be extracted to named test
constants; create top-level constants (e.g., TEST_FAMILY_ID, TEST_VERSION,
TEST_SCHEMA_PATH, TEST_GENERATED_BY, TEST_ARTIFACT_KIND, TEST_TARGETS,
TEST_WITNESS_SCOPE) and replace the hard-coded literals in makeDescriptor and
all referenced test cases so they reference those constants, ensuring
ContinuumArtifactDescriptor construction and all assertions use the shared names
instead of magic strings/numbers.
test/unit/domain/index.exports.test.ts (1)

270-277: ⚡ Quick win

Replace inline descriptor literals with shared named constants in this test block.

The constructor payload currently hardcodes multiple domain literals, which makes future protocol updates more brittle.

As per coding guidelines, "Avoid magic strings and numbers; use named constants instead".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/unit/domain/index.exports.test.ts` around lines 270 - 277, The test
creates a ContinuumArtifactDescriptor with many inline "magic" literals; extract
those repeated domain values into shared named constants and use them in the
constructor call instead of hardcoded strings. Define constants (e.g.,
RECEIPT_FAMILY = 'receipt-family', DESCRIPTOR_VERSION = '0.1.0',
SOURCE_SCHEMA_PATH = '~/git/continuum/schemas/continuum-receipt-family.graphql',
GENERATED_BY = 'wesley witness-continuum --scope receipt-family', ARTIFACT_KIND
= 'continuum.family.fixture', AUTHORITY = 'generated-fixture',
TARGETS_TYPESCRIPT = ['typescript']) near the top of the test file and replace
the inline values passed into the ContinuumArtifactDescriptor instantiation (the
descriptor variable) with those constants.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/domain/continuum/ContinuumArtifactIngestionPolicy.ts`:
- Around line 7-20: The current assertGeneratedAuthority throws
ContinuumArtifactAuthorityError for expected policy rejections; change it to
return an explicit domain result (e.g., a boolean or a typed
IngestionResult/AdmissionResult) instead of throwing, and update
ingest(descriptor: ContinuumArtifactDescriptor) to call the new
assertGeneratedAuthority return value and return a rejection result when
authority is not generated rather than letting an exception propagate; remove
the throw of ContinuumArtifactAuthorityError from assertGeneratedAuthority,
update the ingest return type to the chosen Result type, and adjust any callers
to handle the admission/rejection result deterministically.

In `@src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts`:
- Around line 26-30: The loadString method currently lets JSON.parse throw raw
SyntaxError; wrap the parse in a try/catch inside loadString, and on error throw
an AdapterValidationError describing "malformed JSON" (include the original
error message or set it as the cause) so callers get a consistent adapter error.
Locate loadString, the JSON.parse call and ensure you still call
parseDescriptorFields(parsed) and this.policy.ingest(new
ContinuumArtifactDescriptor(fields)) after successful parse; only convert parse
failures to AdapterValidationError.

---

Nitpick comments:
In `@test/unit/domain/continuum/ContinuumArtifactIngestionPolicy.test.ts`:
- Around line 9-19: The helper function makeDescriptor and related tests use
repeated literal values (e.g., 'receipt-family', '0.1.0', schema path,
generatedBy, artifactKind, targets, witnessScope) which should be extracted to
named test constants; create top-level constants (e.g., TEST_FAMILY_ID,
TEST_VERSION, TEST_SCHEMA_PATH, TEST_GENERATED_BY, TEST_ARTIFACT_KIND,
TEST_TARGETS, TEST_WITNESS_SCOPE) and replace the hard-coded literals in
makeDescriptor and all referenced test cases so they reference those constants,
ensuring ContinuumArtifactDescriptor construction and all assertions use the
shared names instead of magic strings/numbers.

In `@test/unit/domain/index.exports.test.ts`:
- Around line 270-277: The test creates a ContinuumArtifactDescriptor with many
inline "magic" literals; extract those repeated domain values into shared named
constants and use them in the constructor call instead of hardcoded strings.
Define constants (e.g., RECEIPT_FAMILY = 'receipt-family', DESCRIPTOR_VERSION =
'0.1.0', SOURCE_SCHEMA_PATH =
'~/git/continuum/schemas/continuum-receipt-family.graphql', GENERATED_BY =
'wesley witness-continuum --scope receipt-family', ARTIFACT_KIND =
'continuum.family.fixture', AUTHORITY = 'generated-fixture', TARGETS_TYPESCRIPT
= ['typescript']) near the top of the test file and replace the inline values
passed into the ContinuumArtifactDescriptor instantiation (the descriptor
variable) with those constants.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3148126d-d6fe-412f-bb23-24935bf6121f

📥 Commits

Reviewing files that changed from the base of the PR and between 5afdd3e and 59d69b1.

⛔ Files ignored due to path filters (4)
  • docs/design/0124-v17-release-blocker-dag.dot is excluded by !**/*.dot
  • docs/design/0124-v17-release-blocker-dag.svg is excluded by !**/*.svg
  • docs/design/0124-v17-release-blocker-status.csv is excluded by !**/*.csv
  • docs/design/continuum-categories.pdf is excluded by !**/*.pdf
📒 Files selected for processing (29)
  • docs/BEARING.md
  • docs/VISION.md
  • docs/design/0124-v17-release-blocker-dag.md
  • docs/design/0145-push-pr-review-merge/push-pr-review-merge.md
  • docs/design/0146-v18-continuum-compatibility-charter/v18-continuum-compatibility-charter.md
  • docs/design/0147-v18-continuum-contract-matrix/v18-continuum-contract-matrix.md
  • docs/design/0148-v18-warp-optic-realization-map/v18-warp-optic-realization-map.md
  • docs/design/0149-v18-continuum-artifact-ingestion/v18-continuum-artifact-ingestion.md
  • docs/design/continuum-categories.tex
  • docs/method/backlog/README.md
  • docs/method/backlog/WORKLOADS.md
  • docs/method/backlog/bad-code/RELEASE_TRIAGE.md
  • docs/method/backlog/v18.0.0/PROTO_echo-shaped-edge-records.md
  • docs/method/backlog/v18.0.0/PROTO_echo-shaped-node-records.md
  • docs/method/backlog/v18.0.0/README.md
  • docs/method/retro/0145-push-pr-review-merge/push-pr-review-merge.md
  • index.ts
  • src/domain/continuum/ContinuumArtifactAuthority.ts
  • src/domain/continuum/ContinuumArtifactDescriptor.ts
  • src/domain/continuum/ContinuumArtifactIngestionPolicy.ts
  • src/domain/continuum/ContinuumFamilyId.ts
  • src/domain/errors/ContinuumArtifactAuthorityError.ts
  • src/domain/errors/index.ts
  • src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts
  • test/fixtures/continuum/receipt-family-generated-artifact.json
  • test/unit/domain/continuum/ContinuumArtifactIngestionPolicy.test.ts
  • test/unit/domain/errors/index.test.ts
  • test/unit/domain/index.exports.test.ts
  • test/unit/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.test.ts

Comment on lines +7 to +20
ingest(descriptor: ContinuumArtifactDescriptor): ContinuumArtifactDescriptor {
this.assertGeneratedAuthority(descriptor);
return descriptor;
}

/** Rejects descriptors whose authority would make local mirrors canonical. */
assertGeneratedAuthority(descriptor: ContinuumArtifactDescriptor): void {
if (descriptor.hasGeneratedAuthority()) {
return;
}
throw new ContinuumArtifactAuthorityError(
`Continuum family ${descriptor.familyId.toString()} must be loaded from a generated artifact or fixture, not ${descriptor.authority.toString()}`,
);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Return ingestion rejection as a domain result instead of throwing.

Non-generated authority is an expected policy outcome, but this path throws. Please model it as an explicit return value so callers handle admission/rejection deterministically.

Proposed direction
+export type ContinuumArtifactIngestionResult =
+  | { readonly ok: true; readonly descriptor: ContinuumArtifactDescriptor }
+  | { readonly ok: false; readonly error: ContinuumArtifactAuthorityError };
+
 export default class ContinuumArtifactIngestionPolicy {
-  ingest(descriptor: ContinuumArtifactDescriptor): ContinuumArtifactDescriptor {
-    this.assertGeneratedAuthority(descriptor);
-    return descriptor;
-  }
-
-  assertGeneratedAuthority(descriptor: ContinuumArtifactDescriptor): void {
-    if (descriptor.hasGeneratedAuthority()) {
-      return;
-    }
-    throw new ContinuumArtifactAuthorityError(
-      `Continuum family ${descriptor.familyId.toString()} must be loaded from a generated artifact or fixture, not ${descriptor.authority.toString()}`,
-    );
+  ingest(descriptor: ContinuumArtifactDescriptor): ContinuumArtifactIngestionResult {
+    if (descriptor.hasGeneratedAuthority()) {
+      return { ok: true, descriptor };
+    }
+    return {
+      ok: false,
+      error: new ContinuumArtifactAuthorityError(
+        `Continuum family ${descriptor.familyId.toString()} must be loaded from a generated artifact or fixture, not ${descriptor.authority.toString()}`,
+      ),
+    };
   }
 }
As per coding guidelines, "Represent expected failures as return values, not exceptions, in domain code".
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/domain/continuum/ContinuumArtifactIngestionPolicy.ts` around lines 7 -
20, The current assertGeneratedAuthority throws ContinuumArtifactAuthorityError
for expected policy rejections; change it to return an explicit domain result
(e.g., a boolean or a typed IngestionResult/AdmissionResult) instead of
throwing, and update ingest(descriptor: ContinuumArtifactDescriptor) to call the
new assertGeneratedAuthority return value and return a rejection result when
authority is not generated rather than letting an exception propagate; remove
the throw of ContinuumArtifactAuthorityError from assertGeneratedAuthority,
update the ingest return type to the chosen Result type, and adjust any callers
to handle the admission/rejection result deterministically.

Comment on lines +26 to +30
loadString(raw: string): ContinuumArtifactDescriptor {
const parsed: unknown = JSON.parse(raw);
const fields = parseDescriptorFields(parsed);
return this.policy.ingest(new ContinuumArtifactDescriptor(fields));
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Wrap malformed JSON parse failures as AdapterValidationError.

JSON.parse currently leaks raw SyntaxError, while the rest of the adapter uses AdapterValidationError. Normalizing this keeps one predictable error contract for invalid input.

Patch suggestion
   loadString(raw: string): ContinuumArtifactDescriptor {
-    const parsed: unknown = JSON.parse(raw);
+    let parsed: unknown;
+    try {
+      parsed = JSON.parse(raw);
+    } catch {
+      throw new AdapterValidationError('Continuum artifact descriptor JSON must be valid JSON');
+    }
     const fields = parseDescriptorFields(parsed);
     return this.policy.ingest(new ContinuumArtifactDescriptor(fields));
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts` around lines
26 - 30, The loadString method currently lets JSON.parse throw raw SyntaxError;
wrap the parse in a try/catch inside loadString, and on error throw an
AdapterValidationError describing "malformed JSON" (include the original error
message or set it as the cause) so callers get a consistent adapter error.
Locate loadString, the JSON.parse call and ensure you still call
parseDescriptorFields(parsed) and this.policy.ingest(new
ContinuumArtifactDescriptor(fields)) after successful parse; only convert parse
failures to AdapterValidationError.

@flyingrobots
Copy link
Copy Markdown
Member Author

@codex please confirm these self-review findings before this PR proceeds.

Self-Code Review Findings

Severity File / line evidence Infraction type Finding Agent mitigation prompt
Critical .github/workflows/ci.yml:132, vitest.config.ts:32, CI coverage-threshold; new misses include src/domain/continuum/ContinuumArtifactAuthority.ts:56, src/domain/continuum/ContinuumArtifactDescriptor.ts:57, src/domain/continuum/ContinuumArtifactDescriptor.ts:65, src/domain/continuum/ContinuumArtifactDescriptor.ts:73, src/domain/continuum/ContinuumArtifactDescriptor.ts:89, src/domain/continuum/ContinuumFamilyId.ts:32, src/domain/continuum/ContinuumFamilyId.ts:47 Merge-blocking CI / coverage ratchet The PR is red: CI reports line coverage at 91.88% against the 91.90% ratchet. The new Continuum domain package is only 84.84% line-covered, so this branch lowers the quality bar in a repo that explicitly ratchets coverage. Add tests for every uncovered new Continuum branch before changing thresholds: invalid authority, all allowed family ids, unknown family id, equals, descriptor construction from runtime-backed carriers, empty descriptor fields, empty targets, invalid targets, and adapter validation failures. Rerun npm run test:coverage:ci in CI or a clean environment and keep vitest.config.ts unchanged unless npm run test:coverage legitimately raises the ratchet.
Critical src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts:35, test/fixtures/continuum/receipt-family-generated-artifact.json:2; sibling evidence: /Users/james/git/wesley/out/proof/realization/manifest.json:1, /Users/james/git/continuum/wesley/test/fixtures/continuum/receipt-family/minimal.json:1 Contract compatibility failure The new "generated artifact" seam does not ingest the actual generated shapes from Wesley or Continuum. The adapter requires familyId, version, sourceSchemaPath, generatedBy, artifactKind, authority, and targets; the real Wesley realization manifest starts with kind, schemaPath, schemaHash, sourceHash, targets, integrity, and generatedLegs, while the Continuum receipt fixture starts with objectTypes, enumTypes, ops, and invariants. This means the slice proves compatibility with a local surrogate descriptor, not with the generated artifacts the v18 goal names. Replace the local descriptor-only fixture with real sibling-repo artifacts or checked-in copies of their exact shapes. Teach the adapter to parse the Wesley realization manifest and/or Continuum generated manifest shape that actually exists, preserving source hash, schema hash, integrity, generated legs, file hashes, and signatures. Add tests that load the real receipt-family fixture and a real Wesley realization manifest, then reject stale or mismatched variants.
Critical src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts:42, src/domain/continuum/ContinuumArtifactAuthority.ts:31, src/domain/continuum/ContinuumArtifactIngestionPolicy.ts:13; Wesley doctrine evidence: /Users/james/git/wesley/docs/architecture/transmutations.md:93, /Users/james/git/wesley/out/proof/realization/manifest.json:12 False authority guard / trust boundary The guard trusts an authority string inside the untrusted JSON being admitted. A local mirror can flip "authority": "local-mirror" to "generated-artifact" and pass. The real Wesley evidence model treats authored SDL, realization manifests, integrity, file hashes, signatures, and witness outputs as separate surfaces; this PR collapses authority to a self-attested field. Move authority out of the untrusted descriptor payload. Model authority as adapter context or verified evidence: fixture allowlist, realization manifest kind, schemaHash/sourceHash, integrity block, file content hashes, signatures, and witness/conformance status. Add a regression proving that a local mirror with authority: "generated-artifact" is still rejected unless the external evidence verifies.
Major src/domain/continuum/ContinuumArtifactDescriptor.ts:29, src/domain/continuum/ContinuumArtifactDescriptor.ts:71, index.ts:313; doc claim at docs/design/0149-v18-continuum-artifact-ingestion/v18-continuum-artifact-ingestion.md:86 Runtime-honesty / constructor validation ContinuumArtifactDescriptor is publicly exported, but its required string validator only checks value.length === 0. From JS or any public boundary bypassing the adapter, a number can be stored as a descriptor string and null throws a raw TypeError. The slice doc says constructor validation is green; that claim is too strong. Harden every public Continuum constructor and validator against runtime values, not just TypeScript call sites. Use explicit typeof value === 'string' && value.length > 0 checks and throw WarpError/domain-specific errors. Add JS-facing tests that call public exports with wrong runtime types and assert structured errors, not raw TypeError.
Major src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts:27, test/unit/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.test.ts:59 Boundary error hygiene JSON.parse errors escape as raw SyntaxError. The test named "rejects malformed descriptor JSON" only covers valid JSON with missing fields, not syntactically invalid JSON. Adapter callers get inconsistent error types at exactly the untrusted boundary. Wrap parse failures in AdapterValidationError with a stable message and optional cause/context. Add tests for syntactically invalid JSON, array top-level JSON, null, and valid objects with bad fields.
Major src/infrastructure/adapters/ContinuumArtifactJsonFileAdapter.ts:35; Wesley decoder policy evidence: /Users/james/git/wesley/docs/features/ttd-protocol-compiler.md:284 Schema drift / parser looseness The descriptor parser ignores unknown keys. Wesley's documented decoder posture is strict by default: unknown fields are errors. For a compatibility boundary, accepting extra fields makes drift and contradictory local metadata invisible. Add an allowlist-based unknown-key rejection step for descriptor/manifest parsing, with tests for extra top-level keys. If real Wesley manifests are parsed, make that parser strict against the real manifest schema instead of the local descriptor surrogate.
Minor docs/design/0146-v18-continuum-compatibility-charter/v18-continuum-compatibility-charter.md:125, docs/BEARING.md:158 Documentation consistency The charter acceptance list still leaves "BEARING.md tracks the running v18 task list" unchecked even though BEARING.md now has the running task list and slices 1-5 checked. Update the charter acceptance checkbox to [x] or explain why the charter acceptance item intentionally remains open after BEARING was updated.
Minor docs/BEARING.md:59; PR metadata head branch codex/v18-continuum-opening Process / naming hygiene The PR title was corrected, but the branch name and BEARING still carry the codex/ prefix after the user explicitly said not to use the codex prefix. This is not a code defect, but it is a process/documentation mismatch visible in the PR. Decide whether branch prefixes are allowed despite the latest instruction. If not, create a new non-prefixed branch from the same HEAD, push it, open a replacement PR to main, and close this PR without force-pushing or rewriting history. Update BEARING to record the replacement branch.

Additional checks run during this review:

  • Pre-review gate: worktree was clean before fetch.
  • git fetch origin
  • git diff --check origin/main...HEAD
  • npx --yes markdownlint-cli on touched v18 docs
  • npx eslint on touched Continuum source/tests
  • npm run test:coverage:ci was attempted locally, but local socket-binding tests fail in this sandbox with listen EPERM; CI remains the authoritative coverage evidence here.

@flyingrobots
Copy link
Copy Markdown
Member Author

Superseded by #91 on branch v18-continuum-opening. Closing this prefixed-branch PR so the open PR matches the requested branch naming and ready-for-review posture.

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