@hobin/developer 0.1.6 → 0.1.8
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 +127 -95
- package/SOURCES.md +8 -8
- package/extensions/developer.ts +1752 -1441
- package/extensions/machine.ts +418 -286
- package/extensions/references/behavior-preserving-structural-change.md +14 -13
- package/extensions/state.ts +463 -419
- package/extensions/tool-policy.ts +158 -65
- package/extensions/tui.ts +1666 -910
- package/package.json +1 -1
- package/skills/sketch/references/responsibility-and-variation.md +1 -1
package/README.md
CHANGED
|
@@ -24,81 +24,79 @@ 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
|
|
85
75
|
disabled.
|
|
86
76
|
|
|
77
|
+
Before Pi tears down a session runtime, Developer releases its route-bound tool
|
|
78
|
+
delta so a reload, session replacement, or later extension instance does not
|
|
79
|
+
inherit orphaned restrictions. After that release, the package records a
|
|
80
|
+
reload-safe lifecycle marker. If an in-process reload finds older Developer
|
|
81
|
+
history without a later release marker, Developer stays off and requires a full
|
|
82
|
+
Pi process restart. Neither `/reload` nor `/develop off` → `on` can safely infer
|
|
83
|
+
which built-ins the user originally enabled.
|
|
84
|
+
|
|
87
85
|
## How a request runs
|
|
88
86
|
|
|
89
87
|
Developer adds two model-facing protocol tools:
|
|
90
88
|
|
|
91
89
|
1. `developer_route_question` opens one route for one concrete question.
|
|
92
|
-
2. The route target is `
|
|
90
|
+
2. The route target is `implementation` or one currently available Developer skill.
|
|
93
91
|
3. A skill route returns the exact Pi-discovered `SKILL.md` instructions and canonical
|
|
94
|
-
path;
|
|
92
|
+
path; an implementation route declares one movement, its stable landing, and its narrow
|
|
95
93
|
verification. A behavior-preserving structural route also loads the focused
|
|
96
94
|
execution profile based on flocking-style movement and small tidyings.
|
|
97
95
|
4. `developer_record_judgment` closes the route with a status, result, evidence,
|
|
98
96
|
artifacts, and any newly opened questions. Developer then routes again from
|
|
99
97
|
the stable landing before another movement.
|
|
100
|
-
5. Consecutive
|
|
101
|
-
|
|
98
|
+
5. Consecutive implementation routes remain valid. To prevent routing by momentum, a
|
|
99
|
+
implementation route that follows an implementation judgment must cite the previous landing
|
|
102
100
|
evidence and record the plausible skill routes reconsidered plus why they add
|
|
103
101
|
no useful judgment at that point.
|
|
104
102
|
|
|
@@ -107,7 +105,7 @@ The conditional default topology is:
|
|
|
107
105
|
```text
|
|
108
106
|
clarify when needed → model consequential cases
|
|
109
107
|
→ sketch the first feature implementation surface OR signal existing-code movement
|
|
110
|
-
→ one
|
|
108
|
+
→ one implementation green-to-green movement → re-route from evidence
|
|
111
109
|
→ verify before completion
|
|
112
110
|
```
|
|
113
111
|
|
|
@@ -127,27 +125,31 @@ Each new route is chosen from the current question and evidence.
|
|
|
127
125
|
|
|
128
126
|
Developer uses different Pi surfaces for different information:
|
|
129
127
|
|
|
130
|
-
- The footer contains only
|
|
128
|
+
- The footer contains only activation, protocol state, and current route target.
|
|
131
129
|
- A compact widget appears only while a route or unresolved question exists.
|
|
132
|
-
- `/develop` uses
|
|
133
|
-
|
|
134
|
-
|
|
130
|
+
- `/develop` uses Pi's `SettingsList` semantics: the `Developer` row shows
|
|
131
|
+
and toggles the current On/Off value, `Status` opens branch details,
|
|
132
|
+
`History · N` opens complete route/judgment records when present, and
|
|
133
|
+
`Open questions · N` appears only when unresolved questions exist.
|
|
134
|
+
- `/develop status` opens a non-overlay, branch-grounded, read-only status panel
|
|
135
|
+
with recent route/judgment history and the alternatives recorded for
|
|
136
|
+
consecutive implementation work.
|
|
135
137
|
- `/develop questions` uses stable internal question IDs. A sole question opens
|
|
136
|
-
directly; multiple questions use one selector
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
138
|
+
directly; multiple questions use one selector. Every open question, regardless
|
|
139
|
+
of owner or gate, first shows a complete non-overlay decision brief: context is
|
|
140
|
+
rendered as Markdown, then blocked work, gate, resolution criteria, and every
|
|
141
|
+
structured field/option appear before Continue or Leave open controls.
|
|
142
|
+
Cancelling the first field or editor returns to that brief; leaving the brief
|
|
143
|
+
returns to the parent without changing protocol state.
|
|
144
|
+
- A newly opened, answerable user question that gates implementation work is pushed
|
|
145
|
+
to the same explanation-first brief before the judgment tool returns. The user
|
|
146
|
+
may continue only after reviewing the explanation or leave it open. Structured
|
|
147
|
+
responses then collect each option/detail and provide review/edit before submission.
|
|
148
|
+
The answer still requires a focused judgment and explicit `question_updates`.
|
|
149
|
+
- Developer custom surfaces leave mouse ownership with the terminal: wheel/trackpad
|
|
150
|
+
scrolls normal-buffer content, drag selects text, and Cmd+C copies it. Wheel input
|
|
151
|
+
never changes the selected control; arrow keys do. Potentially long surfaces render
|
|
152
|
+
complete content rather than hiding it behind an application-owned viewport.
|
|
151
153
|
- Protocol tool rows show compact status by default and higher-contrast evidence
|
|
152
154
|
details when expanded with the user's configured Pi keybinding. They render
|
|
153
155
|
without Pi's default full tool-row background.
|
|
@@ -163,9 +165,9 @@ terminal components.
|
|
|
163
165
|
| `needs-judgment` | One route is active and must be closed with a judgment |
|
|
164
166
|
| `needs-evidence` | At least one agent- or environment-owned evidence question remains open |
|
|
165
167
|
| `needs-answer` | At least one user-owned answer or decision remains open |
|
|
166
|
-
| `needs-routing` |
|
|
168
|
+
| `needs-routing` | An implementation stable landing must be re-observed and routed again |
|
|
167
169
|
| `needs-verification` | Changed artifacts still need a resolved verify judgment |
|
|
168
|
-
| `blocked` | A question is unavailable or explicitly gates
|
|
170
|
+
| `blocked` | A question is unavailable or explicitly gates implementation work |
|
|
169
171
|
|
|
170
172
|
These are routing states, not product-completion claims. In particular:
|
|
171
173
|
|
|
@@ -177,10 +179,11 @@ Pending questions receive stable internal IDs, but users do not type them. Each
|
|
|
177
179
|
question records:
|
|
178
180
|
|
|
179
181
|
- `resolutionOwner`: `agent`, `user`, or `environment`;
|
|
180
|
-
- `gate`: `none`, `before-
|
|
182
|
+
- `gate`: `none`, `before-implementation`, or `before-completion`;
|
|
181
183
|
- `resolutionCriteria`: the observable evidence or answer that closes it;
|
|
182
|
-
-
|
|
183
|
-
|
|
184
|
+
- `context`: Markdown explanation rendered before answer controls for every open
|
|
185
|
+
question; required for user-owned `before-implementation` and `before-completion`
|
|
186
|
+
questions, optional for other and legacy questions;
|
|
184
187
|
- optional user-owned `responseSpec`: a bounded `choice-form` with required
|
|
185
188
|
single-choice fields and optional per-option detail prompts.
|
|
186
189
|
|
|
@@ -190,10 +193,10 @@ infer controls by parsing Markdown. Options such as A3 or G3 that need additiona
|
|
|
190
193
|
input declare `detail_prompt`. Missing or malformed replay data falls back to the
|
|
191
194
|
freeform editor without dropping the pending question.
|
|
192
195
|
|
|
193
|
-
Selecting `/develop questions` opens
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
196
|
+
Selecting `/develop questions` always opens the explanation brief before any
|
|
197
|
+
structured control or owner-specific editor. User questions then ask for the
|
|
198
|
+
required decision, agent questions ask Pi to investigate, and environment
|
|
199
|
+
questions request access or an external observation. Submitting
|
|
197
200
|
focuses the question in branch state; an explicit ID, focus, or exact question
|
|
198
201
|
match associates the next route. Selection alone never closes it.
|
|
199
202
|
|
|
@@ -203,8 +206,8 @@ environment observation naturally supplies its criteria. A focused question
|
|
|
203
206
|
must receive an explicit update: resolve or dismiss it with concrete basis,
|
|
204
207
|
retain it as open or blocked, or close the broad parent while opening narrower
|
|
205
208
|
children. Resolved and not-applicable updates remove the question with recorded
|
|
206
|
-
basis; open or blocked updates preserve its identity. A `before-
|
|
207
|
-
routes and Pi built-in
|
|
209
|
+
basis; open or blocked updates preserve its identity. A `before-implementation` question blocks both implementation
|
|
210
|
+
routes and Pi built-in artifact tools while Developer is on. A
|
|
208
211
|
`before-completion` question allows investigation and implementation but keeps
|
|
209
212
|
the protocol non-idle and prevents verification debt from being cleared as a
|
|
210
213
|
completion claim.
|
|
@@ -259,7 +262,7 @@ instructions say when each reference is worth reading and resolve it relative to
|
|
|
259
262
|
the skill directory. A reference may synthesize several sources because the
|
|
260
263
|
leaf's question, not a book title, owns the capability. Each source-derived
|
|
261
264
|
reference includes a source trace, and [SOURCES.md](./SOURCES.md) maps the full
|
|
262
|
-
book coverage across leaves and the
|
|
265
|
+
book coverage across leaves and the implementation path. Small, settled judgments do not
|
|
263
266
|
need the extra context.
|
|
264
267
|
|
|
265
268
|
Primary references retain the capability's core insight and one complete case.
|
|
@@ -277,35 +280,38 @@ disabled, or replaced through resource configuration.
|
|
|
277
280
|
|
|
278
281
|
## State, branches, and compaction
|
|
279
282
|
|
|
280
|
-
|
|
281
|
-
stored in tool-result details. Developer replays the current branch through
|
|
282
|
-
XState v5 machine on startup and tree navigation, so a fork inherits only the
|
|
283
|
-
events on its branch. Parallel machine regions keep
|
|
284
|
-
framing debt, and verification debt explicit; transition guards reject
|
|
285
|
-
route while a `before-
|
|
283
|
+
Activation changes are stored as Pi custom session entries. Routes and judgments
|
|
284
|
+
are stored in tool-result details. Developer replays the current branch through
|
|
285
|
+
an XState v5 machine on startup and tree navigation, so a fork inherits only the
|
|
286
|
+
events on its branch. Parallel machine regions keep activation, route, question gates,
|
|
287
|
+
framing debt, and verification debt explicit; transition guards reject an implementation
|
|
288
|
+
route while a `before-implementation` question remains.
|
|
286
289
|
|
|
287
290
|
```text
|
|
288
291
|
developerMachine (parallel)
|
|
289
|
-
├──
|
|
290
|
-
├── route: idle | judgment |
|
|
292
|
+
├── activation: disabled | enabled
|
|
293
|
+
├── route: idle | judgment | implementation
|
|
291
294
|
├── questions: clear | open
|
|
292
|
-
├──
|
|
295
|
+
├── implementationGate: clear | blocked
|
|
293
296
|
├── completionGate: clear | blocked
|
|
294
297
|
├── checkpoint: ready | required
|
|
295
298
|
├── framing: clear | required
|
|
296
299
|
└── verification: current | required
|
|
297
300
|
```
|
|
298
301
|
|
|
299
|
-
Judgment routes carry the `execute` tag,
|
|
300
|
-
`mutate`, and question/debt regions expose blocking tags. Every
|
|
302
|
+
Judgment routes carry the `execute` tag, implementation routes carry `execute` and
|
|
303
|
+
`mutate`, and question/debt regions expose blocking tags. Every implementation judgment
|
|
301
304
|
moves the checkpoint to `required`; the next accepted route returns it to
|
|
302
|
-
`ready`. Tool availability, runtime call guards, status, and
|
|
305
|
+
`ready`. Tool availability, runtime call guards, status, and implementation-transition
|
|
303
306
|
eligibility are derived from the same machine snapshot.
|
|
304
307
|
|
|
305
|
-
The current event contract is `developer/
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
308
|
+
The current event contract is `developer/v5`. Earlier protocol entries are not
|
|
309
|
+
replayed; this breaking contract uses `target`, `implementation`, and
|
|
310
|
+
`before-implementation` consistently across tools, events, and machine state.
|
|
311
|
+
A process started on the current package may open a branch containing those
|
|
312
|
+
entries, but hot-reloading directly from a pre-handoff runtime is rejected with
|
|
313
|
+
a restart instruction so its in-memory tool ownership cannot be mistaken for
|
|
314
|
+
user configuration.
|
|
309
315
|
|
|
310
316
|
Developer deliberately leaves compaction ownership to Pi. It does not trigger,
|
|
311
317
|
cancel, or replace threshold/overflow compaction, so it cannot override the
|
|
@@ -346,8 +352,8 @@ pinning, and security behavior.
|
|
|
346
352
|
extensions/
|
|
347
353
|
├── developer.ts # command, protocol tools, events, and Pi integration
|
|
348
354
|
├── machine.ts # XState v5 parallel regions, guards, transitions, and tags
|
|
349
|
-
├── references/ #
|
|
350
|
-
├── state.ts # developer/
|
|
355
|
+
├── references/ # implementation profiles loaded through tool results
|
|
356
|
+
├── state.ts # developer/v5 event normalization and branch replay
|
|
351
357
|
├── skills.ts # loaded-skill filtering and instruction rendering
|
|
352
358
|
├── tool-policy.ts # machine-derived execution and mutation access policy
|
|
353
359
|
└── tui.ts # selectors, widget, status panel, and prompt preparation
|
|
@@ -373,26 +379,52 @@ Load the workspace package into Pi without installing it:
|
|
|
373
379
|
pi -e ./packages/developer
|
|
374
380
|
```
|
|
375
381
|
|
|
376
|
-
Launch the isolated
|
|
382
|
+
Launch the isolated surface fixture in a new Ghostty window for visual QA:
|
|
377
383
|
|
|
378
384
|
```sh
|
|
379
385
|
./packages/developer/scripts/ghostty-tui-qa.sh
|
|
380
386
|
```
|
|
381
387
|
|
|
382
|
-
Choose
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
388
|
+
Choose each independent scenario from the QA menu:
|
|
389
|
+
|
|
390
|
+
1. **Activation + confirm/cancel** — toggle Off/On on the same Settings surface;
|
|
391
|
+
cancel destructive Off and verify the row stays On, then confirm it and verify
|
|
392
|
+
the route/questions clear before toggling On again.
|
|
393
|
+
2. **Settings / Status / History / Questions** — open a History judgment,
|
|
394
|
+
drag-select detail text and paste it elsewhere, then verify one-level Escape
|
|
395
|
+
from detail → History → Settings → scenario menu with parent focus restored.
|
|
396
|
+
3. **Custom answer + Korean IME** — choose **Write another answer…**, then check
|
|
397
|
+
composition, validation, review/edit, and preset/custom provenance.
|
|
398
|
+
4. **Resize / scroll / mouse cleanup** — repeatedly resize long Status and
|
|
399
|
+
History detail surfaces between wide and narrow layouts; check native mouse
|
|
400
|
+
wheel scrolling, border alignment, drag selection, Cmd+C, and paste elsewhere.
|
|
401
|
+
5. **Unicode + compact overlay footprint** — inspect `◆`, `→`, `↑↓`, `·`, `…`,
|
|
402
|
+
and Korean glyph alignment, untouched background, and content-bounded overlays.
|
|
403
|
+
|
|
404
|
+
Across Developer surfaces, Ghostty owns the mouse: the wheel scrolls terminal
|
|
405
|
+
scrollback, ordinary drag selects text, and `Cmd+C` copies it. Wheel movement
|
|
406
|
+
never changes the selected list target; use `↑`/`↓` for selection. Potentially
|
|
407
|
+
long lists render every row as non-overlay surfaces, while complete two-choice
|
|
408
|
+
interruptions remain compact overlays.
|
|
409
|
+
|
|
410
|
+
Each scenario creates a fresh in-memory model. Activation events use the same
|
|
411
|
+
`applyDeveloperEvent` reducer and `DeveloperSettingsBinding` contract as the
|
|
412
|
+
production surface; no state is shared between scenario runs. The fixture does
|
|
413
|
+
not append entries, submit answers, register tools, mutate active tools, restore
|
|
414
|
+
sessions, start network work, or send model messages. Prepared answers are shown
|
|
415
|
+
only as a character count.
|
|
416
|
+
|
|
417
|
+
`check` validates package structure and deterministic behavior, including
|
|
418
|
+
reload migration detection and shutdown restoration of Developer-owned tool
|
|
419
|
+
deltas. `eval` launches the real Pi RPC surface without a model and covers
|
|
420
|
+
package resources, commands, activation state, and route-bound tool gating.
|
|
421
|
+
These are release-gating checks.
|
|
390
422
|
|
|
391
423
|
Model-dependent runs are probabilistic evaluations rather than binary tests:
|
|
392
424
|
|
|
393
425
|
```sh
|
|
394
426
|
PI_CODING_AGENT_DIR=~/.pi/agent \
|
|
395
|
-
DEVELOPER_EVAL_FIXTURE=agent-before-
|
|
427
|
+
DEVELOPER_EVAL_FIXTURE=agent-before-implementation-evidence-gate \
|
|
396
428
|
DEVELOPER_EVAL_TRIALS=5 \
|
|
397
429
|
pnpm --filter @hobin/developer eval:live
|
|
398
430
|
```
|
|
@@ -401,7 +433,7 @@ Use `eval:live:json` for the JSON transport. Each report separates the hard
|
|
|
401
433
|
admissibility envelope from routing quality: structurally valid runs must use an
|
|
402
434
|
admissible route, preserve mutation/question/completion invariants, satisfy
|
|
403
435
|
hidden artifact checks, include required semantic terms, and end in a declared
|
|
404
|
-
outcome. Among accepted runs, `
|
|
436
|
+
outcome. Among accepted runs, `preferredFirstTargets` measures better versus
|
|
405
437
|
merely admissible routing. Reports include acceptance and preference rates,
|
|
406
438
|
95% Wilson intervals, inadmissible results, rejected protocol attempts, budget
|
|
407
439
|
exhaustion, and environment failures. Any accepted inadmissible result makes the
|
|
@@ -411,8 +443,8 @@ rate. A single model sample is not release evidence.
|
|
|
411
443
|
Live fixtures classify terminal outcomes as `settled-unchanged`, `pending`,
|
|
412
444
|
`changed-paused`, or `changed-verified`. An eval-only observer compares
|
|
413
445
|
product-file snapshots around bash/edit/write calls and rejects artifact changes
|
|
414
|
-
outside
|
|
415
|
-
landing and an agent-owned before-
|
|
446
|
+
outside an implementation route. Dedicated fixtures sample a deliberately paused implementation
|
|
447
|
+
landing and an agent-owned before-implementation question resolved through a non-implementation
|
|
416
448
|
bash evidence route; their structural guarantees also have deterministic machine,
|
|
417
449
|
extension, trace, filesystem, and outcome tests. RPC and JSON runners share
|
|
418
450
|
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
|
```
|