@hobin/developer 0.1.5 → 0.1.7

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/README.md CHANGED
@@ -24,61 +24,51 @@ pi -e npm:@hobin/developer
24
24
 
25
25
  ## Quick start
26
26
 
27
- Start Pi, enable adaptive mode, and describe the product task normally:
27
+ Start Pi, turn Developer on, and describe the product task normally:
28
28
 
29
29
  ```text
30
30
  /develop on
31
31
  The selected payment method disappears after navigating back to checkout. Find the cause and fix it.
32
32
  ```
33
33
 
34
- Most users should begin with `on`. Developer decides whether the next concrete
35
- question would benefit from a focused skill or is already justified as direct action. You
36
- do not need to call its internal protocol tools yourself.
37
-
38
- For a risky refactor where Pi should justify mutation before using its built-in
39
- edit, write, or shell tools:
40
-
41
- ```text
42
- /develop strict
43
- Unify the duplicate schedule types and conversion logic without changing existing behavior.
44
- ```
34
+ Developer decides whether the next concrete question would benefit from a focused
35
+ skill or is already justified as implementation action. You do not need to call
36
+ its internal protocol tools yourself. While Developer is on, Pi's built-in shell
37
+ and artifact tools follow the active route.
45
38
 
46
39
  ## Commands
47
40
 
48
41
  | Command | Effect |
49
42
  | --- | --- |
50
- | `/develop` | Open the interactive Developer control menu |
51
- | `/develop on` | Enable adaptive routing; tools stay active unless a `before-direct` question gate is open |
52
- | `/develop strict` | Gate shell execution behind an active route and structured artifact mutation behind a direct route |
43
+ | `/develop` | Open the non-overlay Developer settings surface |
44
+ | `/develop on` | Enable adaptive routing and route-bound access to Pi built-in `bash`, `edit`, and `write` |
53
45
  | `/develop status` | Inspect current branch state in a read-only panel |
54
46
  | `/develop questions` | Choose an unresolved question, answer it or request investigation, and submit it to Pi |
55
47
  | `/develop off` | Disable the protocol and clear current protocol state |
56
48
 
57
49
  Explicit command arguments participate in Pi's completion UI. In interactive
58
- mode, turning Developer off while a route or unresolved question exists requires
50
+ use, turning Developer off while a route or unresolved question exists requires
59
51
  confirmation. The historical session entries remain; only current protocol
60
52
  state is cleared.
61
53
 
62
- Start a non-interactive or preconfigured session in a mode with the extension
63
- flag:
54
+ Start a non-interactive or preconfigured session with Developer enabled:
64
55
 
65
56
  ```sh
66
- pi --develop-mode on
67
- pi --develop-mode strict
57
+ pi --develop
68
58
  ```
69
59
 
70
- ## Modes
60
+ ## Activation and tool policy
71
61
 
72
- | Mode | Routing | Built-in mutation tools | Best fit |
73
- | --- | --- | --- | --- |
74
- | `on` | Adaptive | Unchanged except while a `before-direct` question gate is open | Normal product development |
75
- | `strict` | Adaptive | `bash` is available during skill/direct routes; Pi built-in `edit` and `write` require an active `direct` route and no `before-direct` gate | High-risk changes and workflow-discipline experiments |
76
- | `off` | Disabled | Developer makes no changes to the active set | Normal Pi behavior without the protocol |
62
+ Developer has one boolean setting: on or off. When on, adaptive routing and the
63
+ route-bound tool policy always apply. Pi built-in `bash` is available during
64
+ skill and implementation routes; built-in `edit` and `write` require an active
65
+ `implementation` route and no `before-implementation` gate. When off, Developer
66
+ clears current protocol state and restores only tools that it withheld.
77
67
 
78
- Strict mode and question gates are workflow-integrity controls, not a security
68
+ The tool policy and question gates are workflow-integrity controls, not a security
79
69
  sandbox. A skill route receives the shell execution lane needed for repository
80
70
  inspection and verifier execution, while structured `edit`/`write` mutation
81
- remains direct-only. Shell commands are not parsed as a security language; skill
71
+ remains implementation-only. Shell commands are not parsed as a security language; skill
82
72
  contracts prohibit artifact mutation, and adversarial evaluation checks the
83
73
  workspace boundary. Developer recognizes Pi built-ins from their provenance,
84
74
  preserves unrelated active tools, and does not force-enable tools the user
@@ -89,16 +79,16 @@ disabled.
89
79
  Developer adds two model-facing protocol tools:
90
80
 
91
81
  1. `developer_route_question` opens one route for one concrete question.
92
- 2. The route target is `direct` or one currently available Developer skill.
82
+ 2. The route target is `implementation` or one currently available Developer skill.
93
83
  3. A skill route returns the exact Pi-discovered `SKILL.md` instructions and canonical
94
- path; a direct route declares one movement, its stable landing, and its narrow
84
+ path; an implementation route declares one movement, its stable landing, and its narrow
95
85
  verification. A behavior-preserving structural route also loads the focused
96
86
  execution profile based on flocking-style movement and small tidyings.
97
87
  4. `developer_record_judgment` closes the route with a status, result, evidence,
98
88
  artifacts, and any newly opened questions. Developer then routes again from
99
89
  the stable landing before another movement.
100
- 5. Consecutive direct routes remain valid. To prevent routing by momentum, a
101
- direct route that follows a direct judgment must cite the previous landing
90
+ 5. Consecutive implementation routes remain valid. To prevent routing by momentum, a
91
+ implementation route that follows an implementation judgment must cite the previous landing
102
92
  evidence and record the plausible skill routes reconsidered plus why they add
103
93
  no useful judgment at that point.
104
94
 
@@ -107,7 +97,7 @@ The conditional default topology is:
107
97
  ```text
108
98
  clarify when needed → model consequential cases
109
99
  → sketch the first feature implementation surface OR signal existing-code movement
110
- → one direct green-to-green movement → re-route from evidence
100
+ → one implementation green-to-green movement → re-route from evidence
111
101
  → verify before completion
112
102
  ```
113
103
 
@@ -127,19 +117,31 @@ Each new route is chosen from the current question and evidence.
127
117
 
128
118
  Developer uses different Pi surfaces for different information:
129
119
 
130
- - The footer contains only global mode, protocol state, and current route target.
120
+ - The footer contains only activation, protocol state, and current route target.
131
121
  - A compact widget appears only while a route or unresolved question exists.
132
- - `/develop` uses a `SelectList` action menu.
133
- - `/develop status` opens a branch-grounded, read-only status panel with recent
134
- route/judgment history and the alternatives recorded for consecutive direct work.
135
- - `/develop questions` uses stable internal question IDs. Selecting one opens an
136
- answer/evidence editor and submits the resulting resolution request to Pi;
137
- cancelling the editor leaves protocol state unchanged.
138
- - Selection and status overlays use most of the terminal, keep a stable rendered
139
- height while navigating or scrolling, and remain bounded on small terminals.
140
- They support mouse-wheel/trackpad scrolling, arrow keys, Page Up/Down, and
141
- Home/End. Terminal mouse reporting is enabled only while the overlay is open
142
- and is released when it closes.
122
+ - `/develop` uses Pi's `SettingsList` semantics: the `Developer` row shows
123
+ and toggles the current On/Off value, `Status` opens branch details,
124
+ `History · N` opens complete route/judgment records when present, and
125
+ `Open questions · N` appears only when unresolved questions exist.
126
+ - `/develop status` opens a non-overlay, branch-grounded, read-only status panel
127
+ with recent route/judgment history and the alternatives recorded for
128
+ consecutive implementation work.
129
+ - `/develop questions` uses stable internal question IDs. A sole question opens
130
+ directly; multiple questions use one selector. Every open question, regardless
131
+ of owner or gate, first shows a complete non-overlay decision brief: context is
132
+ rendered as Markdown, then blocked work, gate, resolution criteria, and every
133
+ structured field/option appear before Continue or Leave open controls.
134
+ Cancelling the first field or editor returns to that brief; leaving the brief
135
+ returns to the parent without changing protocol state.
136
+ - A newly opened, answerable user question that gates implementation work is pushed
137
+ to the same explanation-first brief before the judgment tool returns. The user
138
+ may continue only after reviewing the explanation or leave it open. Structured
139
+ responses then collect each option/detail and provide review/edit before submission.
140
+ The answer still requires a focused judgment and explicit `question_updates`.
141
+ - Developer custom surfaces leave mouse ownership with the terminal: wheel/trackpad
142
+ scrolls normal-buffer content, drag selects text, and Cmd+C copies it. Wheel input
143
+ never changes the selected control; arrow keys do. Potentially long surfaces render
144
+ complete content rather than hiding it behind an application-owned viewport.
143
145
  - Protocol tool rows show compact status by default and higher-contrast evidence
144
146
  details when expanded with the user's configured Pi keybinding. They render
145
147
  without Pi's default full tool-row background.
@@ -155,9 +157,9 @@ terminal components.
155
157
  | `needs-judgment` | One route is active and must be closed with a judgment |
156
158
  | `needs-evidence` | At least one agent- or environment-owned evidence question remains open |
157
159
  | `needs-answer` | At least one user-owned answer or decision remains open |
158
- | `needs-routing` | A direct stable landing must be re-observed and routed again |
160
+ | `needs-routing` | An implementation stable landing must be re-observed and routed again |
159
161
  | `needs-verification` | Changed artifacts still need a resolved verify judgment |
160
- | `blocked` | A question is unavailable or explicitly gates direct work |
162
+ | `blocked` | A question is unavailable or explicitly gates implementation work |
161
163
 
162
164
  These are routing states, not product-completion claims. In particular:
163
165
 
@@ -169,14 +171,26 @@ Pending questions receive stable internal IDs, but users do not type them. Each
169
171
  question records:
170
172
 
171
173
  - `resolutionOwner`: `agent`, `user`, or `environment`;
172
- - `gate`: `none`, `before-direct`, or `before-completion`;
173
- - `resolutionCriteria`: the observable evidence or answer that closes it.
174
-
175
- Selecting `/develop questions` opens an owner-specific editor: user questions
176
- ask for the required decision, agent questions ask Pi to investigate, and
177
- environment questions request access or an external observation. Submitting the
178
- editor focuses the question in branch state; an explicit ID, focus, or exact
179
- question match associates the next route. Selection alone never closes it.
174
+ - `gate`: `none`, `before-implementation`, or `before-completion`;
175
+ - `resolutionCriteria`: the observable evidence or answer that closes it;
176
+ - `context`: Markdown explanation rendered before answer controls for every open
177
+ question; required for user-owned `before-implementation` and `before-completion`
178
+ questions, optional for other and legacy questions;
179
+ - optional user-owned `responseSpec`: a bounded `choice-form` with required
180
+ single-choice fields and optional per-option detail prompts.
181
+
182
+ A producer should use `response_spec` when a user must answer finite decisions
183
+ such as A, B1–B4, C, and so on. Each decision becomes one field; the TUI does not
184
+ infer controls by parsing Markdown. Options such as A3 or G3 that need additional
185
+ input declare `detail_prompt`. Missing or malformed replay data falls back to the
186
+ freeform editor without dropping the pending question.
187
+
188
+ Selecting `/develop questions` always opens the explanation brief before any
189
+ structured control or owner-specific editor. User questions then ask for the
190
+ required decision, agent questions ask Pi to investigate, and environment
191
+ questions request access or an external observation. Submitting
192
+ focuses the question in branch state; an explicit ID, focus, or exact question
193
+ match associates the next route. Selection alone never closes it.
180
194
 
181
195
  Every judgment rechecks all pending questions. `question_updates` can resolve an
182
196
  unfocused question when implementation, tests, inspection, user input, or an
@@ -184,12 +198,17 @@ environment observation naturally supplies its criteria. A focused question
184
198
  must receive an explicit update: resolve or dismiss it with concrete basis,
185
199
  retain it as open or blocked, or close the broad parent while opening narrower
186
200
  children. Resolved and not-applicable updates remove the question with recorded
187
- basis; open or blocked updates preserve its identity. A `before-direct` question blocks both direct
188
- routes and Pi built-in mutation tools even in adaptive mode. A
201
+ basis; open or blocked updates preserve its identity. A `before-implementation` question blocks both implementation
202
+ routes and Pi built-in artifact tools while Developer is on. A
189
203
  `before-completion` question allows investigation and implementation but keeps
190
204
  the protocol non-idle and prevents verification debt from being cleared as a
191
205
  completion claim.
192
206
 
207
+ A resolved or not-applicable judgment may preserve a distinct follow-up question:
208
+ finishing the routed judgment does not imply that no later work was discovered.
209
+ It may not reopen its own normalized question under a resolved status; that route
210
+ must remain needs-evidence/blocked or explicitly refine a focused parent instead.
211
+
193
212
  When a judgment replaces a broad unresolved question with more specific evidence
194
213
  questions, only the actionable children remain. Equivalent question wording is
195
214
  deduplicated while preserving the existing identity.
@@ -235,7 +254,7 @@ instructions say when each reference is worth reading and resolve it relative to
235
254
  the skill directory. A reference may synthesize several sources because the
236
255
  leaf's question, not a book title, owns the capability. Each source-derived
237
256
  reference includes a source trace, and [SOURCES.md](./SOURCES.md) maps the full
238
- book coverage across leaves and the direct path. Small, settled judgments do not
257
+ book coverage across leaves and the implementation path. Small, settled judgments do not
239
258
  need the extra context.
240
259
 
241
260
  Primary references retain the capability's core insight and one complete case.
@@ -253,35 +272,34 @@ disabled, or replaced through resource configuration.
253
272
 
254
273
  ## State, branches, and compaction
255
274
 
256
- Mode changes are stored as Pi custom session entries. Routes and judgments are
257
- stored in tool-result details. Developer replays the current branch through an
258
- XState v5 machine on startup and tree navigation, so a fork inherits only the
259
- events on its branch. Parallel machine regions keep mode, route, question gates,
260
- framing debt, and verification debt explicit; transition guards reject a direct
261
- route while a `before-direct` question remains.
275
+ Activation changes are stored as Pi custom session entries. Routes and judgments
276
+ are stored in tool-result details. Developer replays the current branch through
277
+ an XState v5 machine on startup and tree navigation, so a fork inherits only the
278
+ events on its branch. Parallel machine regions keep activation, route, question gates,
279
+ framing debt, and verification debt explicit; transition guards reject an implementation
280
+ route while a `before-implementation` question remains.
262
281
 
263
282
  ```text
264
283
  developerMachine (parallel)
265
- ├── mode: off | on | strict
266
- ├── route: idle | judgment | direct
284
+ ├── activation: disabled | enabled
285
+ ├── route: idle | judgment | implementation
267
286
  ├── questions: clear | open
268
- ├── directGate: clear | blocked
287
+ ├── implementationGate: clear | blocked
269
288
  ├── completionGate: clear | blocked
270
289
  ├── checkpoint: ready | required
271
290
  ├── framing: clear | required
272
291
  └── verification: current | required
273
292
  ```
274
293
 
275
- Judgment routes carry the `execute` tag, direct routes carry `execute` and
276
- `mutate`, and question/debt regions expose blocking tags. Every direct judgment
294
+ Judgment routes carry the `execute` tag, implementation routes carry `execute` and
295
+ `mutate`, and question/debt regions expose blocking tags. Every implementation judgment
277
296
  moves the checkpoint to `required`; the next accepted route returns it to
278
- `ready`. Tool availability, runtime call guards, status, and direct-transition
297
+ `ready`. Tool availability, runtime call guards, status, and implementation-transition
279
298
  eligibility are derived from the same machine snapshot.
280
299
 
281
- The current event contract is `developer/v4`. Legacy `developer/v1` through
282
- `developer/v3` routing history can be replayed. Legacy questions receive
283
- conservative owner, gate, and resolution-criteria defaults rather than guessed
284
- product decisions.
300
+ The current event contract is `developer/v5`. Earlier protocol entries are not
301
+ replayed; this breaking contract uses `target`, `implementation`, and
302
+ `before-implementation` consistently across tools, events, and machine state.
285
303
 
286
304
  Developer deliberately leaves compaction ownership to Pi. It does not trigger,
287
305
  cancel, or replace threshold/overflow compaction, so it cannot override the
@@ -322,8 +340,8 @@ pinning, and security behavior.
322
340
  extensions/
323
341
  ├── developer.ts # command, protocol tools, events, and Pi integration
324
342
  ├── machine.ts # XState v5 parallel regions, guards, transitions, and tags
325
- ├── references/ # direct execution profiles loaded through tool results
326
- ├── state.ts # developer/v4 event normalization and branch replay
343
+ ├── references/ # implementation profiles loaded through tool results
344
+ ├── state.ts # developer/v5 event normalization and branch replay
327
345
  ├── skills.ts # loaded-skill filtering and instruction rendering
328
346
  ├── tool-policy.ts # machine-derived execution and mutation access policy
329
347
  └── tui.ts # selectors, widget, status panel, and prompt preparation
@@ -349,26 +367,50 @@ Load the workspace package into Pi without installing it:
349
367
  pi -e ./packages/developer
350
368
  ```
351
369
 
352
- Launch the isolated modal fixture in a new Ghostty window for visual QA:
370
+ Launch the isolated surface fixture in a new Ghostty window for visual QA:
353
371
 
354
372
  ```sh
355
373
  ./packages/developer/scripts/ghostty-tui-qa.sh
356
374
  ```
357
375
 
358
- Choose **Inspect status** or **Revisit an open question**, then resize the window
359
- while the modal is open. The fixture disables discovered extensions, skills,
360
- tools, sessions, and network startup so it cannot mutate Developer state or call
361
- a model.
376
+ Choose each independent scenario from the QA menu:
377
+
378
+ 1. **Activation + confirm/cancel** toggle Off/On on the same Settings surface;
379
+ cancel destructive Off and verify the row stays On, then confirm it and verify
380
+ the route/questions clear before toggling On again.
381
+ 2. **Settings / Status / History / Questions** — open a History judgment,
382
+ drag-select detail text and paste it elsewhere, then verify one-level Escape
383
+ from detail → History → Settings → scenario menu with parent focus restored.
384
+ 3. **Custom answer + Korean IME** — choose **Write another answer…**, then check
385
+ composition, validation, review/edit, and preset/custom provenance.
386
+ 4. **Resize / scroll / mouse cleanup** — repeatedly resize long Status and
387
+ History detail surfaces between wide and narrow layouts; check native mouse
388
+ wheel scrolling, border alignment, drag selection, Cmd+C, and paste elsewhere.
389
+ 5. **Unicode + compact overlay footprint** — inspect `◆`, `→`, `↑↓`, `·`, `…`,
390
+ and Korean glyph alignment, untouched background, and content-bounded overlays.
391
+
392
+ Across Developer surfaces, Ghostty owns the mouse: the wheel scrolls terminal
393
+ scrollback, ordinary drag selects text, and `Cmd+C` copies it. Wheel movement
394
+ never changes the selected list target; use `↑`/`↓` for selection. Potentially
395
+ long lists render every row as non-overlay surfaces, while complete two-choice
396
+ interruptions remain compact overlays.
397
+
398
+ Each scenario creates a fresh in-memory model. Activation events use the same
399
+ `applyDeveloperEvent` reducer and `DeveloperSettingsBinding` contract as the
400
+ production surface; no state is shared between scenario runs. The fixture does
401
+ not append entries, submit answers, register tools, mutate active tools, restore
402
+ sessions, start network work, or send model messages. Prepared answers are shown
403
+ only as a character count.
362
404
 
363
405
  `check` validates package structure and deterministic behavior. `eval` launches
364
406
  the real Pi RPC surface without a model and covers package resources, commands,
365
- mode state, and strict tool gating. These are release-gating checks.
407
+ activation state, and route-bound tool gating. These are release-gating checks.
366
408
 
367
409
  Model-dependent runs are probabilistic evaluations rather than binary tests:
368
410
 
369
411
  ```sh
370
412
  PI_CODING_AGENT_DIR=~/.pi/agent \
371
- DEVELOPER_EVAL_FIXTURE=agent-before-direct-evidence-gate \
413
+ DEVELOPER_EVAL_FIXTURE=agent-before-implementation-evidence-gate \
372
414
  DEVELOPER_EVAL_TRIALS=5 \
373
415
  pnpm --filter @hobin/developer eval:live
374
416
  ```
@@ -377,7 +419,7 @@ Use `eval:live:json` for the JSON transport. Each report separates the hard
377
419
  admissibility envelope from routing quality: structurally valid runs must use an
378
420
  admissible route, preserve mutation/question/completion invariants, satisfy
379
421
  hidden artifact checks, include required semantic terms, and end in a declared
380
- outcome. Among accepted runs, `preferredFirstOwners` measures better versus
422
+ outcome. Among accepted runs, `preferredFirstTargets` measures better versus
381
423
  merely admissible routing. Reports include acceptance and preference rates,
382
424
  95% Wilson intervals, inadmissible results, rejected protocol attempts, budget
383
425
  exhaustion, and environment failures. Any accepted inadmissible result makes the
@@ -387,8 +429,8 @@ rate. A single model sample is not release evidence.
387
429
  Live fixtures classify terminal outcomes as `settled-unchanged`, `pending`,
388
430
  `changed-paused`, or `changed-verified`. An eval-only observer compares
389
431
  product-file snapshots around bash/edit/write calls and rejects artifact changes
390
- outside a direct route. Dedicated fixtures sample a deliberately paused direct
391
- landing and an agent-owned before-direct question resolved through a non-direct
432
+ outside an implementation route. Dedicated fixtures sample a deliberately paused implementation
433
+ landing and an agent-owned before-implementation question resolved through a non-implementation
392
434
  bash evidence route; their structural guarantees also have deterministic machine,
393
435
  extension, trace, filesystem, and outcome tests. RPC and JSON runners share
394
436
  route, tool-call, tool-error, wall-clock, and no-progress budgets and preserve a
package/SOURCES.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  Developer is organized around questions the agent must answer, not around books.
4
4
  This maintainer document records how source material is decomposed across leaf
5
- skills and the direct execution path. It is not a Pi runtime resource or a
6
- required workflow.
5
+ skills and the implementation path. It is not a Pi runtime resource or a required
6
+ workflow.
7
7
 
8
8
  ## Ownership Rule
9
9
 
@@ -17,7 +17,7 @@ A source idea belongs where its observable job is performed:
17
17
  - timing goes to `schedule`;
18
18
  - names go to `naming-judgment`;
19
19
  - claim-to-evidence judgment goes to `verify`;
20
- - already-justified mutation goes to the `direct` route.
20
+ - already-justified mutation goes to the `implementation` route.
21
21
 
22
22
  No source implies a mandatory route order. Several leaves may use different
23
23
  parts of the same source because they answer different questions.
@@ -51,8 +51,8 @@ capability boundary.
51
51
  | Source | Capability extracted | Primary owner | Supporting owner or execution path |
52
52
  | --- | --- | --- | --- |
53
53
  | *99 Bottles of OOP*, ch. 1-2 | simple concrete baseline, Shameless Green, cost-effective and intention-revealing tests | `verify` | `signal`, `schedule` |
54
- | *99 Bottles of OOP*, ch. 3-4 | real change pressure, point of attack, closest pair, smallest difference, horizontal movement | `signal` | `direct` behavior-preserving protocol |
55
- | *99 Bottles of OOP*, ch. 4-5 | stable landings, responsibility-derived names, argument and data movement | `abstraction-review`, `naming-judgment` | `direct` behavior-preserving protocol |
54
+ | *99 Bottles of OOP*, ch. 3-4 | real change pressure, point of attack, closest pair, smallest difference, horizontal movement | `signal` | `implementation` behavior-preserving protocol |
55
+ | *99 Bottles of OOP*, ch. 4-5 | stable landings, responsibility-derived names, argument and data movement | `abstraction-review`, `naming-judgment` | `implementation` behavior-preserving protocol |
56
56
  | *99 Bottles of OOP*, ch. 5-8 | responsibility separation, messages, type transitions, polymorphism, dependency direction, object creation at the edge, factory tradeoffs | `sketch`, `abstraction-review` | `model`, `schedule` |
57
57
  | *99 Bottles of OOP*, ch. 9 | unit boundaries, context independence, role verification, obsolete-test removal | `verify` | `sketch` |
58
58
  | *How to Design Programs* | information analysis, data definitions, examples, templates, structural and generative recursion, accumulators, iterative refinement | `sketch` | `model`, `verify`, `signal`, `abstraction-review` |
@@ -63,10 +63,10 @@ capability boundary.
63
63
  | *Logic for Programmers*, ch. 4-6 | partial specifications, properties, contracts, replacement, proof limits | `model`, `verify` | `abstraction-review` |
64
64
  | *Logic for Programmers*, ch. 7-12 | relational constraints, decision tables, domain/time/system models, solvers, logic programming | `model` | `verify` |
65
65
  | *Elements of Clojure*: Names | narrow and consistent sense, honest effects and scope crossing | `naming-judgment` | `model` |
66
- | *Elements of Clojure*: Idioms | language-specific conventions and explicit operational semantics | project conventions or `direct` | generalized only when the semantic lesson survives the language |
66
+ | *Elements of Clojure*: Idioms | language-specific conventions and explicit operational semantics | project conventions or `implementation` | generalized only when the semantic lesson survives the language |
67
67
  | *Elements of Clojure*: Indirection | abstraction cost, module environment/model/interface/assumptions, principled versus adaptable systems | `sketch`, `abstraction-review` | `schedule` |
68
68
  | *Elements of Clojure*: Composition | units of computation and pull-transform-push process boundaries | `sketch` | `naming-judgment`, `verify` |
69
- | *Tidy First?* | separate behavior from structure, small tidyings, optionality, reversibility, first/after/later/never | `schedule` | `direct` behavior-preserving protocol, `signal` |
69
+ | *Tidy First?* | separate behavior from structure, small tidyings, optionality, reversibility, first/after/later/never | `schedule` | `implementation` behavior-preserving protocol, `signal` |
70
70
 
71
71
  ## Intentionally Not Imported As Universal Rules
72
72
 
@@ -94,7 +94,7 @@ When adding or revising a source-derived reference, record:
94
94
  ```text
95
95
  Source location: book, edition/version, chapter or section
96
96
  Capability: the question or action the idea improves
97
- Owner: one leaf or the direct path
97
+ Owner: one leaf or the implementation path
98
98
  Boundary: what the owner must not absorb
99
99
  Observable effect: the artifact, decision, or safer execution behavior expected
100
100
  ```