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.
- steplog-0.10.0/.gitignore +36 -0
- steplog-0.10.0/AGENTS.md +44 -0
- steplog-0.10.0/AGENT_PROTOCOL.md +489 -0
- steplog-0.10.0/Assets/Logo/README.md +18 -0
- steplog-0.10.0/CLAUDE.md +8 -0
- steplog-0.10.0/PKG-INFO +20 -0
- steplog-0.10.0/README.md +9 -0
- steplog-0.10.0/archive/README.md +1 -0
- steplog-0.10.0/docs/getting-started.html +345 -0
- steplog-0.10.0/docs/patches/example-prd-import.json +29 -0
- steplog-0.10.0/docs/steplog-design-brief.html +249 -0
- steplog-0.10.0/plugins/claude-code/.claude-plugin/marketplace.json +21 -0
- steplog-0.10.0/plugins/claude-code/.claude-plugin/plugin.json +10 -0
- steplog-0.10.0/plugins/claude-code/FEEDBACK.md +59 -0
- steplog-0.10.0/plugins/claude-code/KNOWN_LIMITATIONS.md +119 -0
- steplog-0.10.0/plugins/claude-code/README.md +99 -0
- steplog-0.10.0/plugins/claude-code/commands/steplog-archive.md +33 -0
- steplog-0.10.0/plugins/claude-code/commands/steplog-init.md +28 -0
- steplog-0.10.0/plugins/claude-code/commands/steplog-narrative.md +39 -0
- steplog-0.10.0/plugins/claude-code/commands/steplog-open.md +21 -0
- steplog-0.10.0/plugins/claude-code/commands/steplog-render.md +21 -0
- steplog-0.10.0/plugins/claude-code/commands/steplog-unarchive.md +30 -0
- steplog-0.10.0/plugins/claude-code/hooks/session-start.sh +89 -0
- steplog-0.10.0/plugins/claude-code/hooks/stop.sh +47 -0
- steplog-0.10.0/plugins/claude-code/scripts/check-skill-sync.py +243 -0
- steplog-0.10.0/plugins/claude-code/skills/steplog-protocol/SKILL.md +222 -0
- steplog-0.10.0/plugins/claude-code/templates/AGENTS.md +44 -0
- steplog-0.10.0/plugins/claude-code/templates/AGENT_PROTOCOL.md +489 -0
- steplog-0.10.0/plugins/claude-code/templates/CLAUDE.md +8 -0
- steplog-0.10.0/plugins/claude-code/templates/docs/patches/example-prd-import.json +29 -0
- steplog-0.10.0/plugins/claude-code/templates/scripts/hooks/pre-commit +133 -0
- steplog-0.10.0/plugins/claude-code/templates/src/steplog/cli.py +1981 -0
- steplog-0.10.0/plugins/claude-code/templates/src/steplog/gen.py +7461 -0
- steplog-0.10.0/plugins/claude-code/templates/src/steplog/migrations/000_introduce_versioning.py +78 -0
- steplog-0.10.0/plugins/claude-code/templates/src/steplog/migrations/README.md +97 -0
- steplog-0.10.0/plugins/claude-code/templates/state.schema.json +678 -0
- steplog-0.10.0/pyproject.toml +69 -0
- steplog-0.10.0/scripts/hooks/pre-commit +133 -0
- steplog-0.10.0/src/steplog/__init__.py +3 -0
- steplog-0.10.0/src/steplog/cli.py +1981 -0
- steplog-0.10.0/src/steplog/gen.py +7461 -0
- steplog-0.10.0/src/steplog/migrations/000_introduce_versioning.py +78 -0
- steplog-0.10.0/src/steplog/migrations/001_add_drift_config.py +59 -0
- steplog-0.10.0/src/steplog/migrations/002_feature_002_schema.py +126 -0
- steplog-0.10.0/src/steplog/migrations/003_feature_005_binding.py +60 -0
- steplog-0.10.0/src/steplog/migrations/004_feature_006_dashboard.py +68 -0
- steplog-0.10.0/src/steplog/migrations/006_add_ui_preferences_and_chip_archive.py +71 -0
- steplog-0.10.0/src/steplog/migrations/007_add_narrative.py +67 -0
- steplog-0.10.0/src/steplog/migrations/README.md +97 -0
- steplog-0.10.0/src/steplog/migrations/__init__.py +6 -0
- steplog-0.10.0/src/steplog/migrations/test/000_introduce_versioning_expected.json +22 -0
- steplog-0.10.0/src/steplog/migrations/test/000_introduce_versioning_input.json +22 -0
- steplog-0.10.0/src/steplog/migrations/test/001_add_drift_config_expected.json +23 -0
- steplog-0.10.0/src/steplog/migrations/test/001_add_drift_config_input.json +22 -0
- steplog-0.10.0/src/steplog/migrations/test/002_feature_002_schema_expected.json +66 -0
- steplog-0.10.0/src/steplog/migrations/test/002_feature_002_schema_input.json +52 -0
- steplog-0.10.0/src/steplog/migrations/test/003_feature_005_binding_expected.json +40 -0
- steplog-0.10.0/src/steplog/migrations/test/003_feature_005_binding_input.json +40 -0
- steplog-0.10.0/src/steplog/migrations/test/004_feature_006_dashboard_expected.json +40 -0
- steplog-0.10.0/src/steplog/migrations/test/004_feature_006_dashboard_input.json +40 -0
- steplog-0.10.0/src/steplog/migrations/test/006_add_ui_preferences_and_chip_archive_expected.json +59 -0
- steplog-0.10.0/src/steplog/migrations/test/006_add_ui_preferences_and_chip_archive_input.json +59 -0
- steplog-0.10.0/src/steplog/migrations/test/007_add_narrative_expected.json +43 -0
- steplog-0.10.0/src/steplog/migrations/test/007_add_narrative_input.json +43 -0
- steplog-0.10.0/src/steplog/migrations/test/fixtures/broken-prd-example-expected-findings.md +64 -0
- steplog-0.10.0/src/steplog/migrations/test/fixtures/broken-prd-example.md +75 -0
- steplog-0.10.0/src/steplog/migrations/test/run_tests.py +124 -0
- 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/
|
steplog-0.10.0/AGENTS.md
ADDED
|
@@ -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`
|
steplog-0.10.0/CLAUDE.md
ADDED
|
@@ -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.
|
steplog-0.10.0/PKG-INFO
ADDED
|
@@ -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).
|
steplog-0.10.0/README.md
ADDED
|
@@ -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.
|