Reference
Pointer, meta and generated
The files around the record set: the pointer that resolves the store, the calendar-year archive that holds rotated records, and the generated DECISIONS.toml projection. Choose one to see what it holds.
Pointer
The store pointer
.opf.toml
committed
product repository root
The committed pointer that names where the store repository lives: the one file whose content legitimately differs between store topologies.
Template
A single [store] table. target = "dir:." is the default written by opf init. The standard defines four target forms: dir:<path> or an absolute bare path; git:<url> or a bare git URL; github:<owner/repo>; and gitlab:<owner/repo>. The host forms are specified creation conveniences that resolve to ordinary git URLs. The reference resolver recognizes remote forms but cannot resolve them without clone or sync support; it currently resolves local stores only. Relative dir: paths resolve against the product repository root; other filesystem paths must be absolute.
Resolution tries the local override, then the committed pointer, then the default location when neither pointer exists. No pointer and no default store is the not-adopted state, and opf init is the remedy. The standard requires relocation to update the pointer and recorded sync target together; opf migrate is planned in the reference CLI. The pointer is control data and has no generated view.
The problem it solves
The store's location is configuration, not architecture.
A stale pointer aimed at the wrong store would be worse than no pointer, so resolution is validated every time and fails closed: a pointer that does not resolve stops the tool and never falls back silently to the default location.
- Declares
-
Where the store repository lives: a
[store]table whosetargetisdir:.by default (the store rides this repository at.working/), or any location a target can name after relocation. - Read by
-
opf initopf renderopf doctorCreated by
opf initwithtarget = "dir:.", refusing an existing pointer; updated byopf migrate(planned; not yet implemented in the reference CLI) in the specified relocation flow. Implemented store readers use it for resolution;opf doctorchecks pointer and sync-target agreement. - Committed
-
Yes: this is the one tracked marker. Because the committed pointer must be safe to publish, anything machine-local or private-only belongs in the uncommitted
.opf.local.tomloverride, which is resolved first and never committed.
What it protects
Explicit store resolution
The intended benefit is an explicit store location. A pointer that fails resolution stops the reader; resolving a valid pointer does not establish that its author chose the intended store.
Archive
The archive
archive.toml
one per calendar year
.working/toml/archive/<YYYY>/
One rotation manifest per calendar-year bucket: rotation is relocation, never deletion, and never ID reuse.
Template
A closed three-key shape: schema, moved (rows of {id, type, destination}), and worklog_moved (rows of {span, destination}). Rotated records and worklog entries remain in the archive. Coverage checks read active and archived entries together; rotation must preserve released coverage and counter high-water marks. The standard requires indefinite retention by default, with archival policy recorded as a maintainer decision rather than record deletion. Archived records remain inputs to integrity and coverage checks.
The problem it solves
Active indexes should stay small without history getting quietly thinner.
Rotation records enumerate moved IDs. Validation checks their destinations and the active/archive partition; these checks are intended to expose missing or duplicated records within their observed inputs.
- Records
-
Every rotated ID as a row of
{id, type, destination}, and every moved worklog span as a row of{span, destination}, each carrying where it went. - Written by
-
Created by the first rotation into a year bucket (never scaffolded); updated by the rotation process, appending the moved IDs and spans.
- Validated by
-
opf doctorRead by
opf doctorfor archive integrity, the exactly-one-location rule, and ID partition, and by every coverage gate, which reads active and archive together. - Invariant
-
Rotation is enumerated relocation, never deletion and never ID reuse. Records in unqualified terminal states may rotate on manifest-declared age or size thresholds; open records, active blocks, unresolved decisions and fragments, unexpired waivers, the current handoff, and the unreleased worklog tail never rotate, and worklog spans rotate only under the release rule, once released and frozen.
What it protects
Retain history while reducing active indexes
Rotation is intended to keep active indexes smaller while preserving history. Enumeration and partition checks validate the recorded movement; they do not measure read performance.
Generated projection
The decisions projection
DECISIONS.toml
generated, machine-readable
.working/
The machine projection, generated at .working/DECISIONS.toml and rendered from the four decision types: uppercase because it is output, never hand-authored truth.
Template
The payload (projection contract v1) carries schema = 1 and projection = "decisions"; four arrays of tables, one per source type, each row sorted by numeric ID and projecting the full base record with x-<vendor> extension tables excluded as profile-owned data; and one [derived] table carrying the decision-resolution join's output (the effective and superseded pending-decision IDs, numerically sorted) and nothing beyond the closed transform vocabulary. The do-not-edit header is a leading TOML comment block naming sources, schema and generator versions, a source-set digest, and the regeneration command, with no timestamp.
The determinism requirements apply verbatim: UTF-8, LF, stable ordering, no locale-dependent sorting, no wall-clock content, no network access, and no model involvement. Advisory activity over a projection, an assistant-side prediction, dedup, or pattern-spotting pass, is a read-time activity outside the generator: the generator invokes no model and adds no model-generated interpretation. The views it renders reproduce the declared source records, so content those records carry, including assistant-authored text, still needs review.
The problem it solves
A machine consumer of the decision record should not have to parse Markdown, read four indexes, and re-derive the supersession chain itself.
The projection gives it one deterministic file with the join already computed, under exactly the same render, drift, and doctor gates as any declared view, with no new gate. It is a third generated-output class beside the deterministic views and the curated changelog.
- Rendered from
-
pending_decisionautonomous_decisionmaintainer_decisionpreference_patternProjected from the four decision source types, one array of tables per type, with the decision-resolution join already computed. Never hand-edited: it is generated output, not a source.
- Kind
-
A machine projection: a deterministic, byte-drift-gated TOML deliverable, the machine counterpart to the composed
DECISIONS.mdview. It is one of the thirteen outputs the scaffolded manifest declares, rendered beside that view from the same four sources. - Gated by
-
opf renderopf doctorCreated by
opf render --writeafter source-integrity checks. Post-write validation checks source integrity and regenerated outputs; disagreements trigger a rollback attempt, with failures reported. Other deliverable failures can still cause a nonzero exit. Hand edits are byte drift checked byopf render --checkandopf doctor; machine consumers read the generated projection.
What it protects
One resolution, not many divergent ones
The projection provides the decision-resolution join in a machine-readable file. Its intended benefit is to let consumers reuse that result instead of implementing the supersession walk themselves.