@jabworks/condux 0.17.1 → 0.18.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jabworks/condux",
3
- "version": "0.17.1",
3
+ "version": "0.18.0",
4
4
  "description": "OpenCode plugin for the condux workflow toolkit — bundles the condux skills and injects the specialist agents (coder, explorer, planner, researcher) plus an opt-in plan-review listener.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -207,18 +207,16 @@ running preview reloads and shows the link, so the reader stays where they are.
207
207
  ## The Design File and the Live Preview (Step 3 onward)
208
208
 
209
209
  **The file is created at §1, not at sign-off.** Write
210
- `.condux/designs/YYYY-MM-DD-<feature>.md` with frontmatter
211
- `status: in-progress` when Step 3 opens, and append each section to it as it is
212
- agreed. This is the whole mechanism behind the card contract: the card can stay
213
- small precisely because the design has somewhere else to live.
210
+ `.condux/designs/YYYY-MM-DD-<feature>.md` when Step 3 opens, and append each
211
+ section to it as it is agreed. This is the whole mechanism behind the card
212
+ contract: the card can stay small precisely because the design has somewhere
213
+ else to live.
214
214
 
215
- ```markdown
216
- ---
217
- status: in-progress
218
- date: YYYY-MM-DD
219
- feature: <slug>
220
- ---
221
- ```
215
+ **The file's shape lives in `references/design-template.md`** — the canonical
216
+ home of the frontmatter contract (`status` / `date` / `feature`), the section
217
+ set, and the lifecycle stamp saying when each part gets written. Copy its
218
+ at-creation parts when the file is created; append each agreed section in its
219
+ §-entry shape (the section card's presentation twin — same four facts).
222
220
 
223
221
  At Step 7, flip `status` to `signed-off`. `/draft-plan` and the `planner` agent
224
222
  both read that value; **a design file with `status: in-progress` does not
@@ -274,7 +272,8 @@ Detail-round answers (Step 4) belong in the spec concern files, not the
274
272
  summary — the summary stays short; the spec carries the detail.
275
273
 
276
274
  Lives at: `.condux/designs/YYYY-MM-DD-<feature>.md`, created at §1 and
277
- appended to per section (see The Design File and the Live Preview). Step 7
275
+ appended to per section, in the shape of `references/design-template.md`
276
+ (see The Design File and the Live Preview). Step 7
278
277
  does not write it — it flips its `status` to `signed-off`, and that flip is
279
278
  what `/draft-plan`'s gate check reads. A design that lives only in
280
279
  conversation doesn't count as signed off, and neither does one still marked
@@ -0,0 +1,66 @@
1
+ # Design Doc Template
2
+
3
+ The shape of `.condux/designs/YYYY-MM-DD-<feature>.md`. This file is the
4
+ canonical home of the design file's frontmatter contract and section set —
5
+ SKILL.md points here rather than restating it.
6
+
7
+ The template formalizes **accumulation**: the file is built by discovery's own
8
+ flow, never restructured afterwards. Every part carries a lifecycle stamp
9
+ saying when it gets written, so an agent mid-discovery always has a home for
10
+ what it is holding. The mid-flow file and the sign-off file are one artifact
11
+ with one shape.
12
+
13
+ ```markdown
14
+ ---
15
+ status: in-progress <!-- → signed-off at Step 7; /draft-plan's gate reads this -->
16
+ date: YYYY-MM-DD
17
+ feature: <slug>
18
+ ---
19
+
20
+ # <feature> — <one line> [at creation]
21
+
22
+ <what we're building and why — ≤3 lines> [at creation]
23
+
24
+ **Sections:** N — <names, in order> [at creation]
25
+
26
+ ## §n · <name> — AGREED <date> [appended per agreement]
27
+
28
+ **Decided:** <the choice>, because <one line>.
29
+
30
+ | Rejected | Why not |
31
+ |---|---|
32
+ | <alternative> | <one line> |
33
+
34
+ <evidence — table, list, or a linked blueprint artifact. Never a wall.>
35
+
36
+ ## Constraints & out of scope [accumulates — rows added any time]
37
+
38
+ | Constraint / exclusion | Why |
39
+ |---|---|
40
+ | <rule or exclusion> | <one line> |
41
+
42
+ ## Open questions [finalized at sign-off; "none" is valid]
43
+
44
+ - <question still open after sign-off, or "none">
45
+ ```
46
+
47
+ ## The rules
48
+
49
+ | Rule | Why |
50
+ |---|---|
51
+ | Every agreed § carries the four facts a `decisions.md` entry carries — title+date, choice, alternatives with one-line why-nots, consequence | Step 7's spec write-back becomes transcription, not authorship; the design doc and `decisions.md` cannot disagree on shape because they share one |
52
+ | Sections are appended as agreed, never drafted ahead | The file records the conversation's actual state; a pre-drafted section reads as agreed when it isn't |
53
+ | Constraints discovered mid-flow go straight into their table | The section exists from creation precisely so mid-flow findings have a home other than an invented heading |
54
+ | `status` flips to `signed-off` only at Step 7, and nothing else edits the frontmatter | `/draft-plan` and the `planner` agent gate on this value |
55
+
56
+ ## Lifecycle stamps, spelled out
57
+
58
+ | Stamp | When written | Parts |
59
+ |---|---|---|
60
+ | `[at creation]` | Step 3 opens, before §1 is presented | frontmatter, title, why-line, section list |
61
+ | `[appended per agreement]` | each section, at the moment it is agreed | the § entries |
62
+ | `[accumulates]` | any time | `Constraints & out of scope` rows |
63
+ | `[finalized at sign-off]` | Step 7 | `Open questions`, the `status` flip |
64
+
65
+ A design file with no `status` field predates this contract and reads as
66
+ `signed-off` — see SKILL.md's existing-design check.
@@ -76,14 +76,22 @@ Order of checks, because this is where the defects were:
76
76
 
77
77
  One artifact per claim that has a visual or observable outcome — screenshot,
78
78
  response body, console excerpt. Store under
79
- `<git-root>/.condux/verification/<YYYY-MM-DD>-<slug>/` and reference the file
80
- in the report. Console errors and failed network requests seen along the way
79
+ `<git-root>/.condux/verification/<YYYY-MM-DD>-<slug>/` — everything a run
80
+ produces lives inside that dir, nothing at the verification root. Name each
81
+ evidence file for the claim it supports and reference it from the report's
82
+ claim table. Console errors and failed network requests seen along the way
81
83
  get reported even when they belong to another feature.
82
84
 
85
+ Then write `report.md` into the same dir, in the shape of
86
+ `references/report-template.md` — every run writes one, including runs where
87
+ nothing could be driven (the template carries the fallback shape).
88
+
83
89
  ### Step 5 — Report and stop
84
90
 
85
- One pass. Fix what you found, re-verify only the claims that failed, then
86
- stop. This skill does not loop.
91
+ The terminal report **is** `report.md`: print the file's content — never a
92
+ second shape that can drift from the persisted one. One pass. Fix what you
93
+ found, re-verify only the claims that failed, update `report.md` to match,
94
+ then stop. This skill does not loop.
87
95
 
88
96
  ## Failure Handling
89
97
 
@@ -112,31 +120,13 @@ Two failed attempts on the same claim is the ceiling. Report and move on.
112
120
 
113
121
  ## Output Format
114
122
 
115
- ```
116
- ## Live verification: <change>
117
-
118
- Target http://localhost:3000 (pnpm dev — started by this run)
119
- Themes light ✓ dark ✓
120
-
121
- Claim Evidence Verdict
122
- Save disabled while mutation in flight save-pending.png ✓
123
- Failed save shows server message inline save-error.png ✓
124
- Escape closes dialog, focus returns to trigger — ✗ focus lands on body
125
- Empty list renders the empty state empty-state.png ✓
126
-
127
- Also seen: 2 console errors on mount (pre-existing, unrelated to this change)
128
-
129
- 1 claim failed. Fixed focus return in dialog.tsx:44 — re-verified ✓
130
- ```
131
-
132
- When nothing could be driven:
133
-
134
- ```
135
- ## Live verification: <change>
136
-
137
- Target none — no dev/start/storybook script and nothing on the usual ports
138
- Verdict NOT VERIFIED — 3 claims unchecked, listed below
139
- ```
123
+ The report shape — the fixed header table (Date / Target / Diff / Themes),
124
+ the claim table (Claim | Evidence | Verdict), "Also seen", and the outcome
125
+ line — lives in `references/report-template.md`, the canonical home. It also
126
+ carries the fallback shape for when nothing could be driven; that run still
127
+ writes `report.md`, because an absent report is indistinguishable from a run
128
+ that never happened. Fixed header keys and a fixed claim-table shape are what
129
+ make two runs of the same surface comparable.
140
130
 
141
131
  ## What Does NOT Happen
142
132
 
@@ -0,0 +1,54 @@
1
+ # Verification Report Template
2
+
3
+ The shape of `report.md` — one per run, at
4
+ `<git-root>/.condux/verification/<YYYY-MM-DD>-<slug>/report.md`. This file is
5
+ the canonical home of the report shape; SKILL.md's Output Format points here.
6
+
7
+ The terminal report **is** this file: write `report.md` first, then print its
8
+ content as the report. One fact, one home — a separate terminal shape and file
9
+ shape would drift.
10
+
11
+ ```markdown
12
+ # Live verification: <change>
13
+
14
+ | | |
15
+ |---|---|
16
+ | Date | YYYY-MM-DD |
17
+ | Target | <url or command> (<how it was started>) |
18
+ | Diff | <branch or commit under test> |
19
+ | Themes | light ✓ dark ✓ |
20
+
21
+ | Claim | Evidence | Verdict |
22
+ |---|---|---|
23
+ | <behavior asserted, one line> | <file in this dir, or —> | ✓ / ✗ <what actually happened> |
24
+
25
+ Also seen: <console errors, failed requests, off-feature breakage — or "nothing">
26
+
27
+ <n> claims failed. <fix + re-verify note, or "all green">
28
+ ```
29
+
30
+ When nothing could be driven, the report is still written — an absent
31
+ `report.md` is indistinguishable from a run that never happened:
32
+
33
+ ```markdown
34
+ # Live verification: <change>
35
+
36
+ | | |
37
+ |---|---|
38
+ | Date | YYYY-MM-DD |
39
+ | Target | none — <what was tried, what blocked it> |
40
+ | Verdict | NOT VERIFIED — <n> claims unchecked, listed below |
41
+
42
+ | Claim | Evidence | Verdict |
43
+ |---|---|---|
44
+ | <each enumerated claim> | — | unchecked |
45
+ ```
46
+
47
+ ## The rules
48
+
49
+ | Rule | Why |
50
+ |---|---|
51
+ | Everything a run produces lives inside its run dir — nothing at the verification root | Root-level orphans belonging to no run were observed in the wild; the dir is the unit of a run |
52
+ | Evidence files are named for the claim they support and referenced from the claim table | The table is the index — an evidence file it doesn't reference is uncontextualized in a week |
53
+ | Header keys are fixed: Date, Target, Diff, Themes (Themes only for UI surfaces) | Two runs of the same surface are diffable only when their headers line up |
54
+ | Every run writes `report.md`, including runs where nothing could be driven | Absence of a report must mean absence of a run, nothing else |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: technical-spec
3
- description: "Persists feature decisions, API contracts, implementation details, and quirks into a structured, queryable spec tree — one folder per feature, one file per concern. Invoke-only — discovery runs it at design sign-off and preflight's drift check reads its output; the user runs it via /technical-spec when they say \"save spec\", \"document this\", \"write up what we decided\", or \"spec this out\". Not for turning a rough idea into a design first — that's discovery."
3
+ description: "Persists feature decisions, API contracts, implementation details, and quirks into a structured, queryable spec tree — one folder per feature, one file per concern. Invoke-only — discovery runs it at design sign-off and preflight's drift check reads its output; the user runs it via /technical-spec when they say \"save spec\", \"document this\", \"write up what we decided\", \"record the decision rationale\", or \"spec this out\" — recording decisions for the future is spec work even when phrased as remembering. Not for turning a rough idea into a design first — that's discovery."
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -1,13 +1,13 @@
1
1
  [
2
2
  { "query": "save spec", "should_trigger": true, "expected_skill": "technical-spec" },
3
- { "query": "document what we decided", "should_trigger": true, "expected_skill": "technical-spec", "disallowed": ["draft-plan"] },
3
+ { "query": "document what we decided", "should_trigger": true, "expected_skill": "technical-spec", "disallowed": ["draft-plan", "remember"] },
4
4
  { "query": "spec this out", "should_trigger": true, "expected_skill": "technical-spec" },
5
5
  { "query": "persist the api contract and the quirks we found", "should_trigger": true, "expected_skill": "technical-spec" },
6
6
  { "query": "write up the field mappings from backend to UI", "should_trigger": true, "expected_skill": "technical-spec" },
7
7
  { "query": "update the spec for wan-config", "should_trigger": true, "expected_skill": "technical-spec" },
8
8
  { "query": "scaffold a spec folder for this feature", "should_trigger": true, "expected_skill": "technical-spec" },
9
9
  { "query": "whats the format for quirks.md", "should_trigger": true, "expected_skill": "technical-spec", "kind": "in-context" },
10
- { "query": "record the decision rationale for future sessions", "should_trigger": true, "expected_skill": "technical-spec", "disallowed": ["draft-plan"] },
10
+ { "query": "record the decision rationale for future sessions", "should_trigger": true, "expected_skill": "technical-spec", "disallowed": ["draft-plan", "remember"] },
11
11
  { "query": "bump the index.md changelog for the spec", "should_trigger": true, "expected_skill": "technical-spec" },
12
12
  { "query": "save the design as a tech spec with live preview", "should_trigger": true, "expected_skill": "technical-spec", "disallowed": ["draft-plan"] },
13
13
  { "query": "sepc this out pls", "should_trigger": true, "expected_skill": "technical-spec" },