steplog 0.10.0__tar.gz

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.
Files changed (68) hide show
  1. steplog-0.10.0/.gitignore +36 -0
  2. steplog-0.10.0/AGENTS.md +44 -0
  3. steplog-0.10.0/AGENT_PROTOCOL.md +489 -0
  4. steplog-0.10.0/Assets/Logo/README.md +18 -0
  5. steplog-0.10.0/CLAUDE.md +8 -0
  6. steplog-0.10.0/PKG-INFO +20 -0
  7. steplog-0.10.0/README.md +9 -0
  8. steplog-0.10.0/archive/README.md +1 -0
  9. steplog-0.10.0/docs/getting-started.html +345 -0
  10. steplog-0.10.0/docs/patches/example-prd-import.json +29 -0
  11. steplog-0.10.0/docs/steplog-design-brief.html +249 -0
  12. steplog-0.10.0/plugins/claude-code/.claude-plugin/marketplace.json +21 -0
  13. steplog-0.10.0/plugins/claude-code/.claude-plugin/plugin.json +10 -0
  14. steplog-0.10.0/plugins/claude-code/FEEDBACK.md +59 -0
  15. steplog-0.10.0/plugins/claude-code/KNOWN_LIMITATIONS.md +119 -0
  16. steplog-0.10.0/plugins/claude-code/README.md +99 -0
  17. steplog-0.10.0/plugins/claude-code/commands/steplog-archive.md +33 -0
  18. steplog-0.10.0/plugins/claude-code/commands/steplog-init.md +28 -0
  19. steplog-0.10.0/plugins/claude-code/commands/steplog-narrative.md +39 -0
  20. steplog-0.10.0/plugins/claude-code/commands/steplog-open.md +21 -0
  21. steplog-0.10.0/plugins/claude-code/commands/steplog-render.md +21 -0
  22. steplog-0.10.0/plugins/claude-code/commands/steplog-unarchive.md +30 -0
  23. steplog-0.10.0/plugins/claude-code/hooks/session-start.sh +89 -0
  24. steplog-0.10.0/plugins/claude-code/hooks/stop.sh +47 -0
  25. steplog-0.10.0/plugins/claude-code/scripts/check-skill-sync.py +243 -0
  26. steplog-0.10.0/plugins/claude-code/skills/steplog-protocol/SKILL.md +222 -0
  27. steplog-0.10.0/plugins/claude-code/templates/AGENTS.md +44 -0
  28. steplog-0.10.0/plugins/claude-code/templates/AGENT_PROTOCOL.md +489 -0
  29. steplog-0.10.0/plugins/claude-code/templates/CLAUDE.md +8 -0
  30. steplog-0.10.0/plugins/claude-code/templates/docs/patches/example-prd-import.json +29 -0
  31. steplog-0.10.0/plugins/claude-code/templates/scripts/hooks/pre-commit +133 -0
  32. steplog-0.10.0/plugins/claude-code/templates/src/steplog/cli.py +1981 -0
  33. steplog-0.10.0/plugins/claude-code/templates/src/steplog/gen.py +7461 -0
  34. steplog-0.10.0/plugins/claude-code/templates/src/steplog/migrations/000_introduce_versioning.py +78 -0
  35. steplog-0.10.0/plugins/claude-code/templates/src/steplog/migrations/README.md +97 -0
  36. steplog-0.10.0/plugins/claude-code/templates/state.schema.json +678 -0
  37. steplog-0.10.0/pyproject.toml +69 -0
  38. steplog-0.10.0/scripts/hooks/pre-commit +133 -0
  39. steplog-0.10.0/src/steplog/__init__.py +3 -0
  40. steplog-0.10.0/src/steplog/cli.py +1981 -0
  41. steplog-0.10.0/src/steplog/gen.py +7461 -0
  42. steplog-0.10.0/src/steplog/migrations/000_introduce_versioning.py +78 -0
  43. steplog-0.10.0/src/steplog/migrations/001_add_drift_config.py +59 -0
  44. steplog-0.10.0/src/steplog/migrations/002_feature_002_schema.py +126 -0
  45. steplog-0.10.0/src/steplog/migrations/003_feature_005_binding.py +60 -0
  46. steplog-0.10.0/src/steplog/migrations/004_feature_006_dashboard.py +68 -0
  47. steplog-0.10.0/src/steplog/migrations/006_add_ui_preferences_and_chip_archive.py +71 -0
  48. steplog-0.10.0/src/steplog/migrations/007_add_narrative.py +67 -0
  49. steplog-0.10.0/src/steplog/migrations/README.md +97 -0
  50. steplog-0.10.0/src/steplog/migrations/__init__.py +6 -0
  51. steplog-0.10.0/src/steplog/migrations/test/000_introduce_versioning_expected.json +22 -0
  52. steplog-0.10.0/src/steplog/migrations/test/000_introduce_versioning_input.json +22 -0
  53. steplog-0.10.0/src/steplog/migrations/test/001_add_drift_config_expected.json +23 -0
  54. steplog-0.10.0/src/steplog/migrations/test/001_add_drift_config_input.json +22 -0
  55. steplog-0.10.0/src/steplog/migrations/test/002_feature_002_schema_expected.json +66 -0
  56. steplog-0.10.0/src/steplog/migrations/test/002_feature_002_schema_input.json +52 -0
  57. steplog-0.10.0/src/steplog/migrations/test/003_feature_005_binding_expected.json +40 -0
  58. steplog-0.10.0/src/steplog/migrations/test/003_feature_005_binding_input.json +40 -0
  59. steplog-0.10.0/src/steplog/migrations/test/004_feature_006_dashboard_expected.json +40 -0
  60. steplog-0.10.0/src/steplog/migrations/test/004_feature_006_dashboard_input.json +40 -0
  61. steplog-0.10.0/src/steplog/migrations/test/006_add_ui_preferences_and_chip_archive_expected.json +59 -0
  62. steplog-0.10.0/src/steplog/migrations/test/006_add_ui_preferences_and_chip_archive_input.json +59 -0
  63. steplog-0.10.0/src/steplog/migrations/test/007_add_narrative_expected.json +43 -0
  64. steplog-0.10.0/src/steplog/migrations/test/007_add_narrative_input.json +43 -0
  65. steplog-0.10.0/src/steplog/migrations/test/fixtures/broken-prd-example-expected-findings.md +64 -0
  66. steplog-0.10.0/src/steplog/migrations/test/fixtures/broken-prd-example.md +75 -0
  67. steplog-0.10.0/src/steplog/migrations/test/run_tests.py +124 -0
  68. steplog-0.10.0/state.schema.json +678 -0
@@ -0,0 +1,36 @@
1
+ .DS_Store
2
+ __pycache__/
3
+ *.pyc
4
+
5
+ # Claude Code's local working directory — may contain session transcripts,
6
+ # settings.local.json (per-user permission grants), and other transient
7
+ # state. Default: ignore everything in .claude/, then re-include the
8
+ # project-shared settings.json so the Stop hook config ships with the repo.
9
+ .claude/*
10
+ !.claude/settings.json
11
+
12
+ # Reference material that lives in the repo but is not part of the project.
13
+ z-archive reference files/
14
+
15
+ # Steplog migration snapshots — local recovery points, per-clone safety
16
+ # net. The audit trail (MIGRATIONS.md) is what's shared in git; the
17
+ # actual snapshots stay on the operator's machine.
18
+ .steplog/backups/
19
+
20
+ # Feature-008 s_063: STATUS narrative patch scaffolds. Transient
21
+ # operator/agent workflow artifacts under .steplog/patches/<timestamp>.json
22
+ # generated by `steplog narrative --propose`. The applied state.json
23
+ # change is what's shared in git; the scaffold files stay local.
24
+ .steplog/patches/
25
+
26
+ # Feature-016 Phase 1 / s_066 (a_160): operator's editable-install venv.
27
+ # `pip install -e .` from the source clone creates this; the install is
28
+ # per-machine dogfood state, not shared in git.
29
+ .venv/
30
+
31
+ # Feature-016 Phase 2 / s_067 (a_163): wheel-build artifacts. `python -m
32
+ # build` produces dist/steplog-X.Y.Z-py3-none-any.whl + sdist.tar.gz here;
33
+ # `build/` is hatchling's intermediate scratch. Both regenerate from
34
+ # pyproject.toml + sources, so they don't belong in git.
35
+ dist/
36
+ build/
@@ -0,0 +1,44 @@
1
+ # Steplog (this project)
2
+
3
+ This project is governed by Steplog itself. Before doing anything else this
4
+ session, read AGENT_PROTOCOL.md at the repo root and follow it for the
5
+ whole session. The canonical state lives at .steplog/state.json. Validate
6
+ against state.schema.json after every write.
7
+
8
+ The canonical PRD is PRD/Steplog-PRD-v4.1.html. When in doubt about scope,
9
+ that wins. Feature-level specs live alongside it (PRD/feature-NNN-prd.md).
10
+ Operator-facing docs (getting-started, design brief) live in docs/.
11
+
12
+ After any meaningful work, run (preferred — works after `pip install -e .`):
13
+ steplog show
14
+ or, from a source clone without the editable install:
15
+ python3 -m steplog.gen .steplog/state.json state.schema.json > BUILD_LOG.html
16
+
17
+ ## Attribution and commit metadata
18
+
19
+ Operator policy: no AI-agent attribution in commits, source files, or
20
+ rendered output. Per-activity agent attribution lives in
21
+ `.steplog/state.json` via the `agent_id` field. The full rule (do-not
22
+ list and exceptions) is in AGENT_PROTOCOL.md → "Attribution and commit
23
+ metadata".
24
+
25
+ ## Local preview server quirks
26
+
27
+ When a session needs to live-test BUILD_LOG.html in a browser (e.g. clicking
28
+ a chip to verify drawer wiring), launch the HTTP server through `/bin/sh -c`
29
+ rather than calling `python3 -m http.server` directly via the IDE preview
30
+ button. Claude.app's `disclaimer` helper sits between the preview launcher
31
+ and the spawned process and can block the socket bind silently — the process
32
+ starts, the preview tool reports success, but `lsof -i :PORT` shows nothing
33
+ listening and `curl` returns connection refused. Wrapping in `/bin/sh -c
34
+ 'exec /opt/homebrew/bin/python3.13 -m http.server "$PORT" --directory ...'`
35
+ threads through the helper cleanly. Discovered during Session 1a's drawer-
36
+ wiring smoke test (a_069 has the diagnosis trail).
37
+
38
+ For DOM click tests, prefer `chip.click()` (the standard `HTMLElement.click()`
39
+ method) inside `mcp__Claude_Preview__preview_eval` rather than the
40
+ `mcp__Claude_Preview__preview_click` tool. `preview_click` does not reliably
41
+ trigger document-level delegated event listeners (which Steplog's drawer
42
+ dispatch relies on at `src/steplog/gen.py` — the dispatcher; line numbers
43
+ shift with edits, grep for `data-drawer` to find it); `chip.click()` does.
44
+ Surfaced during Session 1b smoke tests (a_073).
@@ -0,0 +1,489 @@
1
+ # AGENT_PROTOCOL.md
2
+
3
+ ## Attribution and commit metadata
4
+
5
+ The operator is the author of every commit on this project. Per-activity
6
+ agent attribution is captured in `.steplog/state.json` via the `agent_id`
7
+ field — that is the canonical record of which agent (claude-code,
8
+ claude-desktop, codex, cursor, human, etc.) produced each activity.
9
+ Commit metadata does not duplicate that signal.
10
+
11
+ Do NOT add to commit messages:
12
+ - `Co-Authored-By: Claude` or any AI-agent co-author trailer
13
+ - `Generated with Claude Code` or similar provenance tags
14
+ - Any signature block naming an AI agent
15
+
16
+ Do NOT add to source files, documentation, or rendered output:
17
+ - Comments stating "generated by an AI" or naming an AI tool
18
+ - Header blocks crediting an AI agent
19
+ - "Powered by" or similar markers in HTML / CSS / JS
20
+ - Attribution stamps in PRD documents or markdown files
21
+
22
+ Exceptions (preserve attribution as-is):
23
+ - Third-party vendor headers in auto-generated SDK files
24
+ - License notices required by upstream open-source dependencies
25
+ - Operator-authored/directed attribution the operator has explicitly written or asked for
26
+
27
+ If you (an agent) are uncertain whether a specific surface counts as
28
+ covered by this rule, ask before writing.
29
+
30
+ ## Project Context
31
+
32
+ You are working on a project that uses the Steplog build governance convention.
33
+ A canonical state file lives at `.steplog/state.json`. It is the project plan-of-record
34
+ and the build journal. You read it at session start and update it as you work — across
35
+ all stages of the work, not just at the shipped end.
36
+
37
+ > **For agents:** This file is the protocol. Most agents discover it via
38
+ > `AGENTS.md` at the repo root (or via `CLAUDE.md`, which is now a one-line
39
+ > pointer to AGENTS.md). Whichever doorway you came through, read this protocol
40
+ > in full before doing anything else this session — including before you
41
+ > read the canonical PRD or any feature PRD. Other agents on this project
42
+ > (Claude Code, Codex CLI, Cursor, Aider, etc.) follow the same rules; the
43
+ > goal is that any of them can pick up where the last one left off.
44
+
45
+ ## Session start ritual
46
+
47
+ 1. Read `.steplog/state.json`
48
+ 2. Identify all activities with `status="in_progress"` and the top of `next_actions[]`
49
+ 3. Note which `spec_sections` are mid-lifecycle (any stage `in_progress`)
50
+ 4. Propose to the user which item(s) to tackle this session
51
+ 5. Confirm before starting. Do not silently pick.
52
+
53
+ ## PRD Import ritual (only when starting a new project)
54
+
55
+ Run this once when bootstrapping Steplog onto a project that already has a
56
+ PRD but does not yet have `spec_sections` populated. Do not run on an
57
+ ongoing project — `spec_sections` is append-only by convention; reshaping
58
+ existing sections wholesale is a separate, hand-edited task.
59
+
60
+ The ritual:
61
+
62
+ 1. The operator names the PRD (e.g. `PRD/your-prd.md`, `docs/spec.html`,
63
+ any format you can read).
64
+ 2. **Read the PRD in full.** Do not skim. The translation from PRD → sections
65
+ is a judgement call the operator will check, so you need to understand
66
+ the document's structure and intent.
67
+ 3. Propose a list of sections. Each must include:
68
+ - `id` (next free `s_NNN`),
69
+ - `ref` (a pointer to the relevant PRD section, e.g. `your-prd.md §3`),
70
+ - `title` (short),
71
+ - `category` (one of: `core`, `security`, `enhancement`, `infrastructure`,
72
+ `research`, `compliance`),
73
+ - `intent_summary` (technical, ≤200 chars),
74
+ - `plain_summary` (plain language, second person, ≤200 chars, no jargon),
75
+ - `lifecycle` with all five stages set to `not_started`/`planned`/etc.
76
+ - `depends_on` and `prd_anchor` are optional but preferred.
77
+ 4. Output the proposal as a Steplog-native JSON patch:
78
+ ```json
79
+ {
80
+ "version": "0.6.0",
81
+ "ops": [
82
+ { "op": "add_sections", "sections": [ ... ] }
83
+ ]
84
+ }
85
+ ```
86
+ 5. Save the patch to a file (e.g. `/tmp/prd-import.json`) and tell the
87
+ operator how to apply it:
88
+ ```
89
+ steplog apply-patch /tmp/prd-import.json
90
+ ```
91
+ That dry-runs by default and prints the diff. The operator reviews and
92
+ either applies (`--apply`) or edits the JSON first.
93
+
94
+ You never write to state.json directly during PRD import. The operator
95
+ reviews every section before applying. If they reject any, edit the JSON
96
+ file and re-run the dry-run.
97
+
98
+ A sample patch lives at `docs/patches/example-prd-import.json` for reference.
99
+
100
+ ## PRD Review ritual (before any build work on a feature PRD)
101
+
102
+ Steplog has four drift-prevention layers. Three are automated and fire
103
+ on commits, turn-ends, or generator runs (the pre-commit hook, the
104
+ Stop hook, the drift detector). The fourth is this ritual: **a
105
+ structured review of the PRD itself before any build code is
106
+ committed**, run by the agent and reviewed by the operator. It catches
107
+ the class of drift the other three cannot see — a PRD that asserts
108
+ something about the repo that is not actually true.
109
+
110
+ History: introduced after the feature-006 review found a missing
111
+ mockup file, and again after Session 1a hit an `archive/` directory
112
+ the PRD assumed was tracked but was actually a personal-scratch
113
+ convention. Both were caught only because someone happened to look.
114
+ This ritual makes the looking systematic.
115
+
116
+ ### When the ritual fires
117
+
118
+ Fire the ritual when an operator asks you to begin build work on a
119
+ feature PRD — phrases like "implement this PRD," "start session N
120
+ of feature-X," "go," or any direct invocation of work on a feature
121
+ spec. Run it **before** any code or any modification of state.json
122
+ for that feature.
123
+
124
+ Also fire when an operator asks for a "review" of a PRD, or when
125
+ you encounter a PRD you have not previously verified during a
126
+ multi-session feature implementation.
127
+
128
+ Do **not** fire when reading a PRD for context only, when extending
129
+ or revising a PRD, or during normal feature-build sessions on
130
+ already-reviewed PRDs.
131
+
132
+ ### The five-category checklist
133
+
134
+ Address every item in every category. Produce the structured output
135
+ described below, even when nothing fails.
136
+
137
+ **1. File and path verification (mechanical)**
138
+ - Does every file path the PRD references exist in the repo, or is
139
+ it explicitly marked as new?
140
+ - Do referenced directories exist? (Including: do any have hidden
141
+ trailing whitespace, or are they untracked when assumed tracked?)
142
+ - Are documentation paths correct (e.g., `docs/getting-started.html`,
143
+ not `getting-started.html`)?
144
+ - Are referenced visual sources (mockups, screenshots, sketches)
145
+ actually present in the repo?
146
+
147
+ **2. Schema and version consistency (mechanical)**
148
+ - Do schema version bumps cited in the PRD match the actual current
149
+ schema version in `state.schema.json`?
150
+ - Do migration numbers proposed not conflict with existing migrations
151
+ in `src/steplog/migrations/`?
152
+ - Do field names match what is actually in the schema (`steplog_version`
153
+ vs `schema_version`, `archived_at` vs `archived`, etc.)?
154
+ - Do activity kinds, section categories, lifecycle stages, nudge tag
155
+ names referenced exist in the current schema, or are they explicitly
156
+ added by this PRD?
157
+
158
+ **3. Section and activity references (mechanical)**
159
+ - Do proposed section IDs not collide with already-allocated IDs in
160
+ `state.json.spec_sections[]`?
161
+ - Do references to existing sections point to sections that actually
162
+ exist?
163
+ - Do cross-references to other PRDs use canonical paths that match
164
+ the repo?
165
+
166
+ **4. Convention and history checks (judgment — the keystone)**
167
+ - **Does this PRD assume the repo is in a state it isn't actually
168
+ in?** Common sub-cases: gitignored vs tracked, file moved but not
169
+ committed, hook installed but not symlinked, directory exists but
170
+ is empty, file present but at unexpected path, directory name with
171
+ hidden whitespace.
172
+ - **Does this PRD overwrite or conflict with operator decisions from
173
+ earlier features?** Read git history if uncertain. Was a directory
174
+ or convention created with deliberate intent that this PRD would
175
+ silently overturn?
176
+ - **Is the agent making assumptions about operator intent that the
177
+ operator should confirm?** When an existing convention contradicts
178
+ the PRD's assumption, the question to surface is not "which is
179
+ right" but "did the operator intend the convention or not?"
180
+ - **Are there project-history considerations the PRD's author may
181
+ not have known about?** Old artifacts, scratch folders, prior
182
+ aborted features, decisions reflected in `MIGRATIONS.md`.
183
+
184
+ This category cannot be automated. It is the keystone of the ritual
185
+ and is permanently the agent's and operator's job.
186
+
187
+ **5. Terminology and tone (judgment)**
188
+ - Do operator-facing strings match the tone established in
189
+ `docs/steplog-design-brief.html` and `docs/getting-started.html`?
190
+ - Are both technical and plain registers present where required?
191
+ - Does the PRD use Steplog's canonical terminology consistently
192
+ ("sections" not "milestones", "activities" not "tasks", etc.)?
193
+
194
+ ### Output format
195
+
196
+ Produce a Markdown review document at `PRD/feature-NNN-prd-review.md`
197
+ containing:
198
+
199
+ 1. **Header.** PRD title, date, reviewer (your `agent_id`), repo
200
+ state (branch, commit, schema version).
201
+ 2. **Six numbered sections.** One per axis:
202
+ factual claims, design conflicts with existing features, cross-PRD
203
+ conflicts, open questions, counter-proposals, per-session risk
204
+ ranking. (The five-category checklist informs sections 1–3 and
205
+ parts of 5; sections 2/3/4/5/6 add the cross-cutting axes.)
206
+ 3. **Each finding has both registers.** Technical description
207
+ (what file/line/field) and plain description (what it means and
208
+ why it matters).
209
+ 4. **Counter-proposals are concrete.** When you find a problem,
210
+ propose specific PRD-language replacements ready to drop in.
211
+ 5. **Executive verdict.** One of three:
212
+ - **APPROVE** — no failures, no judgment items; build can begin.
213
+ - **APPROVE WITH REVISIONS** — failures present; path forward is
214
+ clear; PRD is revised, then build proceeds.
215
+ - **BLOCK** — failures present and the path forward is not clear;
216
+ the operator must adjudicate before any further action.
217
+ 6. **Action list** — flat list of recommendations the operator
218
+ should action.
219
+
220
+ The recommendation is yours; the decision is the operator's. Do not
221
+ proceed with build work until the operator approves a path forward.
222
+
223
+ ### Exit conditions
224
+
225
+ Log the review as a `review` activity in `state.json`, with `tags`
226
+ including `prd-review` and the PRD's feature label (e.g.
227
+ `feature-009`). The activity's `summary` carries the technical
228
+ register; `plain_description` carries the plain register. Both old
229
+ and new content of any counter-proposed PRD passages can live in
230
+ `summary` for the audit trail.
231
+
232
+ A migration is **not** added — the existing `review` activity kind
233
+ covers the use case. A more specific `prd_review` kind may be
234
+ introduced later; for now, filter by `kind=review AND tags includes
235
+ 'prd-review'`.
236
+
237
+ ## Activity kinds — what to log, and when
238
+
239
+ Every meaningful unit of work is an activity. Pick the right kind:
240
+
241
+ | kind | when to use |
242
+ | ----------------- | ----------------------------------------------------------------- |
243
+ | `spec_draft` | You authored a new PRD section or major sub-section |
244
+ | `spec_revision` | You edited an existing section in a way that changes scope |
245
+ | `design_decision` | You picked an architecture, schema, UX, or stack approach |
246
+ | `exploration` | You ran a research spike or prototype that did not ship |
247
+ | `build_step` | You completed a meaningful unit of implementation |
248
+ | `test_result` | A test pass or fail worth recording |
249
+ | `bug_fix` | You identified and resolved a defect |
250
+ | `review` | You completed a code, spec, or design review |
251
+ | `ship_event` | You deployed, released, or flagged something on |
252
+ | `note` | Anything else worth recording for future context |
253
+
254
+ Threshold: *"would a future agent need this to understand the project?"*
255
+ Do NOT log every commit, every file edit, or every tool call.
256
+
257
+ ## How to log an activity
258
+
259
+ 1. Read `.steplog/state.json`
260
+ 2. Append to `activities[]` with an incremented id (`a_001`, `a_002`, ...)
261
+ 3. Set `kind`, `status`, and `spec_section` (link to the `s_NNN` it advances)
262
+ 4. Set `status="in_progress"` when starting, `"done"` when finished
263
+ 5. Always include: `id`, `kind`, `status`, `title`, `agent` (your label)
264
+ 6. Include `artifacts` when they exist: commit SHAs, file paths, URLs
265
+ 7. If a `design_decision`, also append to `decisions[]` and set `decision_id`
266
+
267
+ ## Advancing the lifecycle
268
+
269
+ Each `spec_section` has a lifecycle map: `spec`, `design`, `build`, `ship`,
270
+ and (from 0.6.0) `prod`. When you complete an activity that finishes a
271
+ stage for a section, update that section's lifecycle entry from
272
+ `in_progress` to `done`. Move the next stage from `not_started` to
273
+ `planned` (or `in_progress` if you start it).
274
+
275
+ ### Invariant: stable sections have no in-flight stages
276
+
277
+ When `section.status == "stable"`, every lifecycle stage on that section
278
+ must be either `done` or `not_started`. A `stable` section with any stage
279
+ at `planned` or `in_progress` is a contradiction — either the work isn't
280
+ actually done, or the lifecycle entry is stale and needs to be advanced.
281
+
282
+ The renderer enforces this via the `lifecycle_stuck_under_stable` nudge
283
+ rule (see state.schema.json `x-nudge-rules`): on every render, sections
284
+ that violate the invariant surface as a yellow nudge card with the list
285
+ of affected sections. Either advance the stage to `done`, drop the
286
+ section's `status` back to `drafting` until the stage lands, or — for a
287
+ documented deferral on a polish item — mark the nudge as reviewed and
288
+ note the parked work in `intent_summary`.
289
+
290
+ This rule was added the first time the operator caught the BUILD MAP
291
+ showing stale ship-stage entries on settled sections (2026-05-09). The
292
+ fix isn't to clean up by hand each time; it's to surface the drift on
293
+ every render so it can't accumulate silently.
294
+
295
+ ## Maintaining the forward queue
296
+
297
+ `next_actions[]` is not optional. It is how the next session knows where to start.
298
+
299
+ - When you finish an activity, prune any `next_actions[]` items it satisfied
300
+ - When you discover work that should happen later, append to `next_actions[]`
301
+ - At session end, ensure `next_actions[]` has at least 3 items so the next session
302
+ opens with a queue, not a blank page
303
+
304
+ ## Proactive STATUS narrative updates
305
+
306
+ The top of the dashboard is the STATUS module: four short prose blocks
307
+ (`headline`, `just_shipped`, `in_progress`, `up_next`) stored at the
308
+ top-level `narrative` key in `.steplog/state.json`. They are the
309
+ operator's plain-English summary of where the project is — written for a
310
+ human glance, not for downstream tooling. Section lifecycle and
311
+ activities are what's *factually* true; the narrative is what the
312
+ operator *says* about it.
313
+
314
+ ### When to propose an update
315
+
316
+ At end-of-session, if any of the following landed during the session,
317
+ propose a narrative update before you hand off:
318
+
319
+ - A `ship_event` activity (a section just moved through `lifecycle.ship = done`)
320
+ - A `prod_event` activity (a section just moved through `lifecycle.prod = done`)
321
+ - A `test_result` or `spec_revision` activity tagged as a milestone
322
+ (operator-judged — when in doubt, ask)
323
+ - A `design_decision` that meaningfully reframes what the project is doing
324
+
325
+ The narrative must stay synchronized with the underlying state. If the
326
+ last shipped section in `just_shipped` no longer matches what `lifecycle`
327
+ shows, the narrative is stale and the dashboard will surface a
328
+ `narrative_stale` nudge.
329
+
330
+ ### How to propose
331
+
332
+ Use the CLI scaffold rather than hand-editing `narrative` in
333
+ `state.json`:
334
+
335
+ ```bash
336
+ steplog narrative --propose \
337
+ --blocks just_shipped,in_progress,up_next \
338
+ --by claude-code
339
+ ```
340
+
341
+ This writes a patch scaffold to `.steplog/patches/narrative-<timestamp>.json`
342
+ containing `set_narrative_block` ops with placeholder text plus a
343
+ companion `add_activity` op (kind=`narrative_update`). Edit the
344
+ placeholder text in the scaffold, then dry-run + apply via
345
+ `steplog apply-patch`. The Claude Code plugin exposes this same flow as
346
+ `/steplog-narrative`.
347
+
348
+ ### Approval rule
349
+
350
+ **The operator approves narrative content before it lands.** Steplog is
351
+ capture-not-brain: agents do not write project-level prose unilaterally.
352
+ Propose the scaffold, show the operator the proposed text + rationale,
353
+ and apply only after explicit approval. The one documented exception is
354
+ a session that has a pre-authorized autonomous run — and even then, the
355
+ operator's next QA pass functions as retroactive content review, and the
356
+ proposal+rationale must still be captured in the `narrative_update`
357
+ activity summary.
358
+
359
+ ### What good narrative looks like
360
+
361
+ - **headline** (≤140 chars): one sentence on the project's current state
362
+ - **just_shipped** (≤300 chars): what landed recently, plain-English
363
+ - **in_progress** (≤300 chars): what's actively being worked on right now
364
+ - **up_next** (≤300 chars): the next 1–3 things on deck
365
+
366
+ Plain-English, no internal section IDs in the prose itself (those are
367
+ already linked elsewhere), no version numbers unless they're
368
+ operator-facing. Write for a non-expert collaborator catching up after a
369
+ week away.
370
+
371
+ ## Tags that trigger nudges
372
+
373
+ When you tag an activity with any of `[auth, secret, pii, payment, db, migration, deploy]`,
374
+ the system surfaces a question to the user. Add the tag honestly. Do not omit tags
375
+ to avoid the prompt.
376
+
377
+ ## Security inventory
378
+
379
+ `.steplog/state.json` includes a top-level `security_inventory` object that catalogues
380
+ the project's security-relevant assets. Hand-curated by the agent and the operator as
381
+ the project evolves — not auto-detected. It pairs with the tag-trigger nudges above:
382
+ tags surface the *event*; the inventory tracks the *state of the world*. The renderer
383
+ surfaces both in BUILD_LOG.html.
384
+
385
+ ### The four buckets
386
+
387
+ | bucket | what goes in |
388
+ | --------------- | ------------------------------------------------------------------------------------ |
389
+ | `env_vars` | Environment variables the project relies on (names + where, never values) |
390
+ | `secrets` | Named credentials, API keys, signing keys (referenced by vault path / URL, never stored) |
391
+ | `hook_scripts` | Versioned hooks (git, Claude Code, etc.) — anything that runs automatically |
392
+ | `settings` | Config files that affect security posture: Claude Code config, sensitive `.gitignore` patterns |
393
+
394
+ Empty buckets are fine. Omit a bucket when it has no entries.
395
+
396
+ ### Entry shape
397
+
398
+ Every entry conforms to `$defs/security_entry`:
399
+
400
+ ```json
401
+ {
402
+ "id": "env_001", // required, pattern (env|sec|hk|set)_NNN
403
+ "name": "STRIPE_KEY", // required, human label
404
+ "kind": "api_key", // optional sub-classifier
405
+ "description": "Production Stripe API key.", // optional, 1–2 sentences
406
+ "severity": "high", // low | medium | high
407
+ "ref": "1password://vault/stripe-prod", // path / URL / vault ref — NEVER the value
408
+ "rotated_at": "2026-04-15T00:00:00Z", // optional, surfaces stale entries later
409
+ "added_at": "2026-05-08T00:00:00Z"
410
+ }
411
+ ```
412
+
413
+ ### ID conventions
414
+
415
+ IDs are bucket-prefixed and zero-padded. Stable once assigned.
416
+
417
+ | prefix | bucket |
418
+ | ------- | --------------- |
419
+ | `env_` | `env_vars` |
420
+ | `sec_` | `secrets` |
421
+ | `hk_` | `hook_scripts` |
422
+ | `set_` | `settings` |
423
+
424
+ Numbering is per-bucket. `env_001`, `env_002`, ...; `sec_001`, `sec_002`, ...; etc.
425
+
426
+ ### When to add an entry
427
+
428
+ Threshold: *would losing track of this surface a security risk?*
429
+
430
+ Add when:
431
+
432
+ - A new env var or secret enters the project's runtime
433
+ - You introduce a hook (git or Claude Code) that runs automatically
434
+ - You add a config file that affects what crosses trust boundaries
435
+ - You add a `.gitignore` pattern that exists *to prevent secret leakage* (e.g., `*.env`, `*.pem`, `secrets/`)
436
+
437
+ Do NOT add entries for: code files (already tracked by git), generic config with no
438
+ security implication, build artifacts, or transient files.
439
+
440
+ ### Severity heuristics
441
+
442
+ | severity | when to use |
443
+ | ---------- | -------------------------------------------------------------------------------------- |
444
+ | `low` | Informational — local enforcement scripts, gitignore patterns, dev-only config |
445
+ | `medium` | Review periodically — tokens with limited blast radius, internal services |
446
+ | `high` | Touches production secrets, payment data, real user PII, or production auth |
447
+
448
+ When in doubt, start at `low` and raise as the surface grows.
449
+
450
+ ### Linking sections to inventory entries
451
+
452
+ `spec_sections[]` items can include an optional `security.uses` array referencing entry IDs:
453
+
454
+ ```json
455
+ {
456
+ "id": "s_004",
457
+ "title": "Pre-commit hook",
458
+ "security": { "uses": ["hk_001"] }
459
+ }
460
+ ```
461
+
462
+ This drives the BUILD_LOG.html "X sections touch sensitive surface" strap and lets readers
463
+ see which sections of the project touch which security assets.
464
+
465
+ ### Inventory rules of thumb
466
+
467
+ - Never store secret *values* in `state.json` — only references
468
+ - Update `rotated_at` when you rotate a credential
469
+ - Prune entries when an asset is permanently retired; do not silently leave dead entries
470
+
471
+ ## What you must NEVER do
472
+
473
+ - Edit existing activity entries except to update `status`, `completed_at`, or `artifacts`
474
+ - Delete decisions, `nudges_log` entries, or historical activities
475
+ - Make judgments about whether the user's code or design is "good" or "secure" in the
476
+ log itself. Capture facts. Let the user decide.
477
+ - Store secret values in `security_inventory` entries. Only references (paths, vault URLs,
478
+ env file locations) — never the secret itself.
479
+
480
+ ## Before you commit
481
+
482
+ Run:
483
+
484
+ ```
485
+ steplog show
486
+ ```
487
+ (equivalent: `python3 -m steplog.gen .steplog/state.json state.schema.json > BUILD_LOG.html`)
488
+
489
+ The pre-commit hook will block the commit if `state.json` was not updated since the last commit.
@@ -0,0 +1,18 @@
1
+ # Steplog Signal Steps Logo
2
+
3
+ Selected direction: **Signal Steps**.
4
+
5
+ Files:
6
+
7
+ - `steplog-signal-steps-lockup.svg` - primary full lockup for light backgrounds.
8
+ - `steplog-signal-steps-icon.svg` - app icon / favicon / compact mark.
9
+ - `steplog-signal-steps-dark-lockup.svg` - lockup on a dark badge.
10
+ - `steplog-signal-steps-mono.svg` - monochrome-safe icon.
11
+
12
+ Palette:
13
+
14
+ - Ink: `#111318`
15
+ - Green: `#22C55E`
16
+ - Blue: `#38BDF8`
17
+ - Amber: `#F59E0B`
18
+ - Slate: `#64748B`
@@ -0,0 +1,8 @@
1
+ # CLAUDE.md → see AGENTS.md
2
+
3
+ Steplog uses [AGENTS.md](AGENTS.md) as its canonical agent-instruction
4
+ file. This stub exists only so Claude Code's auto-discovery convention
5
+ still finds something at `CLAUDE.md`.
6
+
7
+ If you're an agent reading this: read AGENTS.md (and AGENT_PROTOCOL.md
8
+ at the repo root) before doing anything else this session.
@@ -0,0 +1,20 @@
1
+ Metadata-Version: 2.4
2
+ Name: steplog
3
+ Version: 0.10.0
4
+ Summary: Build governance for AI-assisted projects — state.json + plain-English dashboard.
5
+ Author: Steplog
6
+ License: MIT
7
+ Keywords: agent-protocol,build-log,governance,steplog
8
+ Requires-Python: >=3.9
9
+ Requires-Dist: jsonschema>=4.0
10
+ Description-Content-Type: text/markdown
11
+
12
+ <img src="Assets/Logo/steplog-signal-steps-icon.svg" alt="Steplog" width="32" height="32" align="left" style="margin-right: 8px;">
13
+
14
+ # Steplog
15
+
16
+ Build governance for solo agentic builders. Capture/nudge, not brain. Cross-agent portable.
17
+
18
+ The Claude Code plugin lives at [`plugins/claude-code/`](./plugins/claude-code) — start with [its README](./plugins/claude-code/README.md) if you're installing.
19
+
20
+ For the design philosophy, read [`docs/steplog-design-brief.html`](./docs/steplog-design-brief.html). For the operator's getting-started guide, [`docs/getting-started.html`](./docs/getting-started.html).
@@ -0,0 +1,9 @@
1
+ <img src="Assets/Logo/steplog-signal-steps-icon.svg" alt="Steplog" width="32" height="32" align="left" style="margin-right: 8px;">
2
+
3
+ # Steplog
4
+
5
+ Build governance for solo agentic builders. Capture/nudge, not brain. Cross-agent portable.
6
+
7
+ The Claude Code plugin lives at [`plugins/claude-code/`](./plugins/claude-code) — start with [its README](./plugins/claude-code/README.md) if you're installing.
8
+
9
+ For the design philosophy, read [`docs/steplog-design-brief.html`](./docs/steplog-design-brief.html). For the operator's getting-started guide, [`docs/getting-started.html`](./docs/getting-started.html).
@@ -0,0 +1 @@
1
+ archive/ holds v1 backups of Steplog's tracked documentation. When a doc gets a v2 revision, the v1 lands here. Personal reference materials live elsewhere; this directory is for project artifacts only.