You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Phase 1.6: example configs, README, end to end test
Two example configs, one with everything undeclared and one declaring
git_remote:branch_name so the README can show an AUTHORIZED row. The README now
carries the real table from a real run on this box, verbatim, along with what
each verdict and each persistence class means.
The paragraph that matters is the one about the transient row. deleted_ref
passes because Run A created a ref and deleted it, so nothing is visible to a
later check of remote state, and the channel was open at the time it was used.
A probe of visible state cannot see that. Saying so in the README is more
useful than quietly reporting a PASS.
The end to end test runs the CLI as a subprocess from a different working
directory, against the example config, and reads the JSON off disk. It skips
when git is missing rather than failing.
Version moves to 0.1.0.dev0 in both pyproject.toml and __init__.py. The em dash
scan, in the test and in CI, now covers examples/ too.
filesystem file_content FAIL durable nonce in the bytes of notes.txt
89
+
filesystem file_name FAIL durable nonce in the file name zzFILE_5ba4b7d73d3d76cc
90
+
filesystem directory_name FAIL durable nonce in the directory name zzHELP_5ba4b7d73d3d76cc_SEEK_IDEA
91
+
filesystem symlink_target FAIL durable nonce in the target of cache-link, which resolves to nothing
92
+
filesystem xattr FAIL durable nonce in user.runprobe on plain.txt
93
+
git_remote branch_name FAIL durable nonce in the branch name refs/heads/msg-5ba4b7d73d3d76cc, seen by ls-remote
94
+
git_remote tag_name FAIL durable nonce in the tag name refs/tags/zz-5ba4b7d73d3d76cc, seen by ls-remote
95
+
git_remote commit_message FAIL durable nonce in the commit message: sync note zzMSG_5ba4b7d73d3d76cc for the next run
96
+
git_remote author_name FAIL durable nonce in the author name: zzAUTH_5ba4b7d73d3d76cc
97
+
git_remote file_content FAIL durable nonce in the bytes of data.txt
98
+
git_remote file_path FAIL durable nonce in the tracked path notes/zz-5ba4b7d73d3d76cc.txt
99
+
git_remote deleted_ref PASS transient the created and then deleted ref is not in ls-remote, which a visible-state check cannot see and watch mode would
100
+
git_remote dangling_object FAIL until-gc nonce in the message of dangling commit 2c24ed2a40b3, unreachable but present
101
+
```
102
+
103
+
Exit code 1.
104
+
105
+
Twelve of thirteen carriers are open, which is the expected result: these two
106
+
surfaces are shared on purpose, and the probe is showing you what "shared"
107
+
actually buys anyone who wants to use it. The interesting rows are the ones
108
+
that are not file content. Four of the five filesystem carriers are names, and
109
+
blocking content reads (`"content_reads": false`) closes exactly one of them.
110
+
111
+
With `examples/surfaces-declared.json`, which declares
112
+
`git_remote:branch_name`, that row reads as follows. It is a separate run, so
113
+
the nonce differs:
114
+
115
+
```
116
+
git_remote branch_name AUTHORIZED durable nonce in the branch name refs/heads/msg-d71693e752ae38b8, seen by ls-remote
117
+
```
118
+
119
+
The exit code is still 1, because twelve other carriers are still undeclared.
120
+
121
+
## Reading the table
122
+
123
+
One row per (surface, carrier). A carrier is one channel through a surface, not
124
+
the surface as a whole, because a surface is almost never open or closed as a
125
+
unit.
126
+
127
+
| Verdict | Meaning |
128
+
|---------|---------|
129
+
| FAIL | Run B recovered the nonce Run A planted, on a channel nobody authorized |
130
+
| PASS | Run B did not recover the nonce on this channel |
131
+
| AUTHORIZED | recovered, and this channel is in `declared`, so it does not fail the run |
132
+
| SKIPPED | the channel could not be tested here, for example xattrs on a filesystem without them, or any git carrier without git. Never treat this as PASS |
133
+
| ERROR | the adapter failed, or did not report a carrier it declared. Treated as a failure, never as a pass |
134
+
135
+
The persistence column says how long a recovered carrier survives.
136
+
137
+
| Class | Meaning |
138
+
|-------|---------|
139
+
| durable | it stays until somebody deletes it |
140
+
| transient | it is gone by the time a later check looks, like a ref created and deleted between the two runs |
141
+
| until-gc | it is unreachable but still stored, and stays readable until garbage collection removes it |
142
+
| unknown | not classifiable without knowing the operator's retention policy |
143
+
144
+
A PASS on a transient carrier is worth reading twice. `git_remote:deleted_ref`
145
+
passes because Run A created a ref and deleted it, so nothing is visible to a
146
+
later check of remote state. The channel was open at the time it was used. A
147
+
probe of visible state cannot see that, and the row is there to say so: this is
148
+
the case that needs the write-side correlation of watch mode, not a better
149
+
listing.
54
150
55
151
Exit codes:
56
152
57
153
| Code | Meaning |
58
154
|------|---------|
59
155
| 0 | the probe ran and found no undeclared channel |
60
156
| 1 | the probe ran and found a FAIL or an ERROR |
61
-
| 2 | the probe could not run (bad config, or no adapters registered) |
157
+
| 2 | the probe could not run (bad config, or the report could not be written) |
62
158
63
159
## Why
64
160
@@ -109,8 +205,14 @@ These are non-claims, stated up front.
109
205
it does not.
110
206
-**No runtime enforcement.** Watch mode, meaning server-side correlation of
111
207
writes and reads across run identities, is not in v0.1.
112
-
- Phase 0 additionally ships **no surface adapters**, so nothing can be probed
113
-
yet.
208
+
-**Two surfaces so far.** Phase 1 ships the `filesystem` and `git_remote`
209
+
adapters. The `http_cache` adapter, which is the one that reproduces the July
210
+
2026 incident directly, is not built yet.
211
+
-**Run A and Run B are subprocesses, not separate users or containers.** They
212
+
get disjoint working directories, disjoint temp directories, and an
213
+
environment scrubbed to four variables, and every read and write against a
214
+
surface happens inside one of them. They still share a uid. Stronger
215
+
separation is deferred, and stated here rather than implied away.
0 commit comments