unitbob 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unitbob",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
4
4
  "description": "Unitbob connector — thin local hands for the Unitbob Rails brain. Owns no domain logic: it runs tools, relays bytes over the wire, and prints what the server returns.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -21,7 +21,7 @@ markers, or paths. Do not edit production code, host-owned shared files, the
21
21
  connector-owned harness, or another slice.
22
22
 
23
23
  After every owned edit, run
24
- `npx -y --loglevel=error unitbob@0.5.1 run-local <branch>` and inspect the machine
24
+ `npx -y --loglevel=error unitbob@0.6.1 run-local <branch>` and inspect the machine
25
25
  report. Look only at examples or scenarios matching your owned paths or case
26
26
  markers. Do not require a green exit code from the whole branch: foreign failures
27
27
  and an already-confirmed product red do not widen your scope. Repeat the bounded
@@ -48,9 +48,13 @@ No strict JSON handoff is required.
48
48
  Update the same checkpoint as promises complete. Keep facts compact and
49
49
  source-referenced. The normative JSON shape of one facts entry is:
50
50
  ```json
51
- {"fact":"The route creates an order.","source_refs":["app/orders.rb:12"]}
51
+ {"fact":"The route creates an order.","source_refs":["app/orders.rb:12"],"established_by":"read"}
52
52
  ```
53
- Every facts entry is an object in that shape, never a string. Before handoff,
53
+ Every facts entry is an object in that shape, never a string; `established_by` is
54
+ `read` or `ran: <command>`, and a failure you reproduced is the second kind. On
55
+ the behavioral branch, when you rename a Scenario or change what its steps drive,
56
+ update that Scenario's `surface_coverage` entry in the same breath — the
57
+ coordinator publishes those entries and does not reread your steps. Before handoff,
54
58
  make one final read of the checkpoint and confirm every `facts` entry is an
55
59
  object in the normative shape above. Do not delegate repair or auto-resume after
56
60
  the fuse. Preserve files and checkpoint for the coordinator's existing
@@ -21,21 +21,46 @@ nothing to put in them: `written_paths` (only your own `owned_paths`),
21
21
  unresolved harness problems). A missing array is not an empty one — the gate
22
22
  that reads this checkpoint refuses it either way.
23
23
 
24
- Facts are short statements with source references.
25
- The normative JSON shape of one facts entry is:
24
+ Facts are short statements with source references, and each one says how it was
25
+ established. The normative JSON shape of one facts entry is:
26
26
  ```json
27
- {"fact":"The route creates an order.","source_refs":["app/orders.rb:12"]}
27
+ {"fact":"The route creates an order.","source_refs":["app/orders.rb:12"],"established_by":"read"}
28
28
  ```
29
- Every facts entry is an object in that shape, never a string. Never embed source
30
- files, suite copies, or transcript.
29
+ Every facts entry is an object in that shape, never a string. `established_by` is
30
+ `read` when the references are what establishes it, or `ran: <command>` when
31
+ something was executed and its result observed. You run nothing, so every fact
32
+ you add yourself is `read`; a `ran:` fact is one the coordinator established
33
+ before fan-out, and that is exactly what makes it worth more than a fact anybody
34
+ read. Never embed source files, suite copies, or transcript.
35
+
36
+ On the behavioral branch your checkpoint also carries `surface_coverage`: one
37
+ entry per Scenario you write, recorded as you write it.
38
+ ```json
39
+ {"capability_id":"<one of your plan item's ids>","scenario":"<exact Scenario name>","surfaces":["POST /orders"]}
40
+ ```
41
+ `surfaces` names the addresses and jobs the Scenario's `When` really reaches — not
42
+ the ones its capability was assigned, and not the ones you meant to reach. Only
43
+ you can know this: the coordinator publishes this join and never reopens your step
44
+ files. On a2time, 2026-08-17, it had to reconstruct the join from what the workers
45
+ said about their work; the independent reviewer read the steps instead, six
46
+ Scenarios claimed addresses their steps never drove, and the server refused the
47
+ publication.
31
48
 
32
49
  Write first, then find out. Start with the planned cases your seeded facts
33
50
  already support and get them onto disk; go reading only for what you still lack
34
51
  after that. The opposite order — survey the sources, then write — is what spent
35
52
  seven of eight workers' entire ceilings on a2time, 2026-08-10, and produced no
36
- file at all. A fact already in your checkpoint is settled: do not establish it a
37
- second time. Nothing mechanical enforces that rule; it holds because you keep
38
- it.
53
+ file at all.
54
+
55
+ A fact already in your checkpoint is settled: do not establish it a second time.
56
+ A `read` fact is settled the same way — until a file you had to open anyway says
57
+ otherwise. Then check that one fact against its own `source_refs`, which is two
58
+ or three lines and not a fresh survey; if it is wrong, correct the entry and say
59
+ so in `known_problems`. On a2time, 2026-08-17, a seeded fact said a dismissed
60
+ employee cannot sign in — one method read, another remembered — and sixteen
61
+ workers got it as verified. One of them looked, disagreed, and kept its scenario
62
+ honest, which is the only reason that access hole came back red instead of green.
63
+ Nothing mechanical enforces any of this; it holds because you keep it.
39
64
 
40
65
  Read only the `source_paths` and dependencies your finite planned cases need.
41
66
  Ask closed questions with the files to look in. For a closed missing fact, use