@zalom/plastic 1.0.0-beta.32 → 1.0.0-beta.33

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/PLASTIC.md CHANGED
@@ -329,10 +329,12 @@ is a named, ordered, delivery-side collection of intents: the delivery-side coun
329
329
  release (completion-side, tracked in `CHANGELOG.md`). Use `plastic-roadmap` to create, order,
330
330
  close, and consume one.
331
331
 
332
- File location: `roadmaps/{slug}.md`, a store-root sibling of `INDEX.md`, identical in the global
333
- store (`~/.plastic/store/`) and any project store (`~/.plastic/projects/{slug}/store/`).
334
- `roadmaps/` lists only live (open or in-flight) roadmaps: once a roadmap's goal is reached, it
335
- moves to `roadmaps/archived/{slug}.md`, a sibling subdirectory scaffolded once with a `.gitkeep`.
332
+ File location: `roadmaps/{slug}.md`, a sibling of `INDEX.md`, wherever `INDEX.md` lives, never
333
+ inside `store/` (store holds intent directories, not project artifacts). For a project that is its
334
+ root, `~/.plastic/projects/{slug}/roadmaps/`, beside `project.yml`; for the global tier it is
335
+ `~/.plastic/roadmaps/`, beside `~/.plastic/INDEX.md`. `roadmaps/` lists only live (open or
336
+ in-flight) roadmaps: once a roadmap's goal is reached, it moves to `roadmaps/archived/{slug}.md`,
337
+ a sibling subdirectory scaffolded once with a `.gitkeep`.
336
338
 
337
339
  A roadmap file has four sections, in order: a title/meta header, `## Goal`, `## Waves`, and an
338
340
  append-only dated `## Log`. `## Goal` is a checkable prose condition read by a human or agent, not
@@ -345,8 +347,9 @@ on any conflict INDEX wins and the roadmap entry is corrected to match.
345
347
 
346
348
  **Human-comprehension surface.** A roadmap is also written to be read cold. Wave entries render as
347
349
  checkboxes (checked once delivered, unchecked otherwise) next to the status token, and each `## Log`
348
- line is one plain-language sentence, dated, written the way an engineering manager would brief a
349
- non-expert executive: what shipped and why it matters, no jargon or codenames, ending with a link
350
+ line is one plain-language sentence, starting `YYYY-MM-DD HH:MM UTC`, written the way an
351
+ engineering manager would brief a non-expert executive: what shipped and why it matters, no jargon
352
+ or codenames, ending with a link
350
353
  to that intent's `outcome.md`. The log points at the detail instead of repeating it, so a person
351
354
  opening the file with no other context can tell what shipped, what is running now, and what is
352
355
  next in under a minute.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zalom/plastic",
3
- "version": "1.0.0-beta.32",
3
+ "version": "1.0.0-beta.33",
4
4
  "description": "Intent-driven idea development system for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
package/scripts/update.rb CHANGED
@@ -53,18 +53,22 @@ class Update < InstallerCore
53
53
  end
54
54
  puts "\u{2b06}\u{fe0f} Updating Plastic #{iv} \u{2192} #{res[:target]}"
55
55
  exit_code = perform_switch(res[:target], agent_args(argv))
56
- run_post_update_doctor if exit_code == 0
56
+ run_post_update_doctor(full: argv.include?("--full-doctor")) if exit_code == 0
57
57
  exit_code
58
58
  end
59
59
  end
60
60
 
61
- # Run the full doctor after a successful update and print a human-readable
62
- # summary. Informational only: does not raise and does not affect the update's
63
- # exit code. Accepts injected `doctor` and `out` for hermetic unit tests.
64
- def run_post_update_doctor(doctor: nil, out: $stdout)
61
+ # Run doctor after a successful update and print a human-readable summary.
62
+ # Defaults to the fast core tier (agent registration + core files + manifest
63
+ # sync, binary pass|fail, no store walk) so a newcomer's first post-update
64
+ # run is not buried in convention warns they cannot act on. `full: true`
65
+ # (via `--full-doctor`) runs the complete store walk instead. Informational
66
+ # only: does not raise and does not affect the update's exit code. Accepts
67
+ # injected `doctor` and `out` for hermetic unit tests.
68
+ def run_post_update_doctor(doctor: nil, out: $stdout, full: false)
65
69
  doctor ||= Doctor.new
66
- out.puts "\nRunning full doctor after update..."
67
- result = doctor.run_checks("claude")
70
+ out.puts full ? "\nRunning full doctor after update..." : "\nRunning core doctor after update..."
71
+ result = full ? doctor.run_checks("claude") : doctor.run_core_checks("claude")
68
72
  s = result[:summary]
69
73
  out.puts " Doctor status: #{result[:status]} " \
70
74
  "(pass: #{s[:pass]}, warn: #{s[:warn]}, fail: #{s[:fail]}, total: #{s[:total]})"
@@ -152,6 +156,11 @@ class Update < InstallerCore
152
156
  Agent options (default: --claude):
153
157
  --claude --codex --hermes --all
154
158
 
159
+ Post-update doctor:
160
+ By default, a successful update runs the fast core doctor sync (agent
161
+ registration, core files, manifest — binary pass|fail, no store walk).
162
+ --full-doctor Run the full doctor (complete store walk) after updating.
163
+
155
164
  Behaviour:
156
165
  No flag advances to the next version on your current channel. Switching toward a
157
166
  more stable channel is frictionless; switching toward bleeding edge is confirmed.
@@ -6,9 +6,11 @@ description: Use when the user wants to plan a delivery batch, order waves of in
6
6
  # Roadmap
7
7
 
8
8
  A roadmap is a named, ordered, delivery-side collection of intents: the delivery-side counterpart
9
- to a release (completion-side, `CHANGELOG.md`). It lives at `roadmaps/{slug}.md`, a store-root
10
- sibling of `INDEX.md`, in both the global store (`~/.plastic/store/`) and any project store
11
- (`~/.plastic/projects/{slug}/store/`).
9
+ to a release (completion-side, `CHANGELOG.md`). It lives at `roadmaps/{slug}.md`, a sibling of
10
+ `INDEX.md` wherever `INDEX.md` lives: the global tier's `~/.plastic/roadmaps/` (beside
11
+ `~/.plastic/INDEX.md`), or a project's root, `~/.plastic/projects/{slug}/roadmaps/` (beside that
12
+ project's `INDEX.md` and `project.yml`). It never sits inside `store/`, which holds intent
13
+ directories, not project artifacts.
12
14
 
13
15
  A roadmap file has four parts: a title/meta header, `## Goal` (prose), `## Waves` (ordered; entries
14
16
  inside a wave are parallel-safe, waves run sequentially), and an append-only dated `## Log`. Each
@@ -37,8 +39,9 @@ verb above.
37
39
 
38
40
  ## Notes
39
41
 
40
- - File location and the four-section shape are identical across stores; do not invent a different
41
- layout per project.
42
+ - File location and the four-section shape are identical across tiers; do not invent a different
43
+ layout per project. The general rule: `roadmaps/` is a sibling of `INDEX.md`, wherever `INDEX.md`
44
+ lives.
42
45
  - `## Goal` is a checkable prose condition read by a human or agent, not an executable checker.
43
46
  - Wave entries render as checkboxes (`- [x] ... — delivered` / `- [ ] ... — <status>`); a human
44
47
  reading cold should see shipped/running/next within a minute. `## Log` lines are one-sentence,
@@ -2,10 +2,12 @@
2
2
 
3
3
  ## Location
4
4
 
5
- `roadmaps/{slug}.md`, a store-root sibling of `INDEX.md`. Same layout in the global store
6
- (`~/.plastic/store/roadmaps/{slug}.md`) and any project store
7
- (`~/.plastic/projects/{slug}/store/roadmaps/{slug}.md`). Create the `roadmaps/` directory the
8
- first time a store gets a roadmap.
5
+ `roadmaps/{slug}.md`, a sibling of `INDEX.md`, wherever `INDEX.md` lives. For the global tier
6
+ that is `~/.plastic/roadmaps/{slug}.md` (beside `~/.plastic/INDEX.md`); for any project it is
7
+ that project's root, `~/.plastic/projects/{slug}/roadmaps/{slug}.md` (beside that project's
8
+ `INDEX.md` and `project.yml`). `roadmaps/` never sits inside `store/`: `store/` holds intent
9
+ directories, not project artifacts. Create the `roadmaps/` directory the first time a tier gets a
10
+ roadmap.
9
11
 
10
12
  `roadmaps/` lists only live (open or in-flight) roadmaps. Once a roadmap's `## Goal` is reached,
11
13
  its file moves to `roadmaps/archived/{slug}.md` (see Close/archive in `operations.md`); the
@@ -14,7 +16,7 @@ its file moves to `roadmaps/archived/{slug}.md` (see Close/archive in `operation
14
16
  ## The four sections (in order)
15
17
 
16
18
  1. **Title/meta header** — `# Roadmap: <name>` plus a one-line meta sentence naming what the
17
- roadmap delivers and which store it lives in.
19
+ roadmap delivers and which tier (project or global) it lives in.
18
20
  2. **`## Goal`** — a checkable prose condition: one or a few sentences a human or coordinator reads
19
21
  to decide the roadmap is done. Not an executable checker, not a list of tasks.
20
22
  3. **`## Waves`** — ordered waves (`### Wave 1`, `### Wave 2`, ...). Entries inside a wave are
@@ -49,12 +51,13 @@ it. The roadmap never sets a status that INDEX does not already reflect.
49
51
 
50
52
  ## Log line shape
51
53
 
52
- One line per event, dated, in plain-language EM-to-CTO voice: what shipped and why it matters to a
53
- non-expert reader, no jargon or internal codenames, ending with a link to that entry-intent's
54
- `outcome.md`:
54
+ One line per event, starting `YYYY-MM-DD HH:MM UTC` (human-readable, sortable, zone-explicit so
55
+ same-day parallel deliveries can still be ordered), in plain-language EM-to-CTO voice: what shipped
56
+ and why it matters to a non-expert reader, no jargon or internal codenames, ending with a link to
57
+ that entry-intent's `outcome.md`:
55
58
 
56
59
  ```
57
- - <YYYY-MM-DD> <one plain-language sentence: what shipped, its impact> — see store/<id>--<slug>/outcome.md
60
+ - <YYYY-MM-DD HH:MM UTC> <one plain-language sentence: what shipped, its impact> — see store/<id>--<slug>/outcome.md
58
61
  ```
59
62
 
60
63
  The log line never restates `outcome.md` detail; it points at it (lossless-by-reference). This
@@ -83,6 +86,6 @@ abandoned | blocked); INDEX wins on any conflict.
83
86
  - [x] 124 Roadmap feature — delivered
84
87
 
85
88
  ## Log
86
- - 2026-07-06 Shipped the bash-gate redirect fix so quoted arrows and heredoc trailers stop
87
- blocking legitimate commits — see store/121--fix-bash-gate-redirect-parsing/outcome.md.
89
+ - 2026-07-06 14:32 UTC Shipped the bash-gate redirect fix so quoted arrows and heredoc trailers
90
+ stop blocking legitimate commits — see store/121--fix-bash-gate-redirect-parsing/outcome.md.
88
91
  ```
@@ -10,14 +10,16 @@ next" in under a minute, just from this one file.
10
10
  ## Create
11
11
 
12
12
  1. Pick a `slug` (kebab-case, descriptive) and a `title`.
13
- 2. Resolve the store root (global `~/.plastic/store/` or the current project's
14
- `~/.plastic/projects/{slug}/store/`); create `roadmaps/` inside it if it does not exist yet.
13
+ 2. Resolve the tier root: the directory that holds `INDEX.md` (a project's root, beside
14
+ `project.yml`, or `~/.plastic/` for the global tier). `roadmaps/` is always a sibling of
15
+ `INDEX.md`, never inside `store/`. Create `roadmaps/` there if it does not exist yet.
15
16
  3. Copy `templates/roadmap.md` to `roadmaps/{slug}.md`.
16
17
  4. Fill the header (`# Roadmap: <title>` + the one-line meta) and write a real `## Goal` prose
17
18
  condition.
18
19
  5. Add at least one `## Waves` wave with real entries (see Add / reorder below), each entry's
19
20
  status mirroring that intent's current `INDEX.md` status.
20
- 6. Append the first `## Log` line, a short dated plain-language note that the roadmap was created.
21
+ 6. Append the first `## Log` line, a short `YYYY-MM-DD HH:MM UTC`-prefixed plain-language note
22
+ that the roadmap was created.
21
23
 
22
24
  ## Add / reorder entries
23
25
 
@@ -29,7 +31,7 @@ next" in under a minute, just from this one file.
29
31
  entries) earlier or later. Reordering never changes an entry's status; it only changes when the
30
32
  entry is eligible to run.
31
33
  - After any add/reorder, append a `## Log` line describing the change (e.g.
32
- `- <YYYY-MM-DD> added 132 to wave 2`).
34
+ `- <YYYY-MM-DD HH:MM UTC> added 132 to wave 2`).
33
35
 
34
36
  ## Sync status mirror
35
37
 
@@ -46,8 +48,8 @@ next" in under a minute, just from this one file.
46
48
 
47
49
  ## Append a log line
48
50
 
49
- - One line per event, dated `YYYY-MM-DD`, appended at the bottom of `## Log`. Never edit or delete
50
- an existing line (append-only).
51
+ - One line per event, starting `YYYY-MM-DD HH:MM UTC`, appended at the bottom of `## Log`. Never
52
+ edit or delete an existing line (append-only).
51
53
  - Every line is plain language a non-expert can read, never a codename or a raw `field -> value`.
52
54
  A delivery event follows the EM-to-CTO one-line shape with an `outcome.md` link (see
53
55
  `file-format.md`); bookkeeping events (created, an intent added to a wave, a wave completed, a
@@ -68,7 +70,9 @@ next" in under a minute, just from this one file.
68
70
 
69
71
  1. Confirm the roadmap's `## Goal` prose condition is met (every entry `delivered` or explicitly
70
72
  `abandoned` with a recorded reason, plus whatever else the goal states).
71
- 2. Create `roadmaps/archived/` in the store root if it does not exist yet.
73
+ 2. Create `roadmaps/archived/` beside `roadmaps/` (both siblings of `INDEX.md`) if it does not
74
+ exist yet.
72
75
  3. Move the file: `roadmaps/{slug}.md` -> `roadmaps/archived/{slug}.md`. `roadmaps/` itself then
73
76
  lists only live (open or in-flight) roadmaps.
74
- 4. Append the final `## Log` line before or as part of the move: `- <YYYY-MM-DD> roadmap closed`.
77
+ 4. Append the final `## Log` line before or as part of the move:
78
+ `- <YYYY-MM-DD HH:MM UTC> roadmap closed`.
@@ -1,8 +1,9 @@
1
1
  # Roadmap: <name>
2
2
 
3
- (one-line meta: what this roadmap delivers, and which store it lives in. When this roadmap's goal
4
- is reached, move this file from `roadmaps/{slug}.md` to `roadmaps/archived/{slug}.md`; `roadmaps/`
5
- itself lists only live roadmaps.)
3
+ (one-line meta: what this roadmap delivers, and which tier it lives in. `roadmaps/` is a sibling
4
+ of `INDEX.md` a project's root or the global `~/.plastic/`, never inside `store/`. When this
5
+ roadmap's goal is reached, move this file from `roadmaps/{slug}.md` to
6
+ `roadmaps/archived/{slug}.md`; `roadmaps/` itself lists only live roadmaps.)
6
7
 
7
8
  ## Goal
8
9
  (a checkable prose condition — one or a few sentences a human or coordinator reads to decide the
@@ -26,4 +27,4 @@ any conflict between the checkbox/token here and INDEX's real status.
26
27
  what shipped and its impact for a non-expert reader, no jargon or internal codenames, ending with a
27
28
  link to that entry-intent's `outcome.md`. Never restate outcome detail here; link to it instead.
28
29
  Newest at the bottom.)
29
- - 2026-01-01 Shipped the first wave of this roadmap; see store/<intent-id>--<slug>/outcome.md.
30
+ - 2026-01-01 00:00 UTC Shipped the first wave of this roadmap; see store/<intent-id>--<slug>/outcome.md.