I1302 — Identity, provenance and support level are typed fields, not prose
Define the record model every synced item carries: upstream identity, local identity, content hash, the transport that produced it, the acquisition mode, the support level and the tombstone, as a schema with a version, before any adapter writes a byte.
READY wave 1 · p0 · deep-work profile · parallel safe
Ready. Every dependency is done, so majordomus plan start I1302 will be accepted.
Objective
Define the record model every synced item carries: upstream identity, local identity, content hash, the transport that produced it, the acquisition mode, the support level and the tombstone, as a schema with a version, before any adapter writes a byte.
Why
The pack this milestone came from is right about one thing above all: raw observation, normalised entity and derived knowledge are three different things, and a corpus that confuses them cannot be re-synced, re-checked or believed. A title is not an identity. A record that does not say how it was acquired cannot be told apart from a guess.
Current state
Nothing exists. The repository's own kinds compute identity generically from declared fields (index.rs identity_of) and that mechanism does not reach local content.
Desired state
One versioned schema describes a synced record: `upstream_id` as the vendor gave it, a local identity derived from vendor and upstream id and never from a title, a content hash over the normalised body, `transport` (official, browser, private_http), `acquisition` (push, stream, websocket, browser_observed, poll), `support` (official, browser_observed, private, derived), first-seen and last-seen stamps, and a tombstone that marks a record gone upstream rather than deleting it.
Scope
- share/schemas
- docs
Out of scope
- Any adapter or transport implementation
- Any vendor-specific field; ChatGPT's own shape is I1307
- Placing the schema file under share/schemas/ before something reads it. The schema-integrity doctrine refuses a schema that nothing applies, and nothing reads a workspace record until the syncer (I1306) or the reader capability (I1308) exists, so the file lands in the same change as its first reader rather than ahead of it.
Dependencies
What waits on this
- I1303BLOCKED The store is bounded, measured and invisible to every published projection
- I1304BLOCKED The browser transport is the one this repository already drives
- I1307BLOCKED The ChatGPT shape is mapped from evidence and never becomes the canonical model
Acceptance criteria
- A local identity is reproducible from vendor and upstream identity alone and never depends on a display title
- Every record states its transport, its acquisition mode and its support level as enumerated values
- A content hash distinguishes a changed record from a re-observed one
- A record gone upstream is tombstoned with a stamp, never removed silently
- The schema carries a version and an unknown version is refused rather than parsed
Validation
- bash test/run.sh
- majordomus generate --check
Evidence required
- identity_reproducible
- provenance_typed
- tombstone_semantics
- schema_versioned
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Risk
Over-modelling. The enumerations must be the ones a consumer actually branches on; a taxonomy nobody reads is a cost with no reader.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I1302.yaml. Read it back with majordomus plan show I1302.