Rewrite README.md Installation prose and references/skill-triggers.md to drop the bundles/ depth and --full-depth guidance, relabel the architecture diagram bundle node, and correct bundle-manifest-design.md to place manifests at <skill>/manifest.yaml with the 8-umbrella count. Fix the example manifest and schema descriptions, plus the production-excellence AGENTS.md depth note. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
12 KiB
Bundle Manifest Design — Issue #203
This note records the design decision for the bundle-manifest contract and the lifecycle capability matrix introduced for issue #203 ("chore: define bundle manifests and lifecycle capability matrix"). It is the bounded design note required by acceptance criterion AC1: it surveys the repository's existing bundle metadata, records the chosen schema, and explains why the chosen field set is the smallest set that still covers the required contract. It deliberately does not propose a second skill format, does not require top-level skills to join bundles, and does not expand into unrelated repository refactors (see Non-goals).
1. Problem statement
The repository has eight canonical bundles — top-level directories with a
SKILL.md entrypoint: product-lifecycle, production-excellence,
agent-production-operations, forward-deployed-engineering, neckbeard,
workflow-architect, tailscale, and research-and-vault. Only
workflow-architect carries a bundle-metadata
concept today, and that concept is generation-time configuration for its own
builder — not a common, machine-readable composition contract. Users and agents
cannot consistently discover, from metadata alone, what a bundle is for, which
lifecycle stages it covers, which skills it composes, what it requires, what it
produces, where it hands off, where it overlaps other bundles, and how it is
evaluated.
2. Survey of existing bundle metadata
2.1 workflow-architect/templates/manifest.yaml.tmpl
The template defines a generation-time manifest with the following fields:
| Field | Meaning |
|---|---|
bundle_name |
Bundle identity for the generator |
generated |
Generation date (timestamp) |
archetype |
Builder archetype (e.g. morning-triage-deep-work) |
kanban (optional) |
Kanban board metadata (board_slug, phases) |
skills |
Ordered list of {name, file, trigger{type, keywords, description, context}} |
Its purpose is to drive the workflow-architect generator (morning-triage /
deep-work archetypes, kanban boards). The skills entries describe loading
triggers (keyword → nested skill) for that specific builder — not a general
capability contract.
2.2 workflow-architect/references/example-output/developer-triage/manifest.yaml (and developer-pipeline-kanban)
Concrete instances of the template: bundle_name, generated (e.g.
2026-05-29), archetype (morning-triage-deep-work,
build-review-deploy), optional kanban (developer-pipeline-kanban only),
and skills entries with trigger metadata (type: keyword /
keyword+context, keywords, description, optional context). These
confirm that the existing manifest concept is workflow-architect-specific
generation configuration — no bundle outside workflow-architect consumes it.
2.3 Bundles that carry no manifest today
neckbeard/, research-and-vault/, and tailscale/
carry no manifest of any kind. Their capability description lives only in the
SKILL.md frontmatter description field. product-lifecycle,
production-excellence, and agent-production-operations (the three new
milestone bundles) also carry no manifest today; they ship one with this issue.
2.4 open-knowledge-format/references/bundle-architecture.md
OKF's bundle-architecture describes organizational guidance for knowledge
bundles: flat vs. hierarchical directory layouts, index.md design,
cross-linking patterns, and tagging conventions. It is not a machine-readable
manifest format and defines no schema; it informs how bundles are organized,
not how their capabilities are declared.
2.5 Survey conclusion
The existing "manifest" concept is (a) workflow-architect-specific, (b)
generation-time configuration rather than a capability contract, and (c) not
consumed by any other bundle or tool. OKF contributes structure guidance but no
schema. No existing artifact exposes the discovery contract this issue needs
(purpose, audience, stages, included skills, prerequisites, outputs, handoffs,
conflicts, eval suite) in a machine-readable form. A new, small, versioned
schema is therefore warranted — it reuses the repository's schema conventions
(schemas/evals-v1.schema.json: JSON Schema, versioned filename
*-v1.schema.json) rather than inventing a parallel mechanism.
3. Chosen schema
The contract is schemas/bundle-manifest-v1.schema.json (JSON Schema,
draft 2020-12, additionalProperties: false, versioned filename following the
evals-v1.schema.json convention). A manifest lives at <name>/manifest.yaml
and is validated by scripts/validate-bundles.rb.
3.1 Fields preserved, dropped, and renamed vs. the existing manifest concept
| Existing concept (workflow-architect) | Disposition | Rationale |
|---|---|---|
bundle_name |
Preserved (renamed semantics: now must equal the bundle directory name) | Bundle identity is required for cross-references and the matrix |
skills list |
Renamed → included_skills |
Entries become relative SKILL.md paths (catalog references or nested helpers) instead of trigger configurations; a machine-checkable composition list |
trigger {type, keywords, ...} |
Dropped | Loading triggers remain human-authored prose in each bundle's SKILL.md / AGENTS.md, where they are read; the manifest is a capability contract, not a loader config |
generated (timestamp) |
Dropped | Generation-time metadata; a timestamp would make the generated matrix non-deterministic |
archetype |
Dropped | workflow-architect-specific concept with no meaning for the other bundles |
kanban {board_slug, phases} |
Dropped | Pipeline-board-specific concept owned by workflow-architect's builder |
(new) purpose, audience, stages, prerequisites, outputs, handoffs, conflicts, eval_suite, schema_version |
Added | The nine contract fields + version pin, below |
3.2 The nine contract fields and the minimalism rationale
The issue contract names nine fields. Each maps to exactly one discoverability question a user or agent must be able to answer from metadata alone; no field can be derived from another, and dropping any one leaves a question unanswerable:
| # | Field | Question it answers | Consumer |
|---|---|---|---|
| 1 | purpose |
What does this bundle do? | Human readers, matrix, catalog |
| 2 | audience |
Who is this for? | Human readers, matrix |
| 3 | stages |
What lifecycle span does it cover, and which skill serves each stage? | Lifecycle discovery (VAL-MNF-018) |
| 4 | included_skills |
Which skills does it compose? (paths resolve to SKILL.md files) | Composition boundary, catalog-exactness (VAL-MNF-020) |
| 5 | prerequisites |
What inputs/artifacts must exist before use, and from which skills? | Readiness-path discovery (VAL-MNF-019) |
| 6 | outputs |
What artifacts does it produce? | Handoff validation (VAL-MNF-014) |
| 7 | handoffs |
Where do its outputs go next? | Composition navigation, conflict analysis |
| 8 | conflicts |
Where does it overlap another bundle/skill, and how should overlap route? | Conflict resolution (VAL-MNF-021) |
| 9 | eval_suite |
How is it evaluated, and where is the eval manifest? | Eval discovery (VAL-MNF-017) |
Why this is the smallest set: every field is either (a) an irreducible
answer to a discovery question the issue explicitly requires, or (b) a
reference used by the validators to reject contradictory metadata. The schema
adds only schema_version and bundle_name (identity + version pin, mirroring
evals-v1). It deliberately excludes workflow-architect's trigger/archetype/
kanban machinery, excludes free-form "tags" (already present in SKILL.md
frontmatter metadata), and excludes per-skill methodology content (owned by
the skills themselves). Each field has a defined type (strings, ordered stage
lists, path lists) chosen so that a validator can machine-check completeness
and consistency without a second toolchain.
4. Migration path
Per the milestone-4 mission boundary, the four pre-existing canonical bundles are off-limits in this issue — their metadata belongs to their owning areas and must not be changed here. They are therefore listed in this migration path with a stated reason and future sequencing:
| Bundle | Status this issue | Reason (mission boundary) | Future sequencing |
|---|---|---|---|
workflow-architect |
No manifest added | Already owns a manifest concept (generation config for its builder); converting it to the new contract would require migrating the builder and its example-output fixtures, which is out of scope for #203 | Convert after its builder tooling and example-output fixtures are stable; preserve trigger semantics in SKILL.md/AGENTS.md prose |
neckbeard |
No manifest added | Ships its own evaluation harness (eval/) and delivery-packet lifecycle; belongs to the neckbeard maintenance track |
Add a manifest on its next substantive change, deriving stages from its journey phases |
tailscale |
No manifest added | Complex multi-skill bundle with its own skills/ hierarchy and scripts; belongs to the tailscale maintenance track |
Add a manifest when its nested-skill boundary is next documented, listing nested helpers under skills/ |
research-and-vault |
No manifest added | Minimal bundle (SKILL.md + README only) with no composition surface yet | Add a manifest when it gains references/helpers |
The three new milestone bundles — product-lifecycle, production-excellence,
and agent-production-operations — and forward-deployed-engineering ship
schema-conformant manifest.yaml files now (<name>/manifest.yaml), each resolving
eval_suite to its own <name>/evals/evals.json.
For the matrix, bundles without a manifest are rendered with a purpose derived
from their SKILL.md frontmatter description and the remaining cells set to
the documented deferral marker migration deferred — see docs/bundle-manifest-design.md §Migration path
(never blank; see VAL-MNF-010/011).
5. Non-goals
- No second skill format. The manifest contract does not alter the
top-level
SKILL.mdformat:validate-skills.rb'sALLOWED_FIELDS(name description license compatibility metadata allowed-tools) is unchanged, and no validator requires a manifest for a top-level<skill>/SKILL.md. Manifests are not registered as standalone skills in any catalog. - No mandatory bundle membership. Bundles remain optional composition layers. Top-level skills that belong to no bundle continue to validate, appear in catalogs, and are never flagged for lacking a manifest or bundle membership. No validator contains an error path of the form "must belong to a bundle".
- Capability descriptions stay in source. Each bundle's human-readable
capability description remains discoverable from source metadata (the
SKILL.mddescriptionfield and/or the manifestpurposefield), independent of the generated matrix. Deleting the generated matrix loses no capability description. - No unrelated refactors. This issue touches only the changed surface
listed in the PR:
{product-lifecycle,production-excellence, agent-production-operations}/**(additive manifest + doc rows),schemas/,scripts/,docs/, and.github/workflows/validate.yml.
6. Validation and generation
scripts/validate-bundles.rb— rejects incomplete manifests (missing required field, naming the file and field), contradictory manifests (unresolvableincluded_skills, handoff naming an undeclared output/stage, conflict naming a non-catalog skill), danglingeval_suitereferences, and undeclared cross-bundle overlaps on included skills (naming both manifests).scripts/gen-lifecycle-matrix.rb— deterministically generatesdocs/lifecycle-capability-matrix.md(one row per canonical bundle) anddocs/lifecycle-capability-matrix.json(machine-readable, per-cell source provenance), reusing thegen-*.rbgenerator conventions (ROOT,PUBLIC_SKILLS,YAML.safe_loadfrontmatter parsing,--writemode, check mode with aRun: ruby scripts/gen-lifecycle-matrix.rb --writehint).scripts/validate-lifecycle-matrix.rb— verifies the JSON artifact covers every canonical bundle, every populated cell traces to its source, the artifact is current, and nested bundle helpers never leak into the four generated catalogs.scripts/test-validate-bundles.rb— deterministic positive/negative test coverage for the validator, generator, and matrix validator..github/workflows/validate.yml— runs the new validator, tests, generator check, and matrix validator as part of the repository gate suite.