@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 +128 -86
- package/SOURCES.md +8 -8
- package/extensions/developer.ts +1713 -1176
- package/extensions/machine.ts +418 -286
- package/extensions/references/behavior-preserving-structural-change.md +14 -13
- package/extensions/state.ts +486 -330
- package/extensions/tool-policy.ts +70 -64
- package/extensions/tui.ts +1713 -653
- package/package.json +1 -1
- package/skills/sketch/references/responsibility-and-variation.md +1 -1
package/README.md
CHANGED
|
@@ -24,61 +24,51 @@ pi -e npm:@hobin/developer
|
|
|
24
24
|
|
|
25
25
|
## Quick start
|
|
26
26
|
|
|
27
|
-
Start Pi,
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
51
|
-
| `/develop on` | Enable adaptive routing
|
|
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
|
-
|
|
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
|
|
63
|
-
flag:
|
|
54
|
+
Start a non-interactive or preconfigured session with Developer enabled:
|
|
64
55
|
|
|
65
56
|
```sh
|
|
66
|
-
pi --develop
|
|
67
|
-
pi --develop-mode strict
|
|
57
|
+
pi --develop
|
|
68
58
|
```
|
|
69
59
|
|
|
70
|
-
##
|
|
60
|
+
## Activation and tool policy
|
|
71
61
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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
|
|
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 `
|
|
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;
|
|
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
|
|
101
|
-
|
|
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
|
|
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
|
|
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
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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` |
|
|
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
|
|
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-
|
|
173
|
-
- `resolutionCriteria`: the observable evidence or answer that closes it
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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-
|
|
188
|
-
routes and Pi built-in
|
|
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
|
|
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
|
-
|
|
257
|
-
stored in tool-result details. Developer replays the current branch through
|
|
258
|
-
XState v5 machine on startup and tree navigation, so a fork inherits only the
|
|
259
|
-
events on its branch. Parallel machine regions keep
|
|
260
|
-
framing debt, and verification debt explicit; transition guards reject
|
|
261
|
-
route while a `before-
|
|
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
|
-
├──
|
|
266
|
-
├── route: idle | judgment |
|
|
284
|
+
├── activation: disabled | enabled
|
|
285
|
+
├── route: idle | judgment | implementation
|
|
267
286
|
├── questions: clear | open
|
|
268
|
-
├──
|
|
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,
|
|
276
|
-
`mutate`, and question/debt regions expose blocking tags. Every
|
|
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
|
|
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/
|
|
282
|
-
|
|
283
|
-
|
|
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/ #
|
|
326
|
-
├── state.ts # developer/
|
|
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
|
|
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
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
-
|
|
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-
|
|
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, `
|
|
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
|
|
391
|
-
landing and an agent-owned before-
|
|
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
|
|
6
|
-
|
|
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 `
|
|
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` | `
|
|
55
|
-
| *99 Bottles of OOP*, ch. 4-5 | stable landings, responsibility-derived names, argument and data movement | `abstraction-review`, `naming-judgment` | `
|
|
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 `
|
|
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` | `
|
|
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
|
|
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
|
```
|