Skip to content

Next/v0.1.0 - #13

Merged
djradon merged 92 commits into
mainfrom
next/v0.1.0
May 16, 2026
Merged

Next/v0.1.0#13
djradon merged 92 commits into
mainfrom
next/v0.1.0

Conversation

@djradon

@djradon djradon commented May 16, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features

    • GitHub Pages branch deploy command.
    • CLI option to override history-tracking policy.
    • Manual release workflow: native binary build/package, npm assembly, smoke-tests, and conditional publish.
    • Enhanced extraction source evidence (digests, paths, timestamps) and npm package smoke-install checks.
  • Documentation

    • Complete v0.1.0 release runbook, release notes, and many workflow/architecture/task docs.
  • Tests

    • Added/expanded unit and end-to-end tests for release, deploy, extract, and version behaviors.
  • Chores

    • Bumped version to 0.1.0; updated default artifact/config policies and ignore patterns.

djradon added 30 commits May 13, 2026 09:17
- document first-pass config resolver discovery, precedence, cache, and logging contract
- classify current implementation defaults as config, operational input, request data, or derived output
- set mesh and Knop inventory history defaults to current-only
- align default config-resolution RDF with layer, merge, and inheritance roles
- set the default ResourcePage generation policy to generate
- remove role-specific page generation overrides made redundant by the baseline
- update config synthesis notes so suppression and deferral are explicit opt-outs
- document first-pass ResourcePage policy granularity
- defer page-kind suppression for Knop, IRI, history, state, and manifestation pages
- load and validate Weave default application and config-resolution RDF
- expose history and ResourcePage policy lookup by artifact role
- parse default resolver policy, max reference depth, and layer ordering
- add fail-closed tests for unknown policy values and duplicate role policies
- model first-pass Knop inherited config propagation in runtime/config
- cover accept/propagate, accept-but-stop, block inherited, descendant-only, and self-inclusive offers
- keep the implementation pure so fixture-backed behavior does not change yet
- update config synthesis checklist and codebase overview
Move mesh support ResourcePage planning out of the large core weave facade into a dedicated module while preserving existing exports from core/weave/weave.ts.

Add small shared modules for WeaveInputError and VersionPlan so extracted planners can avoid importing through the facade. Document the refactor slice and current fixture-ladder test status.
Add a shared support-history policy seam and thread Weave default effective history policies through runtime version planning.

Apply the policy to first Knop and first payload weave outputs so KnopMetadata can remain current-only while payload and inventory histories stay unchanged. Keep mesh support ResourcePage catch-up on the shared helper and add focused planner tests for current-only KnopMetadata behavior.
Parse default history, state, and manifestation naming policies from the
Weave default application config and pass them through runtime version
planning. Apply those policies to first and second payload version layout
without changing ordinal default behavior, while requiring explicit segments
for non-inferable named/semver/date cases and lightly validating semver/date
state segments.

Update focused config and weave planner tests, and record the Phase 3 naming
policy bridge in the task/codebase notes.
- Add a runtime ResourcePage policy helper that maps page facts back to owning artifact roles.
- Filter generated page paths through effective resource-page policies for generate, suppress, defer, and explicit-target onRequest.
- Wire executeGenerate to load the effective config before materializing ResourcePages.
- Add focused policy tests for generated, suppressed, and on-request pages.
- Update grand config synthesis and codebase overview notes with the new runtime materialization seam.
- Move ResourcePage policy resolution into core so version planning and runtime generation share the same ownership rules.
- Filter planned inventory Turtle to remove suppressed/deferred sflo:hasResourcePage facts and matching ResourcePage blocks.
- Filter created page models so plans no longer promise pages omitted by policy.
- Wire effective ResourcePage generation policies through runtime version planning and mesh support catch-up.
- Add focused tests for suppressed payload and support config ResourcePage facts.
Add the default ResourcePage regeneration config policy to the runtime
effective-config model, including validation for unsupported RDF terms.

Document the completed parse/validation slice while leaving actual
historical ResourcePage regeneration behavior as a separate runtime task.
Sketch the render/provenance manifest contract needed for historical
ResourcePage regeneration and audit the mutable inventory facts that block
inventory from becoming fully current-only by default.

Link the grand config synthesis task to the manifest/checkpoint prerequisite
while leaving runtime historical regeneration behavior open.
Update ResourcePage policy ownership so history and state page ownership is
derived from stable membership facts instead of current/latest progression
pointers.

Add a regression test proving mutable currentArtifactHistory and
latestHistoricalState facts alone do not make historical pages inherit an
artifact role policy.
Record the agreed _meta progression contract for current/history pointers,
allocator ordinals, and optional next-segment hints.

Clarify that explicit or hinted names control minted paths while ordinal
counters continue monotonically for future anonymous allocations.
Document that durable next history/state segment hints need API and CLI
set/clear operations distinct from one-shot operation segment requests.

Clarify that clearing a hint never rewinds or recalculates ordinal allocator
state.
- read MeshInventory current/latest/next progression from _mesh/_meta for first Knop, first payload, and first extracted-Knop weave planning
- consume optional next-state segment hints while preserving monotonic ordinal advancement
- write advanced MeshInventory progression back to _mesh/_meta and keep inventory focused on stable history/state membership
- pass current MeshMetadata through runtime version planning
- add focused tests for hinted MeshInventory state names and ordinal fallback after named latest states
- update grand config and optional-history notes with the implemented _meta progression seam
- record Alice Bio and Sidecar Fantasy Rules transition inventory
- require exact replay commands for command-backed fixture rungs
- require explicit source provenance for manual, copied, fetched, and derived fixture bytes
- document command-incomplete rungs that need fileOperation replay support
- note that replay commands and source provenance should use an Accord-owned contract
- link the Weave fixture ladder task to the Accord generalized replay task
- add root deno.json version metadata and expose it through weave --version
- add version tests and focused CLI coverage
- add bump-version script for patch/minor/major/explicit version updates
- create or verify Dendron release-note stubs during version bumps
- add v0.1.0 release-note stub
- record current CI gate drift in the full CI/CD task note
- add shared release platform metadata for binary and npm package naming
- add build:binaries task that compiles native executables and writes bundle metadata
- add release metadata tests
- update the release runbook and CI/CD task note for the current packaging state
- add package:binaries for release archives and checksum files
- add Deno-native tar.gz, zip, and sha256 helpers
- include bundle metadata, README, and LICENSE in binary archives
- validate packaged bundle metadata against the root release version
- update release runbook and CI/CD task status
- add shared release platform metadata for binary and npm package naming
- add build:binaries task that compiles native executables and writes bundle metadata
- add release metadata tests
- update the release runbook and CI/CD task note for the current packaging state
- add npm wrapper and platform package assembly script
- generate wrapper bin dispatch for native platform packages
- add platform package metadata with os and cpu constraints
- validate assembled packages against bundle metadata and root version
- update release runbook and CI/CD task status
- add publish metadata to generated npm package manifests
- write npm-packages-metadata.json during npm package assembly
- make npm install smoke consume the package metadata manifest
- test package publish metadata and host platform package resolution
- update release runbook and CI/CD task status
…t/v0.1.0

# Conflicts:
#	deno.json
#	documentation/notes/dev.release-runbook.md
#	documentation/notes/wd.task.2026.2026-05-13-full-ci-cd.md
#	scripts/assemble-npm-packages.ts
#	scripts/release/npm.ts
#	tests/scripts/assemble_npm_packages_test.ts
- add ordered npm dry-run/publish script for assembled packages
- add release workflow for native binaries, archives, npm assembly, smoke tests, npm publish, and GitHub Release handling
- update release runbook and CI/CD task note for the packaged release path
- split publication-branch bootstrap from first materialization
- record default inference for source ref, mesh base, and gh-pages branch root
- clarify that digests and target bindings are not required for empty branch bootstrap
- define publication controls as branch, Pages, commit, push, and preservation policy
djradon added 16 commits May 15, 2026 23:00
Tune the extracted Source metadata chip so pinned source histories read as chip-within-chip containment instead of adjacent segmented tabs.
Add row-level metadata styling so the extracted Source label and chip align vertically without changing the rest of the metadata table.
…ted pills for source; moved children to separate section
Record candidate ReferenceLink derivation from extraction provenance as a future explicit curation/proposal API, while keeping manual references as the current path.
- add current-mode canonical ReferenceLink rungs for representative extracted terms

- allow first ReferenceCatalog weave against slim mesh inventories

- cover final branch-published fixture references in integration tests
- Install the test temp cleanup wrapper when the shared test temp helper is imported, covering IDE and direct deno test invocations that bypass the task preload.
- Move the publish npm packages test off a hand-rolled .test-tmp path and onto createTestTmpDir so it participates in cleanup.
- add managed reference link data to identifier ResourcePage models
- render Properties from source triples where the page resource is subject
- render canonical, supplemental, and deprecated References groups
- use canonical reference target payload data as source facts when available
- cover renderer behavior and generated identifier reference pages
Derive all-terms support skips from rdf:type membership in mesh/source inventories
and source payload RDF instead of path string shape. This prevents source artifact
history components such as ontology/releases/v0.0.2 from being extracted into
their own Knops while preserving ordinary named term extraction.
Move subject triples with blank-node objects out of the Properties panel and
render them in a dedicated Blank Nodes panel with predicate/code table rows.
Suppress arbitrary blank node identifiers in ResourcePage Blank Nodes panels.
Render root blank node content as Turtle-style predicate/object lines, while
preserving nested blank node structure with bracketed inline blocks. Keep blank
node triples out of the Properties panel and cover the display behavior in
ResourcePage tests.
…tion

Load ancestor Knop inventory history groups when planning generated ResourcePages so an extracted identifier that is also an artifact history component still renders as a Semantic Flow history resource. This keeps release-state pages such as ontology/releases/v0.0.2 classified as sflo:HistoricalState instead of treating them as ordinary extracted terms with Source metadata.
@coderabbitai

coderabbitai Bot commented May 16, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@djradon has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 36 minutes and 28 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ad9c900a-a301-45fa-bbee-14f00880e10b

📥 Commits

Reviewing files that changed from the base of the PR and between 4ce33b3 and ea36f88.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml
📝 Walkthrough

<review_stack_artifact>

</review_stack_artifact>

Walkthrough

Adds a manual GitHub Actions release workflow, Deno release/packaging/publish scripts, gh-pages deploy tooling, effective-config parsing and inheritance, resource-page policy logic, extraction-source registry with evidence, weave runtime/pages and reference handling, mesh/knop planner and /ttl layout changes, CLI/version/logging updates, and broad tests/docs updates.

Changes

Unified Feature Sweep

Layer / File(s) Summary
Release & packaging
.github/workflows/release-manual.yml, scripts/*, deno.json, .gitignore
Manual release workflow, build/package/assemble/publish scripts, archive utilities, npm assembly/publish/smoke flows, CI deno pin, and dist/ ignore.
Effective config & policies
src/runtime/config/*, src/core/weave/resource_page_policy.ts, tests
Parses default RDF into EffectiveConfig, config-resolution profile, inheritance resolver, and resource-page generation filtering.
Extraction model & runtime
src/core/extract/*, src/runtime/extract/*, tests
Moves extraction-source details into _knop/_sources, adds optional sourceEvidence (paths/digest/observedAt), updates planExtract/defaulting, block-aware set-extraction-source, and discovery skipping generated resources.
Weave runtime & pages
src/runtime/weave/*, src/core/weave/*, tests
Threads history-tracking overrides, derives runtime policies from EffectiveConfig, refactors page models (Children/Properties/BlankNodes/References), historyGroups, and reference-link extraction.
Mesh/Knop planners & /ttl layout
src/core/knop/*, src/core/mesh/*, tests
Preserves carried source facts, supports working current-shape, switches artifact manifestation/page paths to /ttl/, optional mesh config inclusion.
Deploy gh-pages
src/runtime/deploy/*, src/cli/run.ts, tests
Branch-published mesh bootstrap planner/executor, source materialization, snapshot diffs, git commit option, safety/validation, and e2e deploy tests.
CLI/version/logging & e2e
src/cli/run.ts, src/version.ts, tests/e2e/*`
Adds --history-tracking-policy, resolveCliLogDir/WEAVE_LOG_DIR support, weave --version export, and many e2e/integration tests updated.
Docs/tests
documentation/notes/*, tests/*
Runbook, release notes v0.1.0, roadmap/decision/task updates, and many updated test fixtures and expectations.

Estimated code review effort
🎯 5 (Critical) | ⏱️ ~180 minutes

A rabbit compiles, then zips with glee,
Tags a release across the CI sea.
Pages deploy to branches bright,
Sources pinned in lunar light.
Weave hums “v0.1.0” tonight— 🐇✨

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch next/v0.1.0

Comment thread src/core/weave/weave_test.ts Fixed
- replace v0.1.0 release-note placeholders
- update release gate and runbook status after clean local ci
- defer durable next-segment hint APIs past v0.1.0

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 16

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
tests/e2e/payload_update_cli_test.ts (1)

32-36: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Transient source file now contaminates workspace snapshot assertions.

Placing alice-bio-v2.ttl under workspaceRoot can make the file-list comparison fail, since only .weave/ is excluded. Prefer writing this input in a separate temp dir (previous behavior) or delete the temp source file before listRelativeFiles(...).

🤖 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 `@tests/e2e/payload_update_cli_test.ts` around lines 32 - 36, The transient
test input file is being written into workspaceRoot (via sourcePath +
Deno.writeTextFile using readMeshAliceBioBranchFile), which contaminates
workspace snapshot assertions; change the test to write the temp source into a
separate temp directory (e.g., create a temp dir with Deno.makeTempDir and set
sourcePath there) or ensure the file is removed before calling
listRelativeFiles(...) by calling Deno.remove(sourcePath) once the test step
that needs it finishes; update references to sourcePath/transitionCase
accordingly so the test uses the isolated temp path or deletes the file prior to
snapshot comparison.
src/runtime/mesh/inventory.ts (1)

281-308: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Optional sourceRegistryTurtle currently causes hard failure when omitted.

sourceRegistryQuads becomes [] when sourceRegistryTurtle is undefined, but subsequent required extraction-source lookups run against that empty set, so valid inventories fail unexpectedly. Use inventory quads as fallback.

Proposed fix
-  const sourceRegistryQuads = sourceRegistryTurtle === undefined
-    ? []
+  const sourceRegistryQuads = sourceRegistryTurtle === undefined
+    ? inventoryQuads
     : parseInventoryQuads(
       meshBase,
       sourceRegistryTurtle,
       messages.parseErrorMessage,
     );
🤖 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/runtime/mesh/inventory.ts` around lines 281 - 308, The optional
sourceRegistryTurtle is being turned into an empty sourceRegistryQuads which
makes subsequent lookups fail; change the creation of sourceRegistryQuads so
that when sourceRegistryTurtle is undefined it falls back to using
inventoryQuads instead of [], i.e. replace the current ternary so the false
branch returns inventoryQuads and otherwise calls parseInventoryQuads(meshBase,
sourceRegistryTurtle, messages.parseErrorMessage); keep the later checks using
hasNamedNodeObject(extractionSourceIri, RDF_TYPE_IRI,
SFLO_EXTRACTION_SOURCE_IRI) and the existing error throw with
messages.missingExtractionSourceMessage.
src/runtime/weave/weave.ts (1)

1332-1340: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Resolve pinned source snapshots from inventory, not from the working filename.

For non-latest pinned states, this falls back to toPayloadHistoricalSnapshotPath(...), which assumes the manifestation path is ${state}/<derived-from-working-file>. That breaks when the source history uses non-default manifestation naming (_m0001, named manifestations, etc.), so extracted-source weave can read the wrong snapshot or fail even though the inventory already records the real state file.

🤖 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/runtime/weave/weave.ts` around lines 1332 - 1340, The code currently
falls back to toPayloadHistoricalSnapshotPath(...) for non-latest pinned states,
which uses the working filename and breaks for non-default manifestation names;
change selectedHistoricalSnapshotPath resolution to first look up the snapshot
path recorded in the artifact/inventory for the specific state (e.g. check
sourcePayloadArtifact.historicalSnapshots or a manifest/manifestation map keyed
by state such as sourcePayloadArtifact.historicalSnapshotPathMap[sourceState] or
sourcePayloadArtifact.manifestationByState[selectedHistoricalStatePath]) and use
that if present, only falling back to
toPayloadHistoricalSnapshotPath(selectedHistoricalStatePath,
sourcePayloadArtifact.workingLocalRelativePath) when no inventory entry exists;
update the logic around selectedHistoricalSnapshotPath to prefer
inventory-resolved snapshot paths over deriving from the working filename.
🧹 Nitpick comments (6)
src/core/integrate/integrate_test.ts (1)

140-141: ⚡ Quick win

Make semantic-normalization replacement less fixture-path-specific.

The replacement is tied to one concrete subject path (_s0002/ttl), which can make this semantic-equivalence test fail on unrelated fixture renumbering.

Suggested refactor
-      .replace(
-        "<_mesh/_inventory/_history001/_s0002/ttl> a sflo:ArtifactManifestation, sflo:RdfDocument ;",
-        "<_mesh/_inventory/_history001/_s0002/ttl> rdf:type sflo:RdfDocument, sflo:ArtifactManifestation ;",
-      );
+      .replace(
+        /(<[^>]+>) a sflo:ArtifactManifestation, sflo:RdfDocument ;/,
+        "$1 rdf:type sflo:RdfDocument, sflo:ArtifactManifestation ;",
+      );
🤖 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/core/integrate/integrate_test.ts` around lines 140 - 141, The test's
semantic-normalization replacement currently targets the concrete subject string
"<_mesh/_inventory/_history001/_s0002/ttl>", which breaks when fixture IDs are
renumbered; update the replacement in integrate_test.ts to use a path-agnostic
pattern (e.g. match the "_s" segment with digits or a wildcard) instead of the
literal "_s0002/ttl" so both occurrences
("<_mesh/_inventory/_history001/_s0002/ttl> a sflo:ArtifactManifestation,
sflo:RdfDocument ;" and "<_mesh/_inventory/_history001/_s0002/ttl> rdf:type
sflo:RdfDocument, sflo:ArtifactManifestation ;") are normalized by the
regex/pattern and not tied to a specific fixture number.
src/runtime/weave/pages.ts (1)

2394-2403: ⚡ Quick win

Redundant call to classifyHistoryComponentResourcePage.

The function is called twice in sequence when the first call returns a truthy value - once to check the condition and once to return the result. This duplicates the work of iterating through history groups.

♻️ Proposed fix to avoid duplicate call
-  if (
-    classifyHistoryComponentResourcePage(resourcePath, historyGroups)
-  ) {
-    return classifyHistoryComponentResourcePage(resourcePath, historyGroups)!;
-  }
-  return rdfClass(
+  const historyClass = classifyHistoryComponentResourcePage(resourcePath, historyGroups);
+  return historyClass ?? rdfClass(
     "sflo:DigitalArtifact",
     `${SFLO_NAMESPACE}DigitalArtifact`,
   );
-}
🤖 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/runtime/weave/pages.ts` around lines 2394 - 2403, The code calls
classifyHistoryComponentResourcePage(resourcePath, historyGroups) twice causing
duplicate work; fix by calling it once, storing the result in a local variable
(e.g., const classified = classifyHistoryComponentResourcePage(resourcePath,
historyGroups)), then if (classified) return classified; otherwise return the
rdfClass("sflo:DigitalArtifact", `${SFLO_NAMESPACE}DigitalArtifact`). Update the
block containing classifyHistoryComponentResourcePage, resourcePath,
historyGroups and the rdfClass fallback accordingly.
src/runtime/extract/extract.ts (3)

1743-1745: ⚡ Quick win

Turtle string escaping may be incomplete.

escapeTurtleString only escapes backslash and double-quote. Turtle string literals can also contain newlines, tabs, and other control characters that need escaping (\n, \t, \r). If source evidence values contain such characters, the generated Turtle may be malformed.

♻️ Proposed fix to handle more escape sequences
 function escapeTurtleString(value: string): string {
-  return value.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
+  return value
+    .replaceAll("\\", "\\\\")
+    .replaceAll('"', '\\"')
+    .replaceAll("\n", "\\n")
+    .replaceAll("\r", "\\r")
+    .replaceAll("\t", "\\t");
 }
🤖 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/runtime/extract/extract.ts` around lines 1743 - 1745, The
escapeTurtleString function only escapes backslashes and double quotes which can
yield invalid Turtle when values contain control characters; update
escapeTurtleString to also escape newline, carriage return, tab (and optionally
backspace/form-feed) sequences (e.g., replace \n -> \\n, \r -> \\r, \t -> \\t)
and ensure replacements run on the original string (or use a single pass
replacer) so every control char is converted before returning; locate the
escapeTurtleString function and add these additional escapes to its replacement
logic.

1747-1749: 💤 Low value

Turtle block splitting may fail on complex Turtle files.

The regex /\n\s*\n/g splits on any blank line. This could incorrectly split multiline string literals that contain blank lines, or fail to split blocks that aren't separated by blank lines. For the current use case (extraction source blocks in inventory files), this is likely fine, but consider adding a comment documenting this limitation.

🤖 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/runtime/extract/extract.ts` around lines 1747 - 1749, The
splitTurtleBlocks function currently uses turtle.trim().split(/\n\s*\n/g) which
splits on any blank line and can incorrectly break Turtle multiline string
literals or miss other block boundaries; update the function by adding a clear
comment above splitTurtleBlocks stating that it deliberately splits on blank
lines, that it will not preserve blank lines inside multiline string literals
(and therefore may split inside """...""" or '''...''' literals), and note that
a full Turtle-aware parser would be needed to avoid this; optionally mention
intended acceptable input shape for callers (extraction source blocks) so future
maintainers know this limitation.

2005-2008: 💤 Low value

Redundant conditional logic.

The condition at line 2005 checks term.datatype.value !== XSD_ANY_URI_IRI && !isUrlLiteral(term.value), but line 2008 only returns the value if isUrlLiteral(term.value) is true. This means when the datatype is xsd:anyURI but isUrlLiteral returns false, the function returns undefined instead of the URI value, which may be unintended.

♻️ Proposed fix to simplify the logic
 function toPropertyObjectHref(term: Quad["object"]): string | undefined {
   if (term.termType === "NamedNode") {
     return term.value;
   }
   if (term.termType !== "Literal") {
     return undefined;
   }
-  if (term.datatype.value !== XSD_ANY_URI_IRI && !isUrlLiteral(term.value)) {
-    return undefined;
-  }
-  return isUrlLiteral(term.value) ? term.value : undefined;
+  if (term.datatype.value === XSD_ANY_URI_IRI || isUrlLiteral(term.value)) {
+    return term.value;
+  }
+  return undefined;
 }
🤖 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/runtime/extract/extract.ts` around lines 2005 - 2008, The current
conditional mixes checks on term.datatype.value and isUrlLiteral(term.value)
such that when datatype === XSD_ANY_URI_IRI but isUrlLiteral(...) is false the
function returns undefined; change the logic so that if term.datatype.value ===
XSD_ANY_URI_IRI you return term.value unconditionally, otherwise only return
term.value when isUrlLiteral(term.value) is true. Update the conditional that
currently uses XSD_ANY_URI_IRI and isUrlLiteral to a simpler OR-based check (or
two-branch check) so the XSD_ANY_URI_IRI case always yields term.value and
non-anyURI relies on isUrlLiteral.
src/core/knop/create.ts (1)

255-280: 💤 Low value

Try-catch fallback for shape detection may silently swallow unexpected errors.

The code catches all KnopCreateInputError exceptions when trying the legacy shape, then falls back to the working shape. If the legacy shape fails for reasons other than shape mismatch (e.g., malformed data that partially matches), this could mask issues. Consider logging a debug message when falling back.

🤖 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/core/knop/create.ts` around lines 255 - 280, When attempting legacy shape
detection in createKnop (the try block that calls
assertHasLegacyCurrentMeshInventoryShapeForKnopCreate), the catch currently
swallows KnopCreateInputError and falls back silently; update the catch to log a
debug-level message including the error details (e.g., error.message or
error.stack) and context (that legacy detection failed and we're falling back to
assertHasWorkingCurrentMeshInventoryShapeForKnopCreate) before continuing, while
still rethrowing any non-KnopCreateInputError as currently implemented.
🤖 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 @.github/workflows/release-manual.yml:
- Line 63: The workflow references the non-existent tag denoland/setup-deno@v2;
update every occurrence of the action usage (lines where you have "uses:
denoland/setup-deno@v2") to a specific published patch tag such as
denoland/setup-deno@v2.0.4 (or another exact v2.x.x release) so the action
resolves correctly at runtime; leave other actions like actions/checkout@v6,
actions/setup-node@v6, actions/upload-artifact@v7, actions/download-artifact@v8
unchanged.

In `@documentation/notes/release-notes.v0.1.0.md`:
- Around line 11-35: The release notes file currently contains placeholder
"TODO" entries under the headings "## Highlights", "## Breaking Or Changed
Behavior", "## Artifacts", "## Validation", "## Known Limitations", and "##
Next"; replace each TODO with concrete content for v0.1.0: fill "## Highlights"
with key features and user-visible changes, "## Breaking Or Changed Behavior"
with any API/behavior changes and migration notes, "## Artifacts" with
build/releases/assets and links, "## Validation" with test/QA status or coverage
notes, "## Known Limitations" with known issues and workarounds, and "## Next"
with planned follow-ups or roadmap items so the v0.1.0 release notes are
complete and accurate.

In `@documentation/notes/wu.repository-options.md`:
- Line 5: Remove the manual update to the "updated" timestamp in the document:
revert or delete the line that sets `updated: 1778817945812` so the note does
not contain an explicit updated field; rely on Dendron to manage the `updated`
metadata automatically and ensure no other hard-coded `updated` entries remain
in this note.

In `@scripts/assemble-npm-packages.ts`:
- Around line 278-283: The resolveRootPath function currently treats only POSIX
absolute paths (path.startsWith("/")) as absolute; update it to use Node's
cross-platform path.isAbsolute (or path.isAbsolute from 'path') to detect
Windows (e.g., "C:\\..." or UNC "\\\\...") and POSIX absolute paths, then return
the path unchanged when isAbsolute(path) is true; otherwise continue to
join(root, path). Ensure the file imports/uses the same path module symbol
(e.g., isAbsolute and join) that the rest of the file uses.

In `@scripts/build-binaries.ts`:
- Around line 138-143: The resolveRepoPath function currently checks absolute
paths with path.startsWith("/") which fails on Windows; update resolveRepoPath
to use isAbsolute from `@std/path` (import isAbsolute) and return the input path
when isAbsolute(path) is true, otherwise return join(repoRoot, path); ensure the
import for join remains and replace the startsWith check with isAbsolute(path)
to correctly handle Windows-style absolute paths like C:\.

In `@scripts/bump-version.ts`:
- Around line 94-104: The exported function bumpVersion currently assumes CLI
validated XOR of options.version and options.increment; add an explicit check at
the start of bumpVersion to enforce exclusivity: if neither options.version nor
options.increment is provided, or if both are provided, throw a clear,
descriptive error (e.g., "Either version or increment must be provided, but not
both") before calling requireVersionString/incrementVersion; reference the
options parameter and the variables options.version and options.increment so
callers get a consistent validation regardless of invocation source.

In `@scripts/package-binaries.ts`:
- Around line 233-237: The resolveRootPath function incorrectly treats only
POSIX-style absolute paths by checking path.startsWith("/"); replace that check
with Node's cross-platform check (path.isAbsolute) so Windows paths (e.g.
C:\...) are detected as absolute and returned unchanged; update the
resolveRootPath implementation to call path.isAbsolute(path) and return path
when true, otherwise return join(root, path), and ensure the 'path' module is
imported where resolveRootPath is defined.

In `@scripts/publish-npm-packages.ts`:
- Around line 288-292: The resolveRootPath function currently detects absolute
paths with path.startsWith("/") which fails on Windows; import and use
isAbsolute from `@std/path` (or node's path.isAbsolute equivalent) to check if the
provided path is absolute, returning it directly when true and otherwise
returning join(root, path); apply the same change for the identical patterns in
scripts/smoke-npm-install.ts (function around line ~340),
scripts/package-binaries.ts (around ~233) and scripts/assemble-npm-packages.ts
(around ~278) so all platform-aware absolute path checks use isAbsolute instead
of startsWith.

In `@scripts/smoke-npm-install.ts`:
- Around line 51-54: The switch's "case \"--\": break;" only exits the switch,
not the surrounding argument-processing loop, so trailing args are still parsed;
update the handler for argument variable "arg" (the switch block) to stop
parsing when "--" is seen—either by breaking out of the outer loop (e.g., set a
stopParsing flag checked by the loop or perform a loop-level break/return)
instead of just breaking the switch, ensuring no further options are processed
after the delimiter.

In `@src/cli/run.ts`:
- Around line 939-950: The deploy output never logs result.updatedPaths (only
materializedSource.updatedPaths), so publish updates like CNAME/.nojekyll
silently; update the printing logic in the block that calls
describeGHPagesDeployBootstrapResult(result) to iterate and console.log
result.updatedPaths exactly once (e.g., after printing result.createdPaths), and
stop separately re-printing materializedSource.updatedPaths since
result.updatedPaths already includes those; you can still print
materializedSource.createdPaths if needed, but ensure
materializedSource.updatedPaths is not double-logged.

In `@src/core/extract/extract.ts`:
- Around line 239-245: normalizeNonEmptyLiteral currently trims but does not
escape control characters, allowing values containing \n, \r, or \t to produce
invalid Turtle; update normalizeNonEmptyLiteral to call the Turtle escaping
helper (escapeTurtleString) or extend that helper to also escape control chars
(at minimum replace \n, \r, \t with their escaped forms) and return the escaped
trimmed string so all evidence literals emitted (including where
normalizeNonEmptyLiteral is used) produce valid Turtle; apply the same fix to
the other similar occurrence noted around lines 895-897.

In `@src/runtime/deploy/gh_pages.ts`:
- Around line 592-600: normalizeCname currently only trims and rejects
empties/newlines; change it to validate that the value is a bare hostname and
throw GHPagesDeployInputError for anything else. Specifically, inside
normalizeCname(value: string) after trimming, reject if the string contains a
scheme ("://"), path ("/"), port (":" followed by digits), whitespace, or
illegal chars (e.g. underscores), and enforce a hostname regex (labels of
letters/digits/hyphen, separated by dots, length limits) — if the check fails,
throw new GHPagesDeployInputError("cname must be a valid bare hostname"); keep
the existing empty/newline checks but replace the permissive return with this
stricter validation.

In `@src/runtime/weave/weave.ts`:
- Around line 525-553: The helper loadEffectiveConfigForExecution currently
always calls loadWeaveDefaultEffectiveConfig() — change it to start from the
mesh/workspace resolved effective config instead of the defaults (i.e., replace
the call to loadWeaveDefaultEffectiveConfig() with the function that returns the
mesh/resolved workspace EffectiveConfig), then construct the new
EffectiveConfigValue from that resolved config (preserve its sources,
configResolution, namingPolicies, resourcePageRegenerationConfigPolicy and
resourcePageGenerationPolicyForArtifactRole) and only apply
historyTrackingPolicyOverride to defaultHistoryTrackingPolicy and
historyTrackingByRole (using ALL_ARTIFACT_ROLES), leaving all other policies
from the resolved config intact.
- Around line 1383-1433: loadKnopSourceRegistryArtifact currently joins
workspaceRoot with workingLocalRelativePath straight from inventory, allowing
path traversal; before reading the file with readTextFileWithOverlay ensure the
same local-path policy used elsewhere is applied to
sourceRegistryState.workingLocalRelativePath (e.g., validate/normalize it
against workspaceRoot, reject or resolve any ../ segments outside the workspace,
or call the existing helper used for payload/reference-catalog path checks), and
only then call readTextFileWithOverlay; update error messages to reflect the
validated path and keep existing Deno.errors.NotFound handling in
loadKnopSourceRegistryArtifact.

In `@tests/e2e/deploy_gh_pages_cli_test.ts`:
- Line 6: The test builds cliPath using new URL("src/main.ts",
repoRoot).pathname which yields Windows-incompatible paths; change cliPath to
use fromFileUrl(new URL("src/main.ts", repoRoot)) from `@std/path` instead, and
add the corresponding import for fromFileUrl (ensure
tests/e2e/deploy_gh_pages_cli_test.ts imports fromFileUrl) so the file URL is
converted to a platform-correct file path before use.

---

Outside diff comments:
In `@src/runtime/mesh/inventory.ts`:
- Around line 281-308: The optional sourceRegistryTurtle is being turned into an
empty sourceRegistryQuads which makes subsequent lookups fail; change the
creation of sourceRegistryQuads so that when sourceRegistryTurtle is undefined
it falls back to using inventoryQuads instead of [], i.e. replace the current
ternary so the false branch returns inventoryQuads and otherwise calls
parseInventoryQuads(meshBase, sourceRegistryTurtle, messages.parseErrorMessage);
keep the later checks using hasNamedNodeObject(extractionSourceIri,
RDF_TYPE_IRI, SFLO_EXTRACTION_SOURCE_IRI) and the existing error throw with
messages.missingExtractionSourceMessage.

In `@src/runtime/weave/weave.ts`:
- Around line 1332-1340: The code currently falls back to
toPayloadHistoricalSnapshotPath(...) for non-latest pinned states, which uses
the working filename and breaks for non-default manifestation names; change
selectedHistoricalSnapshotPath resolution to first look up the snapshot path
recorded in the artifact/inventory for the specific state (e.g. check
sourcePayloadArtifact.historicalSnapshots or a manifest/manifestation map keyed
by state such as sourcePayloadArtifact.historicalSnapshotPathMap[sourceState] or
sourcePayloadArtifact.manifestationByState[selectedHistoricalStatePath]) and use
that if present, only falling back to
toPayloadHistoricalSnapshotPath(selectedHistoricalStatePath,
sourcePayloadArtifact.workingLocalRelativePath) when no inventory entry exists;
update the logic around selectedHistoricalSnapshotPath to prefer
inventory-resolved snapshot paths over deriving from the working filename.

In `@tests/e2e/payload_update_cli_test.ts`:
- Around line 32-36: The transient test input file is being written into
workspaceRoot (via sourcePath + Deno.writeTextFile using
readMeshAliceBioBranchFile), which contaminates workspace snapshot assertions;
change the test to write the temp source into a separate temp directory (e.g.,
create a temp dir with Deno.makeTempDir and set sourcePath there) or ensure the
file is removed before calling listRelativeFiles(...) by calling
Deno.remove(sourcePath) once the test step that needs it finishes; update
references to sourcePath/transitionCase accordingly so the test uses the
isolated temp path or deletes the file prior to snapshot comparison.

---

Nitpick comments:
In `@src/core/integrate/integrate_test.ts`:
- Around line 140-141: The test's semantic-normalization replacement currently
targets the concrete subject string "<_mesh/_inventory/_history001/_s0002/ttl>",
which breaks when fixture IDs are renumbered; update the replacement in
integrate_test.ts to use a path-agnostic pattern (e.g. match the "_s" segment
with digits or a wildcard) instead of the literal "_s0002/ttl" so both
occurrences ("<_mesh/_inventory/_history001/_s0002/ttl> a
sflo:ArtifactManifestation, sflo:RdfDocument ;" and
"<_mesh/_inventory/_history001/_s0002/ttl> rdf:type sflo:RdfDocument,
sflo:ArtifactManifestation ;") are normalized by the regex/pattern and not tied
to a specific fixture number.

In `@src/core/knop/create.ts`:
- Around line 255-280: When attempting legacy shape detection in createKnop (the
try block that calls assertHasLegacyCurrentMeshInventoryShapeForKnopCreate), the
catch currently swallows KnopCreateInputError and falls back silently; update
the catch to log a debug-level message including the error details (e.g.,
error.message or error.stack) and context (that legacy detection failed and
we're falling back to assertHasWorkingCurrentMeshInventoryShapeForKnopCreate)
before continuing, while still rethrowing any non-KnopCreateInputError as
currently implemented.

In `@src/runtime/extract/extract.ts`:
- Around line 1743-1745: The escapeTurtleString function only escapes
backslashes and double quotes which can yield invalid Turtle when values contain
control characters; update escapeTurtleString to also escape newline, carriage
return, tab (and optionally backspace/form-feed) sequences (e.g., replace \n ->
\\n, \r -> \\r, \t -> \\t) and ensure replacements run on the original string
(or use a single pass replacer) so every control char is converted before
returning; locate the escapeTurtleString function and add these additional
escapes to its replacement logic.
- Around line 1747-1749: The splitTurtleBlocks function currently uses
turtle.trim().split(/\n\s*\n/g) which splits on any blank line and can
incorrectly break Turtle multiline string literals or miss other block
boundaries; update the function by adding a clear comment above
splitTurtleBlocks stating that it deliberately splits on blank lines, that it
will not preserve blank lines inside multiline string literals (and therefore
may split inside """...""" or '''...''' literals), and note that a full
Turtle-aware parser would be needed to avoid this; optionally mention intended
acceptable input shape for callers (extraction source blocks) so future
maintainers know this limitation.
- Around line 2005-2008: The current conditional mixes checks on
term.datatype.value and isUrlLiteral(term.value) such that when datatype ===
XSD_ANY_URI_IRI but isUrlLiteral(...) is false the function returns undefined;
change the logic so that if term.datatype.value === XSD_ANY_URI_IRI you return
term.value unconditionally, otherwise only return term.value when
isUrlLiteral(term.value) is true. Update the conditional that currently uses
XSD_ANY_URI_IRI and isUrlLiteral to a simpler OR-based check (or two-branch
check) so the XSD_ANY_URI_IRI case always yields term.value and non-anyURI
relies on isUrlLiteral.

In `@src/runtime/weave/pages.ts`:
- Around line 2394-2403: The code calls
classifyHistoryComponentResourcePage(resourcePath, historyGroups) twice causing
duplicate work; fix by calling it once, storing the result in a local variable
(e.g., const classified = classifyHistoryComponentResourcePage(resourcePath,
historyGroups)), then if (classified) return classified; otherwise return the
rdfClass("sflo:DigitalArtifact", `${SFLO_NAMESPACE}DigitalArtifact`). Update the
block containing classifyHistoryComponentResourcePage, resourcePath,
historyGroups and the rdfClass fallback accordingly.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 81126ba8-5968-4d53-bb3e-1757999e4494

📥 Commits

Reviewing files that changed from the base of the PR and between 1503386 and 66f8eab.

📒 Files selected for processing (99)
  • .github/workflows/release-manual.yml
  • .gitignore
  • defaults/application.ttl
  • defaults/config-resolution.ttl
  • deno.json
  • documentation/notes/dev.release-runbook.md
  • documentation/notes/release-notes.v0.1.0.md
  • documentation/notes/roadmap.md
  • documentation/notes/wd.codebase-overview.md
  • documentation/notes/wd.decision-log.md
  • documentation/notes/wd.task.2026.2026-04-14_0018-configurable-test-tmp.md
  • documentation/notes/wd.task.2026.2026-05-02-fantasy-rules-sidecar.md
  • documentation/notes/wd.task.2026.2026-05-04-extraction-improvements.md
  • documentation/notes/wd.task.2026.2026-05-04-refactor-planFirstPayloadWeave.md
  • documentation/notes/wd.task.2026.2026-05-05-optional-history-and-slim-support-artifacts-by-default.md
  • documentation/notes/wd.task.2026.2026-05-06-grand-config-synthesis.md
  • documentation/notes/wd.task.2026.2026-05-07-fixture-ladder-generator.md
  • documentation/notes/wd.task.2026.2026-05-13-full-ci-cd.md
  • documentation/notes/wd.task.2026.2026-05-13_1142-refactor.md
  • documentation/notes/wd.task.2026.2026-05-13_1655-support-gh-pages-branch-based-deployments.md
  • documentation/notes/wd.task.2026.2026-05-14_1105-guarded-branch-published-rebuild.md
  • documentation/notes/wu.cli-reference.md
  • documentation/notes/wu.repository-options.md
  • scripts/assemble-npm-packages.ts
  • scripts/build-binaries.ts
  • scripts/bump-version.ts
  • scripts/fixture-ladder.ts
  • scripts/package-binaries.ts
  • scripts/publish-npm-packages.ts
  • scripts/release/archive.ts
  • scripts/release/metadata.ts
  • scripts/release/npm.ts
  • scripts/smoke-npm-install.ts
  • src/cli/run.ts
  • src/core/extract/extract.ts
  • src/core/extract/extract_test.ts
  • src/core/integrate/integrate_test.ts
  • src/core/knop/add_reference.ts
  • src/core/knop/add_reference_test.ts
  • src/core/knop/create.ts
  • src/core/knop/create_test.ts
  • src/core/mesh/create.ts
  • src/core/mesh/create_test.ts
  • src/core/weave/errors.ts
  • src/core/weave/mesh_support_pages.ts
  • src/core/weave/naming_policy.ts
  • src/core/weave/resource_page_policy.ts
  • src/core/weave/support_history_policy.ts
  • src/core/weave/version_plan.ts
  • src/core/weave/weave.ts
  • src/core/weave/weave_test.ts
  • src/runtime/config/effective_config.ts
  • src/runtime/config/effective_config_test.ts
  • src/runtime/config/inheritance.ts
  • src/runtime/config/inheritance_test.ts
  • src/runtime/config/mod.ts
  • src/runtime/deploy/gh_pages.ts
  • src/runtime/deploy/mod.ts
  • src/runtime/extract/extract.ts
  • src/runtime/mesh/create.ts
  • src/runtime/mesh/inventory.ts
  • src/runtime/mesh/inventory_test.ts
  • src/runtime/mod.ts
  • src/runtime/operational/local_path_policy_test.ts
  • src/runtime/weave/page_definition.ts
  • src/runtime/weave/pages.ts
  • src/runtime/weave/pages_test.ts
  • src/runtime/weave/resource_page_policy.ts
  • src/runtime/weave/resource_page_policy_test.ts
  • src/runtime/weave/weave.ts
  • src/version.ts
  • src/version_test.ts
  • tests/e2e/deploy_gh_pages_cli_test.ts
  • tests/e2e/extract_cli_test.ts
  • tests/e2e/knop_create_cli_test.ts
  • tests/e2e/payload_update_cli_test.ts
  • tests/e2e/weave_cli_test.ts
  • tests/integration/branch_fantasy_rules_fixture_test.ts
  • tests/integration/deploy_gh_pages_test.ts
  • tests/integration/extract_test.ts
  • tests/integration/knop_create_test.ts
  • tests/integration/mesh_create_test.ts
  • tests/integration/ontology_guardrails_test.ts
  • tests/integration/payload_update_test.ts
  • tests/integration/validate_version_generate_test.ts
  • tests/integration/weave_test.ts
  • tests/scripts/assemble_npm_packages_test.ts
  • tests/scripts/bump_version_test.ts
  • tests/scripts/fixture_ladder_test.ts
  • tests/scripts/package_binaries_test.ts
  • tests/scripts/publish_npm_packages_test.ts
  • tests/scripts/release_metadata_test.ts
  • tests/scripts/smoke_npm_install_test.ts
  • tests/support/mesh_alice_bio_fixture.ts
  • tests/support/mesh_branch_fantasy_rules_fixture.ts
  • tests/support/mesh_metadata.ts
  • tests/support/mesh_sidecar_fantasy_rules_fixture.ts
  • tests/support/test_tmp.ts
  • weave.code-workspace
💤 Files with no reviewable changes (1)
  • documentation/notes/wd.task.2026.2026-05-07-fixture-ladder-generator.md

Comment thread .github/workflows/release-manual.yml
Comment thread documentation/notes/release-notes.v0.1.0.md Outdated
Comment thread documentation/notes/wu.repository-options.md Outdated
Comment thread scripts/assemble-npm-packages.ts
Comment thread scripts/build-binaries.ts
Comment thread src/runtime/deploy/gh_pages.ts
Comment on lines +684 to +725
const alreadyIntegrated = await pathExists(
join(
options.publishRoot,
`${toKnopPath(designatorPath)}/_inventory/inventory.ttl`,
),
);
let payloadNeedsWeave = false;

if (!alreadyIntegrated) {
await writeNewMaterializedSourceFile({
absoluteTargetPath,
targetPath,
sourceBytes,
});
createdPaths.push(targetPath);

const integrateResult = await executeIntegrate({
meshRoot: options.publishRoot,
sourceBaseDirectory: options.publishRoot,
request: {
designatorPath,
source: targetPath,
},
operationalLogger: options.operationalLogger,
auditLogger: options.auditLogger,
});
createdPaths.push(...integrateResult.createdPaths);
updatedPaths.push(...integrateResult.updatedPaths);
payloadNeedsWeave = true;
} else if (await fileBytesDiffer(absoluteTargetPath, sourceBytes)) {
const payloadUpdateResult = await executePayloadUpdate({
workspaceRoot: options.publishRoot,
request: {
designatorPath,
source: absoluteSourcePath,
},
operationalLogger: options.operationalLogger,
auditLogger: options.auditLogger,
});
updatedPaths.push(...payloadUpdateResult.updatedPaths);
payloadNeedsWeave = true;
}

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

Reject targetPath changes for an already-integrated designator.

Once alreadyIntegrated is true, this code never proves that the requested targetPath matches the artifact’s current working file. executePayloadUpdate() updates the existing payload identified by designatorPath, but upsertKnopSourceRegistry() records the new targetPath unconditionally. That can leave the registry pointing at a file that was never written.

Also applies to: 741-750

Comment on lines +525 to +553
async function loadEffectiveConfigForExecution(
historyTrackingPolicyOverride?: HistoryTrackingPolicy,
): Promise<EffectiveConfig> {
const effectiveConfig = await loadWeaveDefaultEffectiveConfig();
if (historyTrackingPolicyOverride === undefined) {
return effectiveConfig;
}

return new EffectiveConfigValue({
sources: effectiveConfig.sources,
configResolution: effectiveConfig.configResolution,
namingPolicies: effectiveConfig.namingPolicies,
resourcePageRegenerationConfigPolicy: effectiveConfig
.resourcePageRegenerationConfigPolicy,
defaultHistoryTrackingPolicy: historyTrackingPolicyOverride,
historyTrackingByRole: new Map(
ALL_ARTIFACT_ROLES.map((role) => [
role,
historyTrackingPolicyOverride,
]),
),
defaultResourcePageGenerationPolicy: "generate",
resourcePageGenerationByRole: new Map(
ALL_ARTIFACT_ROLES.map((role) => [
role,
effectiveConfig.resourcePageGenerationPolicyForArtifactRole(role),
]),
),
});

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

Load the workspace effective config instead of defaults.

This helper always starts from loadWeaveDefaultEffectiveConfig() and never reads the mesh’s resolved config, so executeVersion, executeGenerate, and executeWeave ignore repository-specific naming, history-tracking, and page-generation policy at runtime.

🤖 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/runtime/weave/weave.ts` around lines 525 - 553, The helper
loadEffectiveConfigForExecution currently always calls
loadWeaveDefaultEffectiveConfig() — change it to start from the mesh/workspace
resolved effective config instead of the defaults (i.e., replace the call to
loadWeaveDefaultEffectiveConfig() with the function that returns the
mesh/resolved workspace EffectiveConfig), then construct the new
EffectiveConfigValue from that resolved config (preserve its sources,
configResolution, namingPolicies, resourcePageRegenerationConfigPolicy and
resourcePageGenerationPolicyForArtifactRole) and only apply
historyTrackingPolicyOverride to defaultHistoryTrackingPolicy and
historyTrackingByRole (using ALL_ARTIFACT_ROLES), leaving all other policies
from the resolved config intact.

Comment thread src/runtime/weave/weave.ts
Comment thread tests/e2e/deploy_gh_pages_cli_test.ts Outdated
- pin setup-deno and CI Deno versions
- harden release script path and argument handling
- validate gh-pages CNAME input and report updated paths
- enforce source registry local-path policy
- preserve inventory-resolved historical source snapshots
- escape Turtle control characters in generated provenance
- cover review fixes with focused regression tests

see  wa.review.2026-05-16_1413-coderabbit

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/runtime/mesh/inventory.ts (1)

281-334: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fallback to inventory quads when source-registry Turtle is absent.

sourceRegistryTurtle is optional, but this path always reads extraction details from sourceRegistryQuads. When it is omitted, sourceRegistryQuads is empty and extracted designators fail with missingExtractionSourceMessage.

Use inventory quads as the fallback read source when registry Turtle is not provided.

Suggested fix
   const sourceRegistryQuads = sourceRegistryTurtle === undefined
     ? []
     : parseInventoryQuads(
       meshBase,
       sourceRegistryTurtle,
       messages.parseErrorMessage,
     );
+  const extractionQuads = sourceRegistryTurtle === undefined
+    ? inventoryQuads
+    : sourceRegistryQuads;
...
   if (
     !hasNamedNodeObject(
-      sourceRegistryQuads,
+      extractionQuads,
       extractionSourceIri,
       RDF_TYPE_IRI,
       SFLO_EXTRACTION_SOURCE_IRI,
     )
   ) {
     throw new Error(messages.missingExtractionSourceMessage);
   }

   const sourceArtifactPath = resolveOptionalUniqueNamedNodePath(
-    sourceRegistryQuads,
+    extractionQuads,
     meshBase,
     extractionSourceIri,
     SFLO_HAS_TARGET_ARTIFACT_IRI,
     messages.missingTargetArtifactMessage,
   );
...
   const requestedTargetStatePath = resolveOptionalUniqueNamedNodePath(
-    sourceRegistryQuads,
+    extractionQuads,
     meshBase,
     extractionSourceIri,
     SFLO_HAS_REQUESTED_TARGET_STATE_IRI,
     messages.missingRequestedTargetStateMessage,
   );

   const artifactResolutionModeIri = resolveOptionalUniqueNamedNodeIri(
-    sourceRegistryQuads,
+    extractionQuads,
     extractionSourceIri,
     SFLO_HAS_ARTIFACT_RESOLUTION_MODE_IRI,
     messages.unsupportedResolutionModeMessage,
   ) ?? SFLO_ARTIFACT_RESOLUTION_MODE_CURRENT_IRI;
...
     ...resolveExtractionSourceEvidenceState(
-      sourceRegistryQuads,
+      extractionQuads,
       meshBase,
       extractionSourceIri,
       messages.parseErrorMessage,
     ),
🤖 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/runtime/mesh/inventory.ts` around lines 281 - 334, The code sets
sourceRegistryQuads to [] when sourceRegistryTurtle is undefined, causing
lookups (extractionSourceIri, hasNamedNodeObject,
resolveOptionalUniqueNamedNodePath) to fail; change the sourceRegistryQuads
assignment to use inventoryQuads as the fallback read source (i.e., set
sourceRegistryQuads = sourceRegistryTurtle === undefined ? inventoryQuads :
parseInventoryQuads(...)) so subsequent calls to parse/extract using
sourceRegistryQuads (used by extractionSourceIri, hasNamedNodeObject,
resolveOptionalUniqueNamedNodePath, resolveOptionalUniqueNamedNodeIri) will
correctly read from the inventory when the registry Turtle is absent.
♻️ Duplicate comments (1)
src/runtime/deploy/gh_pages.ts (1)

704-745: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Prevent targetPath registry drift for already-integrated designators.

When alreadyIntegrated is true, the payload update operates on the designator’s existing working file, but the source registry is still upserted with the requested targetPath. If those differ, the registry can point at a path that was never written in this flow.

Also applies to: 761-770

🤖 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/runtime/deploy/gh_pages.ts` around lines 704 - 745, When
alreadyIntegrated is true, avoid registry drift by ensuring the payload update
uses the actual working file path rather than the originally requested
absoluteSourcePath; update the branch that calls executePayloadUpdate so the
request.source refers to the existing target path used by the workspace (use
targetPath or absoluteTargetPath as appropriate) and/or ensure the upsert logic
inside executePayloadUpdate records the same path being written; update
references around alreadyIntegrated, absoluteSourcePath, absoluteTargetPath,
targetPath, executePayloadUpdate and payloadUpdateResult so the registry is
upserted with the actual path that exists and not the originally requested
source path.
🤖 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 `@documentation/notes/wd.decision-log.md`:
- Around line 306-318: Replace the incorrect past/participial form "rerung" (and
plural "rerungs") with the correct "rerun" (and "reruns") in the decision text
entries—specifically update the phrase "branch-published ontology fixture for
the next rerung" to "next rerun" and any occurrence in the "Fixture Branches Are
Generated Outputs" section or decision lines referencing "rerung/rerungs" to use
"rerun/reruns" so the log is spelled correctly and searchable.

---

Outside diff comments:
In `@src/runtime/mesh/inventory.ts`:
- Around line 281-334: The code sets sourceRegistryQuads to [] when
sourceRegistryTurtle is undefined, causing lookups (extractionSourceIri,
hasNamedNodeObject, resolveOptionalUniqueNamedNodePath) to fail; change the
sourceRegistryQuads assignment to use inventoryQuads as the fallback read source
(i.e., set sourceRegistryQuads = sourceRegistryTurtle === undefined ?
inventoryQuads : parseInventoryQuads(...)) so subsequent calls to parse/extract
using sourceRegistryQuads (used by extractionSourceIri, hasNamedNodeObject,
resolveOptionalUniqueNamedNodePath, resolveOptionalUniqueNamedNodeIri) will
correctly read from the inventory when the registry Turtle is absent.

---

Duplicate comments:
In `@src/runtime/deploy/gh_pages.ts`:
- Around line 704-745: When alreadyIntegrated is true, avoid registry drift by
ensuring the payload update uses the actual working file path rather than the
originally requested absoluteSourcePath; update the branch that calls
executePayloadUpdate so the request.source refers to the existing target path
used by the workspace (use targetPath or absoluteTargetPath as appropriate)
and/or ensure the upsert logic inside executePayloadUpdate records the same path
being written; update references around alreadyIntegrated, absoluteSourcePath,
absoluteTargetPath, targetPath, executePayloadUpdate and payloadUpdateResult so
the registry is upserted with the actual path that exists and not the originally
requested source path.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 26e978cc-36d0-487f-b07a-6764edeebba0

📥 Commits

Reviewing files that changed from the base of the PR and between 66f8eab and 4ce33b3.

📒 Files selected for processing (35)
  • .github/workflows/ci.yml
  • .github/workflows/release-manual.yml
  • documentation/notes/dev.release-runbook.md
  • documentation/notes/release-notes.v0.1.0.md
  • documentation/notes/wd.decision-log.md
  • documentation/notes/wd.task.2026.2026-05-02-fantasy-rules-sidecar.md
  • documentation/notes/wd.task.2026.2026-05-06-grand-config-synthesis.md
  • documentation/notes/wd.task.2026.2026-05-13-full-ci-cd.md
  • documentation/notes/wu.repository-options.md
  • scripts/assemble-npm-packages.ts
  • scripts/build-binaries.ts
  • scripts/bump-version.ts
  • scripts/package-binaries.ts
  • scripts/publish-npm-packages.ts
  • scripts/smoke-npm-install.ts
  • src/cli/run.ts
  • src/core/extract/extract.ts
  • src/core/extract/extract_test.ts
  • src/core/integrate/integrate_test.ts
  • src/core/weave/weave.ts
  • src/core/weave/weave_test.ts
  • src/runtime/deploy/gh_pages.ts
  • src/runtime/extract/extract.ts
  • src/runtime/mesh/inventory.ts
  • src/runtime/mesh/inventory_test.ts
  • src/runtime/weave/pages.ts
  • src/runtime/weave/pages_test.ts
  • src/runtime/weave/weave.ts
  • tests/e2e/deploy_gh_pages_cli_test.ts
  • tests/integration/deploy_gh_pages_test.ts
  • tests/integration/validate_version_generate_test.ts
  • tests/integration/weave_test.ts
  • tests/scripts/bump_version_test.ts
  • tests/scripts/fixture_ladder_test.ts
  • tests/scripts/smoke_npm_install_test.ts
💤 Files with no reviewable changes (1)
  • documentation/notes/wd.task.2026.2026-05-02-fantasy-rules-sidecar.md
✅ Files skipped from review due to trivial changes (3)
  • documentation/notes/release-notes.v0.1.0.md
  • documentation/notes/wu.repository-options.md
  • documentation/notes/wd.task.2026.2026-05-06-grand-config-synthesis.md
🚧 Files skipped from review as they are similar to previous changes (16)
  • src/core/integrate/integrate_test.ts
  • src/runtime/mesh/inventory_test.ts
  • .github/workflows/release-manual.yml
  • scripts/build-binaries.ts
  • scripts/assemble-npm-packages.ts
  • scripts/smoke-npm-install.ts
  • tests/e2e/deploy_gh_pages_cli_test.ts
  • src/cli/run.ts
  • src/core/extract/extract.ts
  • scripts/package-binaries.ts
  • src/core/extract/extract_test.ts
  • src/runtime/weave/pages_test.ts
  • src/runtime/weave/pages.ts
  • src/runtime/extract/extract.ts
  • src/runtime/weave/weave.ts
  • src/core/weave/weave_test.ts

Comment on lines +306 to +318
- Decision: Treat Fantasy Rules as the branch-published ontology fixture for the next rerung, with authored ontology/source files on the source branch and all generated mesh output on the publication branch.
- References: [[wd.task.2026.2026-05-13_1655-support-gh-pages-branch-based-deployments]], [[wa.completed.2026.2026-05-07-fixture-ladder-generator]]
- Why:
- This proves the clean-source-branch story that motivated branch-published meshes: no generated `_mesh`, config, pages, histories, or local sibling paths need to live on the source branch.
- The older `docs/` sidecar topology remains valid, but it no longer needs to be the primary Fantasy Rules fixture once branch-published deployment is available.

### 2026-05-14: Fixture Branches Are Generated Outputs

- Decision: Treat fixture branch ladders as disposable generated golden outputs produced from ordered scenario definitions plus Accord manifests, rather than hand-maintained source material.
- References: [[wa.completed.2026.2026-05-07-fixture-ladder-generator]]
- Why:
- Current fixture branches carry stale namespace and progression shapes, and pre-v1 Weave should regenerate them against the current contract rather than add compatibility shims.
- Broad fixture rerungs should be intentional, reviewable generated-output passes with branch writes behind an explicit flag.

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

Fix typo: use “rerun/reruns” instead of “rerung/rerungs”.

There are spelling errors in the new decision text; correcting them will keep the log clear and searchable.

🧰 Tools
🪛 LanguageTool

[grammar] ~306-~306: Ensure spelling is correct
Context: ...published ontology fixture for the next rerung, with authored ontology/source files on...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~318-~318: Ensure spelling is correct
Context: ... compatibility shims. - Broad fixture rerungs should be intentional, reviewable gener...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 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 `@documentation/notes/wd.decision-log.md` around lines 306 - 318, Replace the
incorrect past/participial form "rerung" (and plural "rerungs") with the correct
"rerun" (and "reruns") in the decision text entries—specifically update the
phrase "branch-published ontology fixture for the next rerung" to "next rerun"
and any occurrence in the "Fixture Branches Are Generated Outputs" section or
decision lines referencing "rerung/rerungs" to use "rerun/reruns" so the log is
spelled correctly and searchable.

- upgrade the CI Codecov action to v6
- require Codecov upload success with fail_ci_if_error
- upload the generated LCOV file as a dedicated artifact before Codecov
- move coverage artifact upload to actions/upload-artifact v7
@djradon
djradon merged commit 8d3ea1d into main May 16, 2026
3 of 5 checks passed
@djradon
djradon deleted the next/v0.1.0 branch May 16, 2026 22:49
@coderabbitai coderabbitai Bot mentioned this pull request May 19, 2026
This was referenced May 27, 2026
This was referenced Jul 29, 2026
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.

2 participants