Skip to content

Emit VISOR artifact bundle#466

Merged
flyingrobots merged 1 commit into
mainfrom
cycle/v8-artifact-bundle-458
Jul 6, 2026
Merged

Emit VISOR artifact bundle#466
flyingrobots merged 1 commit into
mainfrom
cycle/v8-artifact-bundle-458

Conversation

@flyingrobots

Copy link
Copy Markdown
Owner

Summary

  • Adds the public visor-artifact-bundle/1 proof surface for VISOR: emit GraphQL block artifact bundle with replay and visual scene facts #458 through createVisorArtifactBundleFromGraphql() and createVisorArtifactBundle().
  • Wraps the checked-in DOGFOOD NavigationListBlock GraphQL fixture path into bijou-block/1, ui-scene-ir/1, graphql-bijou-block-debug/1, replay metadata, visual scene facts, receipt hashes, raw source identity, and semantic bundle identity.
  • Keeps VISOR: validate packed-bijou-cells/1 and adapt to Surface #459 packed-cell validation, VISOR runtime dependency, WARP TTD UI/session work, Geordi endpoints, Bunny graphics, Wesley DTO generation, and full V8 schema generalization out of scope.
  • Updates DX-049 and CHANGELOG evidence for the implementation.

Linked Work

Closes #458.
Refs #457.
Refs flyingrobots/visor#1.
Design: docs/design/DX-049-visor-artifact-bundle-proof.md

Validation

  • npx vitest run --config vitest.config.ts tests/cycles/DX-049
  • npx vitest run --config vitest.config.ts tests/cycles/DX-049 tests/cycles/DX-046/graphql-dogfood-navigation-fixture.part01.test.ts tests/cycles/DX-046/graphql-dogfood-navigation-fixture.part02.test.ts packages/bijou/src/core/graphql-bijou-block.part01.test.ts packages/bijou/src/core/graphql-bijou-block.part02.test.ts packages/bijou/src/core/graphql-bijou-block.part03.test.ts packages/bijou/src/core/graphql-bijou-block.part04.test.ts
  • npx markdownlint-cli2 docs/design/DX-049-visor-artifact-bundle-proof.md
  • npm run docs:inventory
  • npm run typecheck:test
  • npm run code-dojo:changed
  • npm run lint
  • npm run code-dojo:precommit
  • git diff --check
  • Full pre-push hook: DOGFOOD i18n gates, code size, typecheck, all 19 Vitest chunks, and scripted interactive example smoke.

@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@flyingrobots, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 6 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 509eee7a-c980-49fc-9ac2-5f2c3c5e99f5

📥 Commits

Reviewing files that changed from the base of the PR and between 8d19031 and 586c217.

📒 Files selected for processing (11)
  • docs/CHANGELOG.md
  • docs/design/DX-049-visor-artifact-bundle-proof.md
  • packages/bijou/src/core/visor-artifact-bundle.part01.ts
  • packages/bijou/src/core/visor-artifact-bundle.part02.ts
  • packages/bijou/src/core/visor-artifact-bundle.part03.ts
  • packages/bijou/src/core/visor-artifact-bundle.part04.ts
  • packages/bijou/src/core/visor-artifact-bundle.ts
  • packages/bijou/src/index.part02.ts
  • tests/cycles/DX-049/visor-artifact-bundle.part01.test.ts
  • tests/cycles/DX-049/visor-artifact-bundle.part02.test.ts
  • tests/cycles/DX-049/visor-artifact-bundle.test-support.ts
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cycle/v8-artifact-bundle-458

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.

@flyingrobots
flyingrobots merged commit 7975cd0 into main Jul 6, 2026
10 checks passed
@flyingrobots
flyingrobots deleted the cycle/v8-artifact-bundle-458 branch July 6, 2026 04:19

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 586c217774

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

fixtureId: input.fixtureId,
deterministicSeed: input.deterministicSeed,
consumedHashes: {
sourceHash: input.normalizedSourceHash,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Record the raw source hash in replay metadata

When the raw SDL text differs from its normalized semantic form, this stores replay.consumedHashes.sourceHash as the normalized hash instead of the raw sourceHash already computed for the bundle. That makes the replay metadata unable to prove the exact source text it consumed, and it leaves sourceHash indistinguishable from normalizedSourceHash even though the bundle contract exposes both raw and semantic source identities.

Useful? React with 👍 / 👎.

export function createVisorArtifactBundle(input: CreateVisorArtifactBundleInput): VisorArtifactBundle {
const fixtureId = normalizeLogicalId(input.fixtureId, 'fixtureId');
const scenarioId = normalizeLogicalId(input.scenarioId ?? `${fixtureId}:graphql-to-ui-scene`, 'scenarioId');
const deterministicSeed = input.deterministicSeed ?? 'no-randomness';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Validate deterministicSeed before replaying it

When callers provide deterministicSeed, this value is copied into replay metadata without the logical-id or host-local checks used for fixture/scenario ids. Passing a seed such as /tmp/run-123 or pid:... emits the absolute-path or process-local replay facts the bundle contract says must be rejected, so VISOR artifacts can become non-portable while still passing the builder.

Useful? React with 👍 / 👎.

assertDebugSummaryMatchesFacts(input.bijouBlock, input.uiScene, input.debugSummary);

const sourceHash = hashUiSceneValue(input.sourceText);
const normalizedSourceHash = input.bijouBlock.sourceHash;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Validate the artifact source hash before trusting it

For direct createVisorArtifactBundle() callers, this trusts bijouBlock.sourceHash as the normalized source identity without checking that it matches the artifact body. If a prepared artifact has that field changed and the scene/debug summary are generated from that same artifact, the existing scene and debug hash checks still pass, but the bundle advertises a normalized source hash that no longer identifies the normalized bijou-block/1 facts.

Useful? React with 👍 / 👎.

assertSceneMatchesArtifact(input.bijouBlock, input.uiScene);
assertDebugSummaryMatchesFacts(input.bijouBlock, input.uiScene, input.debugSummary);

const sourceHash = hashUiSceneValue(input.sourceText);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reject source text that does not compile to the artifact

For direct createVisorArtifactBundle() callers, sourceText is only hashed and embedded; it is never parsed or compared with the supplied bijouBlock. A caller can therefore pass malformed or unrelated SDL alongside a valid artifact/scene/debug summary and still get a bundle whose raw source does not produce the advertised normalized artifact, breaking the source-to-scene proof chain.

Useful? React with 👍 / 👎.

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.

VISOR: emit GraphQL block artifact bundle with replay and visual scene facts

1 participant