Skip to content

Commit 4e8dda6

Browse files
docs(vrs): correct the spec against what implementing it revealed
Building the model surfaced four defects and two divergences. Implementation is the cheapest review a spec gets, and it found things four readers did not. Defects, now fixed: - Divergence conflated a permanent fact with an open problem. A divergence can never be removed from a lineage, so a tool that cannot tell open from settled reports every past disagreement as outstanding forever — and a report that is always on carries no information. Open vs settled is now in the ontology (CMP.DM-R05a) rather than invented at the call site. - CMP-R22 contradicted the borrowed "content wins on mismatch" convention. Resolved in favour of rejection: identity is not a default, and a misfiled file admitted under no-delete replication is permanent. Compass departs from the convention here deliberately, and now says so (CMP.INT-R01a). - Retiring a Step silently strands its dependents forever. A consequence of retirement rather than a defect, but it was undocumented (CMP.DM-R05b). - Progress records cite a version, and under divergence several head members may carry the same Step. Left arbitrary, progress would itself become a source of divergence (CMP.DM-R11a). Divergences, recorded as deltas rather than papered over: - 02-artifacts DELTA-001 — CMP.FS-R11 requires repair and the CLI spec requires it be a separate command; no such command exists. - 05-integrations DELTA-001 — convergence is reported honestly as unknown on every command, because no substrate is queried. The guarantee that reads depend on is structurally correct and currently vacuous. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QzRc44KbA3wfYYKFF9UDMa agent-session-id: cdf2c185-eeb3-4a4d-8ce0-52885f145cac agent-tool: Claude Code agent-tool-version: 2.1.215 agent-model: claude-opus-4-8 agent-runtime-profile: /nix/store/acr8a3l2v366jgmwiq8xdrhgz1py0db5-coding-agent-runtime-profile/share/coding-agents/profile.json agent-skills-manifest: /nix/store/sj1v5j91h8v8d1w9lca4040302lwrd6v-agent-skills-corpus/share/agent-skills/manifest.json tooling-profile: dotfiles@unknown-dirty
1 parent f079e3d commit 4e8dda6

6 files changed

Lines changed: 128 additions & 5 deletions

File tree

context/01-data-model/requirements.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@
2929
Rationale. Nothing reconciles automatically, and a reconciliation may itself
3030
diverge. _refines: CMP-R03, CMP-R04._
3131

32+
- **CMP.DM-R05a Open divergence is distinguishable from settled.** A divergence
33+
is open until its sides share a descendant. Because a divergence is a
34+
permanent feature of the lineage, a system that cannot tell open from settled
35+
reports every past disagreement as outstanding forever — and a report that is
36+
always on carries no information. Only open divergence may prompt action.
37+
_refines: CMP-R04._
38+
39+
- **CMP.DM-R05b Retirement may strand dependents.** Retiring a Step that others
40+
depend on leaves them permanently unsatisfiable, because a retired Step never
41+
becomes accepted. This is a consequence of retirement, not a defect, but it
42+
must be visible at the moment of retirement rather than discovered later
43+
through readiness that never advances. _refines: CMP-R01._
44+
3245
- **CMP.DM-R06 An absent predecessor is not divergence.** A version whose
3346
predecessor is unknown must be distinguished from one that disagrees. The
3447
first ordinarily means state is still arriving; treating it as the second
@@ -61,6 +74,13 @@
6174
and never create a version. Correction is a further record, never an edit.
6275
_refines: CMP-R02._
6376

77+
- **CMP.DM-R11a Progress names one version, deterministically.** A record cites
78+
the version it was observed against. Under divergence there may be several
79+
head members carrying the same Step, so the choice must be deterministic and
80+
disclosed rather than arbitrary. A record whose cited version differs between
81+
two machines observing identical state would make progress itself a source of
82+
divergence. _refines: CMP-R04._
83+
6484
- **CMP.DM-R12 Acceptance is evaluable.** A Step's acceptance criterion is
6585
expressible in a form Compass can evaluate against recorded evidence. Prose
6686
may accompany it but is not the criterion, because readiness cannot fold over
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# DELTA-001: Repair has no command
2+
3+
Status: open
4+
5+
## Divergence
6+
7+
Damage can be detected but not repaired through a dedicated operation.
8+
9+
## VRS
10+
11+
[requirements.md](../requirements.md) CMP.FS-R11 requires that recovery from
12+
damage proceed by authoring new content that records the damage and continues
13+
from the last intact predecessor. [04-cli/spec.md](../../04-cli/spec.md) states
14+
that verification and repair are separate commands, and gives the reason:
15+
verification is safe to run anywhere, while repair authors permanent content
16+
that replication makes irreversible, so collapsing them would put the
17+
irreversible operation one keystroke from the safe one.
18+
19+
## Implementation
20+
21+
`compass verify` detects and reports rejected files and orphans. There is no
22+
`compass repair`. The repair *path* exists — an operator can author a
23+
damage-recording version with `compass revise` — but it is neither named,
24+
guided, nor distinguished from ordinary revision, so nothing enforces the
25+
separation the spec relies on.
26+
27+
## Direction
28+
29+
update implementation
30+
31+
## Resolution Signal
32+
33+
A distinct command authors a damage-recording version: it identifies the last
34+
intact predecessor, requires a Rationale, records which versions are
35+
unverifiable and why, and refuses to run when verification reports nothing
36+
wrong. Verification remains read-only.

context/02-artifacts/spec.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,14 @@ unwritten.
8888

8989
## Discovery
9090

91-
The catalog is walked and files are admitted per the rules above. Path segments
92-
may supply defaults; content wins on disagreement.
91+
The catalog is walked and files are admitted per the rules above.
92+
93+
Path segments may supply values the content omits. They do not override
94+
identity: where content and location disagree about *which* Plan a version
95+
belongs to, or where content disagrees with the hash in its name, the file is
96+
rejected rather than reinterpreted. The borrowed catalog convention resolves
97+
such disagreements in favour of content; Compass departs from it here, because
98+
a misfiled file admitted under no-delete replication is permanent.
9399

94100
Discovery parses every candidate file to classify it, which bounds catalog size
95101
to what can be scanned in interactive time (CMP-A03). The threshold is
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# DELTA-001: Convergence is always unknown
2+
3+
Status: open
4+
5+
## Divergence
6+
7+
The convergence guarantee is structurally correct and currently vacuous. Every
8+
command reports `unknown (no sync configured)`, and will do so regardless of
9+
what the replication substrate is actually doing.
10+
11+
## VRS
12+
13+
[requirements.md](../requirements.md) CMP.INT-R06 requires the
14+
converged-or-arriving signal to come from the replication mechanism's own state.
15+
CMP.INT-R07 requires Compass to confirm the declared replication carries
16+
no-delete semantics. Root CMP-R05 makes observable convergence a property of the
17+
system, and it is the correction that
18+
[decision 0002](../../.decisions/0002-plans-are-immutable-versions-with-a-derived-head.md)
19+
Amendment 1 introduced in response to the derived head removing the only
20+
completeness signal.
21+
22+
## Implementation
23+
24+
Compass reports convergence on every command and reports it honestly as unknown.
25+
No declaration to a replication mechanism is made, no substrate is queried, and
26+
no policy is verified. The honest report is the whole implementation.
27+
28+
## Direction
29+
30+
update implementation
31+
32+
## Resolution Signal
33+
34+
Compass declares its catalog to the replication substrate, queries it for
35+
convergence, and reports settled, arriving, or unknown from that answer rather
36+
than by default. Policy verification reports a delete-propagating configuration
37+
as a misconfiguration. Until then the reported `unknown` is accurate, and the
38+
guarantee that reads depend on remains unrealized.
39+
40+
## Note
41+
42+
The declaration must cover the catalog recursively (CMP.INT-R04). A path filter
43+
that does not cross directory separators propagates nothing for this layout
44+
while reporting itself healthy — a silent failure already observed in an
45+
adjacent consumer of the same substrate.

context/05-integrations/requirements.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,19 @@
1717
## Requirements
1818

1919
- **CMP.INT-R01 Adopt the catalog form, do not restate it.** Content-based
20-
discovery, path segments supplying defaults with content winning, and
21-
retirement as an authored flag are conventions Compass follows. It must not
22-
publish a competing definition of them.
20+
discovery, path segments supplying defaults, and retirement as an authored
21+
flag are conventions Compass follows. It must not publish a competing
22+
definition of them.
2323
_refines: CMP-R06, CMP-R08._
2424

25+
- **CMP.INT-R01a Identity is not a default.** The borrowed convention that
26+
content wins over path applies to values a path may supply when content omits
27+
them. It does not extend to identity: a file whose content disagrees with the
28+
location or name that identify it is rejected, not reinterpreted. Compass
29+
diverges from the convention here deliberately, because under no-delete
30+
replication a misfiled file cannot be removed once admitted.
31+
_refines: CMP-R07._
32+
2533
- **CMP.INT-R02 Define only the document.** What a version and a progress record
2634
contain — lineage, identity, the required Rationale, the field set — is
2735
Compass's own. No existing contract covers it, and Compass must not push it

context/ontology.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ _Avoid_: current pointer, HEAD file, latest symlink
4040
Two or more Plan Versions sharing the same predecessor — the observable result
4141
of concurrent revision on different machines. Divergence is a legitimate state,
4242
not an error: both versions survive replication and both are visible.
43+
44+
A Divergence is **open** while its sides have no common descendant, and
45+
**settled** once a Reconciliation descends from all of them. The distinction is
46+
load-bearing rather than cosmetic: a Divergence is a permanent fact of the
47+
lineage and can never be removed, so a tool that does not distinguish the two
48+
reports every historical disagreement as an outstanding problem forever, and
49+
operators learn to ignore the report. Only an open Divergence asks anything of
50+
anyone.
4351
_Avoid_: conflict, collision, fork
4452

4553
**Orphan**:

0 commit comments

Comments
 (0)