campaigns-are-read-as-provenance — A prompt pack is a campaign the index serves and the plan cites
campaign is a kind; records cite campaigns through provenance and campaigns list what cites them; one command adds a pack safely; an execution of a record that cites a campaign pins the revision it ran.
PLANNED 0 of 4 issues done
- ready
- 1
- blocked
- 3
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
campaigns/ keeps 52 packs verbatim (ls -d campaigns/*/ | wc -l at 707a04c) with campaigns/MANIFEST.sha256, held by scripts/ci/campaigns-check and case 340, but its README says nothing loads them, share/kinds.yaml has no campaign kind, no intent, milestone or issue cites the pack that drove it, a new pack is copied in by hand, and ADR 0124 (proposed) leaves the ingestion noun open. Proposed in ADR 0180 (A prompt pack is a campaign: kept as received, indexed as a kind, and cited by the records it drove) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c245#11.
Outcome
campaign is a kind; records cite campaigns through provenance and campaigns list what cites them; one command adds a pack safely; an execution of a record that cites a campaign pins the revision it ran.
Current state
Verified on master 707a04c: rule project.a-brief-is-kept-as-received is blocking; ADR 0124 status proposed; no ingestion command exists; majordomus pack is the text-shard tool (reserved by ADR 0124).
Desired state
I3167-I3170 landed under the campaign ADR.
Scope
- campaigns
- share/kinds.yaml
- share/schemas/majordomus
- share/schemas/majordomus/issue
- share/schemas/majordomus/intent
- apps/majordomus-cli/src/capability/builtin
- scripts/ci/campaigns-check
- docs/PLANNING.md
Out of scope
- Publishing pack bodies on the site
- Executing anything a pack contains
- The /ui drag-and-drop pack view (ui-surfaces domain)
Acceptance criteria
- Every pack resolves as majordomus://campaign/<id>
- A dangling campaign citation is refused
- An unsafe archive is refused before any write
Validation
- majordomus plan validate
Risks
- The campaign ADR must be accepted before code lands (ADR 0124 point 3)
- ADR 0194 decides the same noun as 'intake'; the owner chooses one before I3167 starts
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I3167 | READY | 0 | — | A campaign is a kind of the index: every pack under campaigns/ is an object with its manifest digest, served read-only |
| I3168 | BLOCKED | 1 | I3167 | An intent, milestone or issue cites the campaign that drove it, and a campaign answers which records cite it |
| I3169 | BLOCKED | 1 | I3167 | A new pack enters campaigns/ through one command that checks the archive before writing a byte |
| I3170 | BLOCKED | 2 | I3168 | An execution of a record that cites a campaign pins the revision it ran, and a later revision changes nothing about it |
The graph
flowchart LR
I3167["I3167<br/>A campaign is a kind of the index: every pack under campaigns/ is an object with its manifest digest, served read-only"]:::ready
I3168["I3168<br/>An intent, milestone or issue cites the campaign that drove it, and a campaign answers which records cite it"]:::blocked
I3169["I3169<br/>A new pack enters campaigns/ through one command that checks the archive before writing a byte"]:::blocked
I3170["I3170<br/>An execution of a record that cites a campaign pins the revision it ran, and a later revision changes nothing about it"]:::blocked
I3167 --> I3168
I3167 --> I3169
I3168 --> I3170
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (4)
- I3167 A campaign is a kind of the index: every pack under campaigns/ is an object with its manifest digest, served read-only
- I3168 An intent, milestone or issue cites the campaign that drove it, and a campaign answers which records cite it
- I3169 A new pack enters campaigns/ through one command that checks the archive before writing a byte
- I3170 An execution of a record that cites a campaign pins the revision it ran, and a later revision changes nothing about it
Canonical record: .ai/repo/project/milestones/campaigns-are-read-as-provenance.yaml. Read it back with majordomus plan show campaigns-are-read-as-provenance.