Skip to content

Add OpenSpec proposal for non-asset file support in facet archives - #428

Merged
eXamadeus merged 2 commits into
mainfrom
julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives
Jul 23, 2026
Merged

Add OpenSpec proposal for non-asset file support in facet archives#428
eXamadeus merged 2 commits into
mainfrom
julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives

Conversation

@eXamadeus

@eXamadeus eXamadeus commented Jul 13, 2026

Copy link
Copy Markdown
Member

Why

Facet authors cannot currently include documentation, licenses, development notes, or companion skill resources in a built facet. The build pipeline collects only conventional asset paths, and archive verification rejects every entry that is not a declared skill, agent, command, or manifest ("outer exclusivity"). These files are silently dropped at build time and hard-rejected at verification, so authors cannot ship them at all. Facets need a safe way to carry supporting files without falsely treating them as independently installable assets.

Details

This change introduces an OpenSpec proposal and its adversarial review for support-non-asset-files, reconciling findings from both into a final proposal. Key decisions captured:

  • Every supplementary archive entry, including skill companion files, must be derivable from an explicit manifest declaration. No recursive auto-discovery. Missing declared files, undeclared entries, unsafe paths (traversal, absolute, backslashes), and colliding resolved paths are build validation failures.
  • Non-asset files must be hashed per-entry in the build manifest and included in the bytes that produce the content-integrity hash. Outer exclusivity is relaxed to include declared non-asset files, not abandoned.
  • Declared files under skills/<name>/ are installed and removed atomically with their owning skill through the adapter contract, with receipt data sufficient for drift removal. This is a breaking change to the adapter SDK's single-file-per-asset contract.
  • Non-asset files outside skill directories (e.g. README.md, LICENSE at the root) are shipped and integrity-protected but never written to disk at install time. They gain no asset type, adapter metadata, independent install scope, or lockfile asset tuples.
  • The archive-entry expansion is breaking at the protocol/archive level. Design must choose an explicit version compatibility boundary; legacy asset-only archives must remain valid under the new rules.
  • The build manifest must represent and hash every tracked entry while preserving an unambiguous distinction between installable assets and supplementary files. The exact schema shape is deferred to design; no premature commitment to placing non-asset hashes in an assets map.

Affected domains: protocol__schemas, protocol__content-hashing, protocol__integrity, authoring__facets, installation, and adapter__assets. No new capability domain is introduced.

Documentation updates are scoped to docs/specification/archive.mdx, docs/specification/build.mdx, docs/specification/manifest.mdx, docs/specification/integrity.mdx, docs/guides/create-your-first-facet.mdx, docs/guides/install-facets.mdx, and root README.md. docs/specification/lockfile.mdx must be reviewed and updated if receipt or lockfile semantics change for multi-file skills.


Note

Low Risk
This PR only adds specification and planning artifacts under openspec/; no protocol, engine, adapter, or CLI runtime behavior changes until follow-up implementation lands.

Overview
Adds the reconciled OpenSpec change support-non-asset-files (plus adversarial artifacts, comparison reviews, and task breakdown) so facet archives can carry explicitly declared supplementary files—not only skills, agents, and commands.

The planned behavior relaxes outer exclusivity while keeping membership derivable from facet.json: declared root files (e.g. README.md, LICENSE) and skill companions ship in the archive with per-entry and whole-archive integrity, but only skill-directory companions materialize on install; other supplementary bytes stay archive-only (no lockfile asset tuples or adapter installs).

Breaking boundaries are spelled out: facetVersion / build-manifest 0.2 with a single all-entry files hash map (legacy 0.1 still accepted), lockfile 0.2 with per-materialized-file integrity, a shared archive-plan for build and verification (path-safety and tar-entry checks), tagged adapter API 0.1 for atomic multi-file skill bundles, and receipt-owned companion paths for safe removal/drift.

Authoring deltas include first-class README flows in create/edit, supplementary-file validation before dist/ cleanup, and a consumer-first rollout (verifiers/registry before producers). Implementation is deferred to the linked VIPER task list and doc updates across protocol, guides, and README.

Reviewed by Cursor Bugbot for commit a17d95c. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features
    • Added support for explicitly declared supplementary non-asset files (e.g., README, LICENSE, DEVELOPMENT) to ship inside facet archives alongside installable assets.
    • Facet archives now use deterministic per-entry integrity hashing with stricter membership verification.
    • Skill installations materialize companion files atomically; archive-only supplementary files remain archive-only.
    • Authoring workflows add first-class README handling (README.md and extensionless README).
  • Breaking Changes
    • Updated compatibility and versioning rules for protocol/requirement changes and facet archive handling.
  • Documentation
    • Added/expanded specs and guidance covering packaging, hashing/verification, installation behavior, adapter/SDK contracts, and an end-to-end upgrade plan.

@changeset-bot

changeset-bot Bot commented Jul 13, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 43cb4de

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds an OpenSpec change proposing explicitly declared supplementary non-asset files in facet archives. It defines deterministic packaging, canonical path validation, per-entry integrity checks, versioned archive and lockfile schemas, strict verification, and legacy compatibility. Skill-directory companions are materialized atomically through adapter bundles, while other supplementary files remain archive-only. Authoring workflows add README support, edit reconciliation, scaffolding, and transactional application. Adversarial reviews and task artifacts record compatibility, security, ownership, rollout, and validation requirements.

Sequence Diagram(s)

sequenceDiagram
  participant Author
  participant FacetEditor
  participant BuildCommand
  participant ArchiveVerifier
  participant Installer
  participant Adapter
  Author->>FacetEditor: declare supplementary files
  FacetEditor->>BuildCommand: apply validated manifest
  BuildCommand->>ArchiveVerifier: produce verifiable archive
  ArchiveVerifier->>Installer: return verified asset plan
  Installer->>Adapter: install skills with companion bytes
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
Title check ✅ Passed The title clearly matches the PR’s main change: adding an OpenSpec proposal for non-asset file support in facet archives.
Description check ✅ Passed The description covers Why and Details well and is mostly complete for this spec-only change, with only the Verification section omitted.
✨ 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 julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives

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.

eXamadeus commented Jul 13, 2026

Copy link
Copy Markdown
Member Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

Comment thread openspec/changes/support-non-asset-files/proposal.md Outdated
Comment thread openspec/changes/support-non-asset-files/proposal.md
@greptile-apps

greptile-apps Bot commented Jul 13, 2026

Copy link
Copy Markdown

Greptile Summary

This PR introduces the complete support-non-asset-files OpenSpec change — proposal, adversarial artifacts, comparison reviews, and reconciled delta specs for 7 (formally reviewed) plus 2 additional capability domains — covering how facet archives gain explicit supplementary-file declarations, per-entry integrity hashing, atomic skill-bundle adapter contracts, and a consumer-first migration path. No runtime code is changed; all behavior is deferred to follow-up implementation tasks.

  • All three blocking items from the adversarial specs review were correctly restored in the reconciled specs: receipt frozen-cleanup ordering and per-project isolation/concurrency clauses (installation), "all items resolved before proceeding" (authoring), the two security scenarios for build-manifest membership legitimization and portable-alias tar paths (integrity), and the known-vs-unknown upgrade-guidance split (installation).
  • specs/adapter__sdk/spec.md and specs/adapter__management/spec.md are committed as delta specs but absent from state.json's mainPaths; they had no adversarial counterparts and the reconciliation notes cover only seven specs. Task 14.5's strict OpenSpec validation will encounter these as untracked files, and their content (the 0.0-is-unsupported gate, SDK factory override rejection, npm 0.0/0.1 selection) didn't receive the formal adversarial scrutiny that the other seven specs did.

Confidence Score: 4/5

Safe to merge with awareness of the state.json tracking gap for two spec files.

The design and seven formally reviewed specs are thorough and internally consistent; the adversarial review blocking items were all adopted correctly. The one concrete gap is that adapter__sdk/spec.md and adapter__management/spec.md were added after the adversarial review concluded without updating state.json mainPaths, leaving them outside the formal governance record. Their content looks correct, but task 14.5 strict OpenSpec validation may fail on these untracked files, and the adapter API cutover behavior they describe did not receive the same adversarial scrutiny as the other seven specs.

openspec/changes/support-non-asset-files/adversarial/state.json needs adapter__sdk and adapter__management added to mainPaths to match the committed spec files.

Reviews (11): Last reviewed commit: "Add adversarial design and review for `s..." | Re-trigger Greptile

Comment thread openspec/changes/support-non-asset-files/proposal.md
Comment thread openspec/changes/support-non-asset-files/proposal.md Outdated

@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: e934247f55

ℹ️ 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".

Comment thread openspec/changes/support-non-asset-files/proposal.md Outdated
Comment thread openspec/changes/support-non-asset-files/proposal.md Outdated
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from e934247 to caa58a2 Compare July 20, 2026 01:57

@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: caa58a2979

ℹ️ 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".

Comment thread openspec/changes/support-non-asset-files/proposal.md Outdated
Comment thread openspec/changes/support-non-asset-files/proposal.md Outdated
Comment thread openspec/changes/support-non-asset-files/proposal.md

@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: 8f4c3a6271

ℹ️ 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".

Comment thread openspec/changes/support-non-asset-files/design.md Outdated
Comment thread openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md Outdated

@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: 12


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b1b2e90d-57bd-493a-9bb1-b8da55805771

📥 Commits

Reviewing files that changed from the base of the PR and between caa58a2 and 8f4c3a6.

📒 Files selected for processing (20)
  • openspec/changes/support-non-asset-files/adversarial/artifacts/design.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__schemas/spec.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/design-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/specs-review.md
  • openspec/changes/support-non-asset-files/adversarial/state.json
  • openspec/changes/support-non-asset-files/design.md
  • openspec/changes/support-non-asset-files/proposal.md
  • openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md

Comment thread openspec/changes/support-non-asset-files/adversarial/state.json Outdated
Comment thread openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md Outdated
Comment thread openspec/changes/support-non-asset-files/specs/installation/spec.md Outdated
Comment thread openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md Outdated
Comment thread openspec/changes/support-non-asset-files/design.md
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from 8f4c3a6 to 0bc8f53 Compare July 20, 2026 14:03
@eXamadeus
eXamadeus changed the base branch from main to graphite-base/428 July 20, 2026 14:06

@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: 0bc8f53444

ℹ️ 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".

Comment thread openspec/changes/support-non-asset-files/design.md
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from 0bc8f53 to 4f71fd8 Compare July 20, 2026 14:07
@eXamadeus
eXamadeus changed the base branch from graphite-base/428 to julian/07-20-refresh_openapi_registry_snapshot July 20, 2026 14:07

@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: 3

♻️ Duplicate comments (1)
openspec/changes/support-non-asset-files/adversarial/state.json (1)

27-27: ⚠️ Potential issue | 🟠 Major

Align the reconciliation state with the finalized specification artifacts.

The recorded reconciliation notes in state.json contradict the contents of the final artifacts. The notes claim that "protocol package and adapter SDK each marked as new major releases" and "scaffold writes README undeclared during rollout window". However, the design and the tasks.md execution plan explicitly retain the minor-release policy and the default README scaffolding.

Please correct the reconciliation notes to accurately reflect the final decisions, as they currently falsely claim that major releases and a disabled README scaffold were adopted.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2dc0fc9b-94ce-4945-961d-211dd2cc1ed5

📥 Commits

Reviewing files that changed from the base of the PR and between 8f4c3a6 and 0bc8f53.

📒 Files selected for processing (23)
  • openspec/changes/support-non-asset-files/adversarial/artifacts/design.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__schemas/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/tasks.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/design-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/specs-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/tasks-review.md
  • openspec/changes/support-non-asset-files/adversarial/state.json
  • openspec/changes/support-non-asset-files/design.md
  • openspec/changes/support-non-asset-files/proposal.md
  • openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md
  • openspec/changes/support-non-asset-files/tasks.md
🚧 Files skipped from review as they are similar to previous changes (8)
  • openspec/changes/support-non-asset-files/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/proposal.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__integrity/spec.md

Comment thread openspec/changes/support-non-asset-files/specs/authoring__facets/spec.md Outdated
Comment thread openspec/changes/support-non-asset-files/specs/authoring__facets/spec.md Outdated
@eXamadeus
eXamadeus changed the base branch from julian/07-20-refresh_openapi_registry_snapshot to graphite-base/428 July 20, 2026 15:36
@eXamadeus
eXamadeus force-pushed the graphite-base/428 branch from 513f3b9 to 7b89aad Compare July 20, 2026 15:36
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from 4f71fd8 to a7d09e2 Compare July 20, 2026 15:36
@eXamadeus
eXamadeus changed the base branch from graphite-base/428 to main July 20, 2026 15:36

@cursor cursor 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.

Cursor Bugbot has reviewed your changes using high effort and found 3 potential issues.

There are 4 total unresolved issues (including 1 from previous review).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a7d09e2. Configure here.

@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: 8


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f1057f96-8e02-4e9d-8eb6-a51da3236217

📥 Commits

Reviewing files that changed from the base of the PR and between 0bc8f53 and a7d09e2.

📒 Files selected for processing (26)
  • openspec/changes/support-non-asset-files/.openspec.yaml
  • openspec/changes/support-non-asset-files/adversarial/artifacts/design.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/proposal.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__schemas/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/tasks.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/design-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/proposal-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/specs-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/tasks-review.md
  • openspec/changes/support-non-asset-files/adversarial/state.json
  • openspec/changes/support-non-asset-files/design.md
  • openspec/changes/support-non-asset-files/proposal.md
  • openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md
  • openspec/changes/support-non-asset-files/tasks.md
🚧 Files skipped from review as they are similar to previous changes (12)
  • openspec/changes/support-non-asset-files/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/.openspec.yaml
  • openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/proposal-review.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/adversarial/state.json
  • openspec/changes/support-non-asset-files/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/tasks.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/tasks.md
  • openspec/changes/support-non-asset-files/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__integrity/spec.md

Comment thread openspec/changes/support-non-asset-files/design.md Outdated
Comment thread openspec/changes/support-non-asset-files/design.md Outdated
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from a7d09e2 to 1c5a6dc Compare July 20, 2026 17:09

@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: 1c5a6dc339

ℹ️ 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".

Comment thread openspec/changes/support-non-asset-files/design.md Outdated

@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: 69b1df35d4

ℹ️ 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".


An adapter SHALL accept an installation request whose content shape is determined by asset type. Every installation request SHALL identify its scope and asset name. A skill request SHALL carry the primary `SKILL.md` text, per-asset metadata, a canonical map from companion paths relative to the skill root to opaque bytes, and the caller-verified set of previously-owned companion paths; an empty companion map and an empty previously-owned set SHALL each be valid. Adapters SHALL NOT persist ownership metadata or infer ownership from disk contents; ownership data arrives in each request from the caller's lockfile and receipt records. Agent and command requests SHALL each carry one text content value and per-asset metadata and SHALL NOT carry companions or ownership sets. No installation request SHALL represent archive-only supplementary files.

The adapter SHALL own path resolution, containment, directory creation, metadata assembly, storage format, and rollback. Before any filesystem access, every supplied companion path — new or previously owned — SHALL be validated as relative, canonical, and confined below the resolved skill root; a request containing a malformed or escaping path SHALL be rejected without reading, writing, or deleting anything. Skill installation SHALL replace the complete owned bundle atomically: the new primary and companions SHALL all commit, with previously-owned companion paths absent from the new request removed, or the prior bundle SHALL remain intact. Removal during replacement SHALL be limited to the supplied previously-owned set. Companion bytes SHALL be stored verbatim; metadata or front-matter transformation SHALL apply only to the primary file. Unowned files SHALL NOT be removed. Expected failures SHALL be returned as structured results. Atomicity SHALL cover handled failures within one operation; recovery from an interrupted operation is the caller's idempotent re-install, so installation SHALL remain idempotent and convergent.

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 companion paths that alias SKILL.md

A skill request whose companion map contains SKILL.md passes the stated relative/canonical/contained validation but targets the same file as the primary. Such a request cannot satisfy both guarantees that the primary receives metadata transformation and companions are stored verbatim; depending on write ordering, it overwrites the primary or companion and makes the bundle invalid. Require adapter-side rejection of SKILL.md (and path conflicts with the primary) before any filesystem access.

Useful? React with 👍 / 👎.

@eXamadeus
eXamadeus changed the base branch from main to graphite-base/428 July 22, 2026 22:01
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from 69b1df3 to 673386f Compare July 22, 2026 22:01
@eXamadeus
eXamadeus changed the base branch from graphite-base/428 to julian/07-22-bump_viper-plans_from_1.1.4_to_1.2.0 July 22, 2026 22:01
@eXamadeus
eXamadeus changed the base branch from julian/07-22-bump_viper-plans_from_1.1.4_to_1.2.0 to graphite-base/428 July 23, 2026 00:03
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from 673386f to f5e650e Compare July 23, 2026 00:03
@eXamadeus
eXamadeus force-pushed the graphite-base/428 branch from 65d98f4 to c3520e0 Compare July 23, 2026 00:04
@graphite-app
graphite-app Bot changed the base branch from graphite-base/428 to main July 23, 2026 00:04
@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from f5e650e to 43cb4de Compare July 23, 2026 00:04

@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: 43cb4de459

ℹ️ 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".


**Documentation (Article III)**

This proposal was informed by `docs/specification/archive.mdx` (content rules: path safety, manifest completeness, outer exclusivity), `docs/specification/build.mdx` (steps 2 and 5), `docs/specification/manifest.mdx` (text-asset conventional paths), and `docs/specification/integrity.mdx` (hash definitions, receipt asset tuples). All four SHALL be updated as scoped work in this change, together with the authoring and installation guides (`docs/guides/create-your-first-facet.mdx`, `docs/guides/install-facets.mdx`) and root `README.md`, which describe facets in asset-only terms today. `docs/specification/lockfile.mdx` SHALL be updated for lockfile `0.2`, per-materialized-file integrity, legacy-alpha-1 migration, and the distinction between version-controlled canonical hashes and machine-local receipt ownership. `docs/specification/commit.mdx` SHALL be updated for receipt file-ownership records and transactional reconciliation, and `docs/guides/custom-adapters.mdx` SHALL be updated for the breaking tagged adapter contract so third-party adapter authors are not left with the single-content instructions.

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 Include CLI create/edit references in the documentation scope

Add docs/cli/authoring/create.mdx and docs/cli/authoring/edit.mdx to the scoped updates. They are user-facing command references, not either of the named guides, and currently say the wizard creates only facet.json plus asset files and that source front matter survives builds; the proposed default README and primary-file front-matter rejection make both statements stale. Leaving them outside the explicit Article III scope can ship the new workflow with contradictory CLI documentation.

Useful? React with 👍 / 👎.


## 14. Documentation and Release Readiness — Implementation

- [ ] 14.1 Implement: Update archive, build, manifest, integrity, lockfile, commit, install, publish, and terminology documentation for supplementary membership, strict versions, path safety, per-file hashes, and atomic skill bundles

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 Add a publishing-spec delta for the new hash-map contract

Scope a delta for openspec/specs/publishing/spec.md, not only its documentation page. Its publish-verification requirement currently permits checking the build manifest's per-asset hashes, while 0.2 replaces that map with files and requires archive-only supplementary entries to be verified too. Without a publishing capability/spec update, an implementation following the unchanged publish spec can accept an archive whose README or other archive-only file was tampered with, contrary to the new integrity requirements.

Useful? React with 👍 / 👎.

@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: 4

♻️ Duplicate comments (3)
openspec/changes/support-non-asset-files/adversarial/artifacts/design.md (3)

30-43: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Align the declaration model with the normative specs.

This still defines one top-level files array and permits skills/<name>/... entries there, while openspec/changes/support-non-asset-files/specs/authoring__facets/spec.md Lines 271-302 and openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md Lines 11-13 require separate per-skill files arrays and reject top-level declarations under skills/. Resolve this before implementation or producers and consumers will disagree on manifest shape and ownership.


53-67: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Reconcile the archive-version contract.

This section assigns supplementary archives facetVersion: 1, but openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md Lines 203-209 and the PR objective define the current format as facetVersion: 0.2. Version dispatch, fixtures, and release compatibility cannot be implemented consistently until one value is authoritative.


107-115: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Reconcile lockfile ownership with the schema contract.

The design says the lockfile remains unchanged and companion ownership is receipt-only, but openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md Lines 139-147 requires lockfile 0.2 asset entries with per-file integrity records. Decide whether those records are normative lockfile data or remove that requirement from the schema and dependent workflows.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 352d60d5-9049-4a98-967a-3f6dd715c71b

📥 Commits

Reviewing files that changed from the base of the PR and between a7d09e2 and 43cb4de.

📒 Files selected for processing (26)
  • openspec/changes/support-non-asset-files/.openspec.yaml
  • openspec/changes/support-non-asset-files/adversarial/artifacts/design.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/proposal.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__schemas/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/tasks.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/design-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/proposal-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/specs-review.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/tasks-review.md
  • openspec/changes/support-non-asset-files/adversarial/state.json
  • openspec/changes/support-non-asset-files/design.md
  • openspec/changes/support-non-asset-files/proposal.md
  • openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/specs/authoring__facets/spec.md
  • openspec/changes/support-non-asset-files/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__schemas/spec.md
  • openspec/changes/support-non-asset-files/tasks.md
🚧 Files skipped from review as they are similar to previous changes (12)
  • openspec/changes/support-non-asset-files/.openspec.yaml
  • openspec/changes/support-non-asset-files/specs/protocol/spec.md
  • openspec/changes/support-non-asset-files/adversarial/reviews/proposal-review.md
  • openspec/changes/support-non-asset-files/adversarial/state.json
  • openspec/changes/support-non-asset-files/adversarial/artifacts/tasks.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__integrity/spec.md
  • openspec/changes/support-non-asset-files/specs/protocol__content-hashing/spec.md
  • openspec/changes/support-non-asset-files/tasks.md
  • openspec/changes/support-non-asset-files/specs/adapter__assets/spec.md
  • openspec/changes/support-non-asset-files/adversarial/artifacts/specs/installation/spec.md
  • openspec/changes/support-non-asset-files/specs/installation/spec.md


### Requirement: Build output is assembled into a compressed archive

The system SHALL assemble all resolved build output into a two-layer archive file with the extension `.facet`. The outer layer SHALL be an uncompressed tar containing exactly two entries: `build-manifest.json` and `archive.tar.gz`. The inner `archive.tar.gz` SHALL be a gzip-compressed tar containing the facet manifest, all resolved text asset files, all declared skill companion files at their paths beneath their skill's directory, and all declared archive-only supplementary files at their declared paths. Every inner entry SHALL be derivable from a declaration in the facet manifest; the system SHALL NOT include any file that is not so derivable. The archive filename SHALL follow the pattern `<name>-<version>.facet` where `name` and `version` come from the facet manifest.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Define the implicit facet-manifest entry.

The inner archive contains facet.json, but line [31] says every entry must derive from a declaration inside that same manifest. Explicitly exempt the authoritative facet.json entry as an implicit fixed entry, with only assets and supplementary files derived from declarations; otherwise builders and verifiers have no non-circular membership rule.

Comment on lines +163 to +182
### Requirement: Valid facet manifests are accepted

The system SHALL accept a facet manifest that conforms to the manifest schema. A valid manifest has a name, a version, and at least one text asset or composed facet. The name SHALL be either an unscoped kebab-case facet identity or a scoped `@scope/name` identity. A manifest MAY include an optional top-level `private` boolean and supplementary-file declarations. Skills, agents, and commands SHALL use descriptors with required descriptions and optional platform metadata; prompt content SHALL be inferred from conventional paths rather than descriptor references.

Current-format skill, agent, and command names SHALL be single segments of 1–64 lowercase ASCII letters, digits, or hyphens, with no leading, trailing, or consecutive hyphens. Skills SHALL use `skills/<name>/SKILL.md`, agents `agents/<name>.md`, and commands `commands/<name>.md`. Skills and commands SHALL use disjoint names; agents MAY share a name with either.

#### Scenario: Minimal valid manifest with a skill

- **WHEN** an author provides a name, version, and one valid skill descriptor with a description
- **THEN** the system SHALL accept the manifest

#### Scenario: Valid manifest with a scoped facet identity

- **WHEN** an author provides name `@julian/cowsay`, a version, and one valid skill descriptor
- **THEN** the system SHALL accept the manifest

#### Scenario: Manifest with all sections

- **WHEN** an author provides identity fields, skill, agent, and command descriptors, composed facets, server references, and supplementary declarations
- **THEN** the system SHALL accept the manifest

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Remove or explicitly scope unsupported composition and server-reference fields.

This authoring requirement says manifests containing composed facets and server references are valid, but protocol__schemas explicitly excludes those fields from the current user-facing manifest contract. Either remove this scenario and the acceptance language, or mark these fields as legacy/out-of-scope with a defined compatibility rule; otherwise authoring can produce manifests that the published schema rejects.

@eXamadeus
eXamadeus force-pushed the julian/07-13-add_openspec_proposal_for_non-asset_file_support_in_facet_archives branch from 43cb4de to a17d95c Compare July 23, 2026 00:48

eXamadeus commented Jul 23, 2026

Copy link
Copy Markdown
Member Author

Merge activity

  • Jul 23, 2:25 AM UTC: A user started a stack merge that includes this pull request via Graphite.
  • Jul 23, 2:25 AM UTC: @eXamadeus merged this pull request with Graphite.

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