Skip to content

Feature: preserve specodelic frontmatter and four-layer tables when openspec archive deploys a delta #2017

Description

@charly-vibes

Context

We dual-author spec files in the specodelic four-layer markdown format (YAML frontmatter id/kind/EARS statement + ## Constraints, ## Model, ## Properties tables) alongside the openspec grammar — one file, two parsers (specodelic's documented dual-format protocol).

Our migration change: openspec/changes/migrate-specs-to-dual-format in charly-vibes/espectacular.

Problem

openspec archive (v0.19.0) merges the openspec half of a delta into the deployed spec but strips the specodelic half — frontmatter and the three tables do not survive the deploy. Verified against docs we wrote: docs/src/dual-format-authoring.md ("Archive round-trip").

Consequences:

  • Deployed specs silently lose their machine-linted layers after every archive touching the capability.
  • Repos that mandate dual-format corpus-wide (like ours now does) need a manual re-derivation recipe after each archive: copy frontmatter from the archived delta, carry surviving constraint/property rows from git history, add rows for merged requirements, re-run gates.

Request

Preserve YAML frontmatter and the ## Constraints / ## Model / ## Properties tables when openspec archive merges a delta into a deployed spec (e.g., carry them verbatim from the delta, or merge table rows when both sides have them).

This keeps deployed specs lint-clean under specodelic lint without post-archive surgery, and matches openspec's design principle that specs are the source of truth — the formal layers are part of that truth.

Workaround

Documented in our repo: staged-file frontmatter mandate in pre-commit + CI (just spec-lint) makes the strip non-silent and forces re-derivation.

Thanks for a great tool — happy to provide more detail or a failing example.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions