Skip to content

Commit 7ca58e4

Browse files
author
gluck
committed
docs: strip em dashes from plans/
1 parent 8565016 commit 7ca58e4

37 files changed

Lines changed: 1063 additions & 1063 deletions

‎plans/api-coherence.md‎

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# API Coherence — the RPC surface, and the CLI's dependence on it
1+
# API Coherence: the RPC surface, and the CLI's dependence on it
22

33
Opened 2026-08-21 by 44754e14 (forked from ede92072), at Gluck's request:
44
"reorganize and consolidate and simplify the rpc api design and the cli's
@@ -7,7 +7,7 @@ form / aria is attended".
77

88
## 1. The prior art, found and dated
99

10-
**`plans/rpc-surface-tightening.md`, commit `fd83b09a`, 2026-05-05** — one of
10+
**`plans/rpc-surface-tightening.md`, commit `fd83b09a`, 2026-05-05**, one of
1111
four A/B/C/D refactor plans (inbox, rpc, dead-code, bootstrap). Its thesis:
1212

1313
> Shrink the figaro JSON-RPC surface to its minimum viable shape: five
@@ -21,12 +21,12 @@ interface so dispatch left `protocol.go`.
2121

2222
**It landed.** `figaro.qua` is the wire name today; `SetModel`/`SetLabel` are
2323
gone; `internal/figaro/server.go` owns the method table; the figaro-side
24-
`protocol.go` is **14 lines** — the plan hoped for ~60.
24+
`protocol.go` is **14 lines**, the plan hoped for ~60.
2525

2626
**Then the plan was deleted** by `4b5f40b7` (2026-05-10, "migrate plans/ and
27-
docs/ to figaro-la/docs"). It is on no branch of this repo. Its sibling — the CLI architecture dossier added by `1cffcaaf`, deleted in
27+
docs/ to figaro-la/docs"). It is on no branch of this repo. Its sibling, the CLI architecture dossier added by `1cffcaaf`, deleted in
2828
the same migration, and named here by revision because the path no longer
29-
resolves (`git show 1cffcaaf --stat`) — is what produced `cmdkit` and
29+
resolves (`git show 1cffcaaf --stat`), is what produced `cmdkit` and
3030
router-based dispatch.
3131

3232
**And the surface re-accreted.** Five methods on the figaro socket in May;
@@ -42,7 +42,7 @@ today:
4242

4343
The tightening was done once and has not been done since. This plan is the
4444
second pass, and its job is to leave behind a *rule* that makes a third pass
45-
unnecessary — the May plan left a shape, not a law, so the shape drifted.
45+
unnecessary, the May plan left a shape, not a law, so the shape drifted.
4646

4747
## 2. Where the incoherence actually is
4848

@@ -57,7 +57,7 @@ Three reads exist on both sockets:
5757
| the durable board | `aria.form` | `figaro.form` |
5858

5959
The daemon already routes: `rpc.MethodNeedsAgent` plus `hub.go:260` serve a
60-
read from the store when no agent is live. **The CLI routes too** — it picks
60+
read from the store when no agent is live. **The CLI routes too**, it picks
6161
`acli.AriaPage` or `fcli.Read` at the call site. So a client must know whether
6262
an agent is live, which is the one fact the daemon exists to hide, and the
6363
routing rule lives in two places that can disagree.
@@ -74,12 +74,12 @@ Measured from the call sites today:
7474

7575
| verb | does this shell end up attending? | where the rule lives |
7676
|---|---|---|
77-
| `fig new` / bare prompt, unbound shell | **yes** — unbind, then create-and-bind | `prompt.go:64-74` |
78-
| `fig form new` | **no** — "mints an unbound form" | `form_family.go:24` |
77+
| `fig new` / bare prompt, unbound shell | **yes**, unbind, then create-and-bind | `prompt.go:64-74` |
78+
| `fig form new` | **no**, "mints an unbound form" | `form_family.go:24` |
7979
| `fig fork` (own bound aria) | **yes**, unless `--stay` | `fork.go:185` |
80-
| `fig fork <someone else's>` | **no** — "a fan-out never steals this shell" | `fork.go:186` |
80+
| `fig fork <someone else's>` | **no**, "a fan-out never steals this shell" | `fork.go:186` |
8181
| `fig cast @role` that mints | **yes**, unless `--stay` | `cast_new.go:123` |
82-
| `fig cast` from an attended form | **yes** — mints an aria "to play it" | `cast_new.go:193` |
82+
| `fig cast` from an attended form | **yes**, mints an aria "to play it" | `cast_new.go:193` |
8383
| `fig attend <id>` | **yes**, and refuses when binding is off | `manage.go:895` |
8484

8585
Five rules, five sites. The tell is `restoreAttendance`, whose own comment
@@ -110,22 +110,22 @@ it is Gluck's.
110110
*client-facing* names. The angelus keeps ONE entry point per read verb, and
111111
`MethodNeedsAgent` + the hub stay the only router. The CLI loses its
112112
`acli` vs `fcli` choice for reads.
113-
2. **One vocabulary.** Constants grouped by *kind* — verbs, pushes, admin —
113+
2. **One vocabulary.** Constants grouped by *kind*, verbs, pushes, admin,
114114
with the socket an implementation detail of the client, not a prefix.
115115
3. **Attendance as a verb outcome**, per §2.3.
116116
4. **A law that keeps it tight**: every new method must state which existing
117117
method it is NOT (the May plan's discipline, written into the plan file so
118118
the next accretion has to argue with it).
119119

120-
## 4. Sequence — one idea per commit, green at every step
120+
## 4. Sequence: one idea per commit, green at every step
121121

122122
| # | step | falsifier |
123123
|---|---|---|
124-
| 1 | this plan | — |
124+
| 1 | this plan | - |
125125
| 2 | attendance: strip the bind out of the mint helpers; each birth verb states its outcome | a live script that asserts the shell's binding after each of the 7 verbs |
126126
| 3 | collapse the read families to one client-facing surface | `fig show`/`listen`/`status` byte-identical before and after, live and dormant |
127127
| 4 | regroup `methods.go` by kind; delete what nothing calls | `deadcode -test` as the oracle, as W9 did (−492 lines then) |
128-
| 5 | slim `angelus/protocol.go` — the handler table is a table, the handlers move out | line count, and no behaviour change |
128+
| 5 | slim `angelus/protocol.go`, the handler table is a table, the handlers move out | line count, and no behaviour change |
129129

130130
## 5. Rulings (Gluck, 2026-08-21)
131131

@@ -147,7 +147,7 @@ it is Gluck's.
147147

148148
1. Does `fig form new` attend? (§2.3)
149149
2. Is a wire break acceptable again? The May plan said "old clients fail
150-
loudly against new servers" and that is still the cheapest path — but the
150+
loudly against new servers" and that is still the cheapest path, but the
151151
daemon and the CLI are now upgraded separately (`nix profile upgrade`
152152
leaves a running daemon), so a break is felt as a broken session rather
153153
than an error. `checkDaemonBuild` exists; does it refuse, or just warn?
@@ -157,11 +157,11 @@ it is Gluck's.
157157

158158
| step | commit | result |
159159
|---|---|---|
160-
| 3 — one read surface | `a6388674` | the live-or-store predicate existed **three** times (per-method in `read_handlers.go`, again as `readForHub`, again in the CLI); now `routeRead` and `readFromStore`, once each. `aria.page`/`aria.context`/`aria.form` and `AriaPageRequest` deleted; `aria.read` → `figaro.ir` |
160+
| 3, one read surface | `a6388674` | the live-or-store predicate existed **three** times (per-method in `read_handlers.go`, again as `readForHub`, again in the CLI); now `routeRead` and `readFromStore`, once each. `aria.page`/`aria.context`/`aria.form` and `AriaPageRequest` deleted; `aria.read` → `figaro.ir` |
161161
| contract purity | `df03bfb0` | `api/…` depends on `api/…` and stdlib only, asserted by `api/rpc/contract_test.go`. `message`, `livedoc`, `form` moved whole; the read API's wire types split to `api/aria` |
162162
| sdk | `6a91fd32` | `sdk.Angelus` / `sdk.Aria`. CLI files importing a server package: **36 → 4** |
163-
| 2 — attendance | `d7542c16` | the mint binds nothing; `attendNew` is the one move; `restoreAttendance` deleted; `fig form new` attends |
164-
| 4+5 — tidiness | `3610cbd3` | `methods.go` 1,012 → 118 lines, grouped by kind, one family per file; `angelus/protocol.go` 2,011 → 371 |
163+
| 2, attendance | `d7542c16` | the mint binds nothing; `attendNew` is the one move; `restoreAttendance` deleted; `fig form new` attends |
164+
| 4+5, tidiness | `3610cbd3` | `methods.go` 1,012 → 118 lines, grouped by kind, one family per file; `angelus/protocol.go` 2,011 → 371 |
165165

166166
### What the instruments caught that reasoning did not
167167

@@ -179,7 +179,7 @@ it is Gluck's.
179179
### Open
180180

181181
`internal/store/crashtest` failed once during the gate, under concurrent load,
182-
on a model divergence (`next chanLT 12, child reports 3`) — NOT the
182+
on a model divergence (`next chanLT 12, child reports 3`), NOT the
183183
`[append-lost]` lines beside it, which are documented known gaps. 20 unloaded
184184
runs across both branches: 0 failures. Attribution under load is in progress;
185185
the branch touches no store code, and the finding belongs to the store

‎plans/campaign-notes/README.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Copied from `~/notes/figaro` by aria f3aa1d0b (role @980dc16c),
55
finding.
66

77
THESE FILES ARE CITED BY `plans/delta-seam.md` AS THE AUTHORITY FOR
8-
STANDING RULES — the instrument notebook and its sixteen worked
8+
STANDING RULES, the instrument notebook and its sixteen worked
99
instances, the within-run/between-run distinction that governs which
1010
benchmark results are admissible, the dated REFUSED-NOT-MISSING items and
1111
their thresholds. Until this commit they lived only in a home directory,
@@ -15,7 +15,7 @@ WHY THEY WERE NOT VERSIONED, DIAGNOSED RATHER THAN ASSUMED: `~/notes` is
1515
not a git repository. Git commands run there walk UP and resolve to
1616
`$HOME`, which carries a bare repository's layout at its top level (HEAD,
1717
config with core.bare, objects/, refs/, description), created
18-
2026-08-16. It holds ZERO refs and ZERO objects — an empty repo, almost
18+
2026-08-16. It holds ZERO refs and ZERO objects, an empty repo, almost
1919
certainly `git init --bare` run once in the wrong directory. So `git add`
2020
in `~/notes` does not create a repository there; it fails with "this
2121
operation must be run in a work tree". That stray repo also means every
@@ -27,7 +27,7 @@ directory, and the notes directory holds personal material beside these
2727
files.
2828

2929
STATUS OF THIS COPY: a SNAPSHOT, not a move. The originals remain
30-
authoritative and are still being edited by the arias that own them —
30+
authoritative and are still being edited by the arias that own them,
3131
each note names its author. Whoever merges this branch should decide
3232
whether the repo copy becomes canonical or is refreshed; a copy that
3333
silently diverges from its original is the same defect as a comment that

‎plans/campaign-notes/addtext-quadratic.md‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,22 @@ They then checked the source and withdrew it; confirmed here independently in
7272
b.buf = buf
7373
}
7474

75-
`String()` is **zero-copy** — it aliases the buffer. A later `Write` that grows
75+
`String()` is **zero-copy**, it aliases the buffer. A later `Write` that grows
7676
reallocates, leaving any previously returned string pointing at the old array
7777
with its own length and contents intact; one that does not grow appends beyond
7878
that string's length, which it cannot see. So materialize-on-read is cheap and
7979
the per-frame cost is near zero.
8080

8181
**THE REAL HAZARD IS ALIASING, NOT COST.** A Builder-backed `Content.Text`
8282
handed to the composer aliases a buffer the drain loop is still appending to,
83-
and this codebase already has a law about precisely that shape —
83+
and this codebase already has a law about precisely that shape,
8484
`cached_log.go`: *"logView is the published window: immutable once stored, so a
8585
reader takes it with one atomic load and holds no lock at all."* That is what
8686
whoever takes this must test. The per-frame arithmetic is not the question;
8787
whether a held view can be mutated underneath its holder is.
8888

8989
Still: **whoever fixes it prices the destination path first.** The warning is
90-
sound as a discipline even though this particular instance of it dissolved —
90+
sound as a discipline even though this particular instance of it dissolved,
9191
this campaign has been burned by a fix that looked free because nobody measured
9292
where the cost went. (091d162e and 6defe6f9, 2026-08-18.)
9393

@@ -115,8 +115,8 @@ event is `mergeTurnTools`' map, made once per event."* **That label is wrong.**
115115
all.** The linear per-event term is `partialAssistant`'s `out.Content` append,
116116
which does escape; the tool-axis term is `toolsFromAssistant`'s append.
117117

118-
**The measured totals are unchanged** — ~1.0 allocation removed per event,
119-
~38 per tool, no per-byte component — and the three-mechanism account still
118+
**The measured totals are unchanged**, ~1.0 allocation removed per event,
119+
~38 per tool, no per-byte component, and the three-mechanism account still
120120
covers all three axes with no residue. Only the NAME on the linear term was
121121
wrong.
122122

@@ -127,8 +127,8 @@ concluded the MODEL was wrong when only the LABEL was.
127127
**THE RULE THIS COST, now standing: when a prediction is about allocations,
128128
ASK THE COMPILER BEFORE PREDICTING.** `-gcflags=-m` costs seconds. Reading the
129129
source tells you what is *written*; escape analysis tells you what is
130-
*allocated*, and this campaign spent four predictions — three of the
131-
executor's magnitudes and one of my labels — learning that those are different
130+
*allocated*, and this campaign spent four predictions, three of the
131+
executor's magnitudes and one of my labels, learning that those are different
132132
questions.
133133

134134

@@ -137,15 +137,15 @@ questions.
137137
**`-gcflags=-m` answers WHICH LINES allocate. It says nothing about HOW MANY
138138
TIMES they run.** The unverified fixed ~35 term in the stage-5 decomposition is
139139
a CALL-COUNT question, not an escape question, and reaching for escape analysis
140-
to settle it would be the right tool on the wrong shape — the same class of
140+
to settle it would be the right tool on the wrong shape, the same class of
141141
error as reading `make(map...)` and calling it an allocation because it is
142142
spelled like one.
143143

144144
What would settle it: `-memprofile` with `alloc_objects` attributed by call
145145
site, or a differential count with one call site removed.
146146

147147
6defe6f9's hypothesis, recorded as a hypothesis: before stage 5, `noteAssistant`
148-
had TWO call sites —
148+
had TWO call sites,
149149

150150
turn.go:519 a.noteAssistant(asmMsg.message()) per BUS EVENT -> the linear term
151151
turn.go:523 a.noteAssistant(&staged.Payload) per ROUND -> fixed-term shaped

0 commit comments

Comments
 (0)