a-promoted-record-opens-its-message — Every record promoted from a workspace cites the message it came from, and the UI opens it for the operator who holds it
A typed workspace: reference on every record kind, valid in every checkout, resolvable where the store is held, drawn as a link on /ui and as text on the published site.
PLANNED 0 of 5 issues done
- ready
- 1
- blocked
- 4
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
The ChatGPT import promotes intents, ADRs, milestones, issues and knowledge with `conversation#message` sources, but the plan schemas carry no provenance at all and the shared Provenance grammar has no reference type for a workspace message, so the drill-back exists only in the writer's scratch files. Proposed in ADR 0211 (A record promoted from a workspace cites the message it came from by a typed reference that validates in every checkout and resolves only where the store is held) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c267#2, chatgpt-majordomus:c267#0, chatgpt-majordomus:c239#0.
Outcome
A typed workspace: reference on every record kind, valid in every checkout, resolvable where the store is held, drawn as a link on /ui and as text on the published site.
Current state
Verified on master 707a04c: adr.v1 admits provenance derived_from ^(decision|session|commit|issue|file|test):.+$, knowledge.v1 adds task: and resolves decision, session and task references against the ledger, and the two origin semantics differ; intent, milestone and issue schemas have no provenance field; no schema under share/schemas uses a cross-file $ref; ui/prose.rs links known record ids only. The 2026-10-18 import wrote its sources only as prose chatgpt-majordomus:<conversation>#<n> references.
Desired state
workspace:chatgpt-majordomus/<conversation>#<message> validates everywhere, resolves locally, opens the message from /ui, and the 2026-10-18 positional references are pinned to message ids.
Scope
- share/schemas/majordomus
- apps/majordomus-cli/src/plan.rs
- apps/majordomus-cli/src/capability/builtin
- apps/majordomus-cli/src/ui
- docs
Out of scope
- Storing or summarising conversation text in any tracked record
- Publishing message text
Acceptance criteria
- Five record kinds carry provenance from one reference grammar, inlined per kind at generate time
- A workspace reference validates in a clone with no store
- /ui opens the cited message where the store exists, for a loopback caller only
- Zero positional references remain, typed or in prose
Validation
- majordomus plan validate
Risks
- A reference that resolves only against local state fails every other checkout (adopter report 2026-10-18, task: references); validity must be structural
- Decided by the owner on 2026-10-18: a public record cites a local alias (chatgpt-majordomus:cNNN#n) and the alias-to-conversation map stays in the operator's own store; a typed reference must keep that property.
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 |
|---|---|---|---|---|
| I3280 | READY | 0 | — | An intent, a milestone and an issue carry provenance the way an ADR and a knowledge record do |
| I3281 | BLOCKED | 1 | I3280, I1301 | A workspace message is a typed provenance reference that validates in every checkout without the store |
| I3282 | BLOCKED | 4 | I3281, I1308 | A workspace reference resolves to its message where the store holds it, and says 'not held here' where it does not |
| I3283 | BLOCKED | 5 | I3282, I1309 | The UI opens the message a record cites, and the published snapshot shows only the reference |
| I3284 | BLOCKED | 6 | I3278, I3279, I3281, I1304 | Every reference the 2026-10-18 import wrote is pinned to the upstream message it meant |
The graph
flowchart LR
I3280["I3280<br/>An intent, a milestone and an issue carry provenance the way an ADR and a knowledge record do"]:::ready
I3281["I3281<br/>A workspace message is a typed provenance reference that validates in every checkout without the store"]:::blocked
I3282["I3282<br/>A workspace reference resolves to its message where the store holds it, and says 'not held here' where it does not"]:::blocked
I3283["I3283<br/>The UI opens the message a record cites, and the published snapshot shows only the reference"]:::blocked
I3284["I3284<br/>Every reference the 2026-10-18 import wrote is pinned to the upstream message it meant"]:::blocked
I3280 --> I3281
I3281 --> I3282
I3281 --> I3284
I3282 --> I3283
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 (5)
- I3280 An intent, a milestone and an issue carry provenance the way an ADR and a knowledge record do
- I3281 A workspace message is a typed provenance reference that validates in every checkout without the store
- I3282 A workspace reference resolves to its message where the store holds it, and says 'not held here' where it does not
- I3283 The UI opens the message a record cites, and the published snapshot shows only the reference
- I3284 Every reference the 2026-10-18 import wrote is pinned to the upstream message it meant
Canonical record: .ai/repo/project/milestones/a-promoted-record-opens-its-message.yaml. Read it back with majordomus plan show a-promoted-record-opens-its-message.