@jabworks/condux 0.3.1 → 0.4.1

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.3.1",
3
+ "version": "0.4.1",
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": {
@@ -84,6 +84,24 @@ as any other soft gate in this skill.
84
84
  └──────────────────────────────────────────────────────────────────┘
85
85
  ```
86
86
 
87
+ ## Scope Lock (part of Step 1)
88
+
89
+ The scope check runs in both directions. Decomposition catches a request that
90
+ is secretly several features; the scope lock catches the opposite failure —
91
+ quietly discovering against a wider surface than the one asked about, e.g.
92
+ auditing a whole repo when one plugin was named.
93
+
94
+ Before Step 2, state the target surface back in one line:
95
+
96
+ > "Reading this as scoped to `<the named package / plugin / directory>` — the
97
+ > rest of the repo is out of scope unless you say otherwise."
98
+
99
+ Then hold it. If the design starts to need something outside that surface,
100
+ name the crossing and get agreement before widening — do not widen silently
101
+ because the adjacent thing looked related. Narrowing works the same way: if
102
+ the user names a narrower target mid-discovery, that is the new surface, and
103
+ work already done against the wider one is dropped, not folded in.
104
+
87
105
  ## Clarifying Questions — Good vs Bad
88
106
 
89
107
  ```
@@ -124,6 +142,7 @@ Accept either answer. Never block. Never lecture.
124
142
  ✗ Asking questions one at a time in a long back-and-forth
125
143
  ✗ Proceeding to planning without explicit sign-off
126
144
  ✗ Treating a well-defined ticket as needing full discovery
145
+ ✗ Widening past the named target surface without saying so
127
146
  ```
128
147
 
129
148
  ## Output
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: finalize
3
- description: "End-of-task quality gate — typecheck → lint → format → tests. Runs in order, once. Stops on first failure and fixes before continuing. Run after all implementation is complete. Called automatically by /workflow, or standalone. Check AGENTS.md for the project's actual commands. Not for auditing whether requirements and plan steps are complete; use preflight first."
3
+ description: "End-of-task quality gate — typecheck → lint → format → tests. Runs in order, once. Stops on first failure and fixes before continuing. Run after all implementation is complete. Called automatically by /workflow, or standalone. Check AGENTS.md for the project's actual commands. Not for auditing whether requirements and plan steps are complete (preflight, first); not for running the change and watching it work (live-verification, after)."
4
4
  argument-hint: "[package or path to scope — optional]"
5
5
  ---
6
6
 
@@ -86,6 +86,7 @@ Typecheck ✓ clean
86
86
  Lint ✓ clean (2 warnings — not blocking)
87
87
  Format ✓ 2 files auto-fixed (Button.tsx, invoice.router.ts)
88
88
  Tests ✓ 18 passed, 0 failed
89
+ Env ✓ 1 new var → .env.example updated (STRIPE_WEBHOOK_SECRET)
89
90
  Plan (none found for this task — treating as standalone scope)
90
91
 
91
92
  Ready to commit.
@@ -107,6 +108,18 @@ Format ✓ clean
107
108
  Tests ✓ 18 passed
108
109
  ```
109
110
 
111
+ ## Companion Files
112
+
113
+ One cheap scan of the diff, reported alongside the gate. It never blocks — it
114
+ exists because a new env var that never reaches the example file is invisible
115
+ until it breaks someone else's checkout.
116
+
117
+ - A new env var anywhere in the diff (`process.env.X`, `import.meta.env.X`, a
118
+ new key in an env schema, a new `docker-compose`/CI variable) ⇒ the project's
119
+ example file (`.env.example`, `.env.sample`, or whatever it uses) gains the
120
+ same key in the same change — placeholder value only, never a real secret.
121
+ - Report `Env ✓ n/a` when the diff adds none, so the check is visibly running.
122
+
110
123
  ## What Does NOT Happen
111
124
 
112
125
  ```
@@ -0,0 +1,173 @@
1
+ ---
2
+ name: live-verification
3
+ description: "Verify a change by actually running it — drive the real UI or endpoint, check each claim against observed behaviour, and capture evidence before pushing. Detects what's runnable, checks light mode then dark, and reports claim → evidence → verdict with unverifiable claims named rather than hidden. After /finalize, before committing or pushing a change that has a runnable surface — UI, page, component, endpoint, CLI. Triggers include \"verify it live\", \"did this actually work\", \"check it in the browser\", \"live verify before pushing\", \"does it render right\". Not for typecheck/lint/test (that's finalize), not for auditing plan completeness (preflight), not for reading code to judge it (code-review)."
4
+ argument-hint: "[what to verify — optional; defaults to the current diff]"
5
+ ---
6
+
7
+ # /live-verification
8
+
9
+ Green tests are not evidence that the thing works. This skill closes the gap
10
+ between "the pipeline passed" and "I watched it do the thing".
11
+
12
+ ## Usage
13
+
14
+ ```
15
+ /live-verification # verify the current diff
16
+ /live-verification the upload dialog # verify a named surface
17
+ ```
18
+
19
+ ## When It Applies
20
+
21
+ | Change touches | Run this? |
22
+ |---|---|
23
+ | A rendered surface — page, component, story, dialog | **Yes** |
24
+ | An endpoint, procedure, or CLI a human will call | **Yes** |
25
+ | Behaviour behind a flag or a state the tests don't reach | **Yes** |
26
+ | Types, docs, comments, config with no runtime effect | No — say so and skip |
27
+ | Code fully covered by a test that genuinely exercises it | Judgment: skip, and name the test you're leaning on |
28
+
29
+ Skipping is a legitimate outcome. Skipping *silently* is not.
30
+
31
+ ## How It Works
32
+
33
+ ### Step 1 — Resolve the run target
34
+
35
+ Do not assume a dev server. In order:
36
+
37
+ 1. Something already running? Check the project's usual port before starting
38
+ anything (`ss -tlnp` / `lsof -i` / the URL in `README` or `AGENTS.md`).
39
+ 2. `AGENTS.md` — if it names the command to run the app, that command wins.
40
+ 3. `package.json` scripts — `dev`, `storybook`, `start`, `preview`.
41
+ 4. Nothing runnable → stop here and report that. Do not scaffold a harness.
42
+
43
+ Start it in the background, wait for it to actually serve (poll the URL — do
44
+ not `sleep` and hope), and note the URL in the report.
45
+
46
+ ### Step 2 — Enumerate the claims
47
+
48
+ Before touching the UI, write down what the change claims to do — one line
49
+ each, from the diff and the task description. These are the only things you
50
+ verify. A change that claims four things needs four verdicts.
51
+
52
+ Bad: "the dialog works." Good: "Save is disabled while the mutation is in
53
+ flight", "a failed save shows the server's message inline", "Escape closes
54
+ the dialog and returns focus to the trigger".
55
+
56
+ ### Step 3 — Drive it
57
+
58
+ Use whatever driving tool this environment actually has — a browser MCP, a
59
+ headless script the repo already ships, `curl` for an endpoint, or the CLI
60
+ itself. **Nothing is assumed installed.** If no driving tool exists, degrade
61
+ honestly: report what could not be driven rather than inventing a result.
62
+
63
+ Order of checks, because this is where the defects were:
64
+
65
+ 1. **Light mode first.** Then dark. A themed change is not verified until it
66
+ has been seen in both — that part is the gate, not the order.
67
+ 2. **The interactive states**, not just the resting one — hover, focus,
68
+ disabled, selected, and the in-flight state of every mutation.
69
+ 3. **The failure path.** Make the thing fail on purpose if you can (offline,
70
+ bad input, forced error) and confirm the error is surfaced where the user
71
+ acted.
72
+ 4. **Keyboard.** Tab to it, Escape out of it, confirm focus lands somewhere
73
+ sensible.
74
+
75
+ ### Step 4 — Capture evidence
76
+
77
+ One artifact per claim that has a visual or observable outcome — screenshot,
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
81
+ get reported even when they belong to another feature.
82
+
83
+ ### Step 5 — Report and stop
84
+
85
+ One pass. Fix what you found, re-verify only the claims that failed, then
86
+ stop. This skill does not loop.
87
+
88
+ ## Failure Handling
89
+
90
+ The recurring failures here are environmental, not logical — treat them as
91
+ results, not as things to retry into the ground:
92
+
93
+ ```
94
+ Server won't start / port already in use
95
+ → Report it. Do not kill a process you did not start.
96
+
97
+ Out of memory, model won't load, dependency missing
98
+ → Not your bug. Report "could not verify — <reason>" and stop.
99
+ "Let's do live verify later" is a valid user answer.
100
+
101
+ Selector not found / element no longer exists
102
+ → Re-read the current DOM once and retry with what's actually there.
103
+ Second miss: report the claim as unverified, don't keep guessing.
104
+
105
+ Wait timed out
106
+ → Poll for the condition, never a fixed sleep. On a real timeout, report
107
+ it as a finding — a surface that takes longer than the timeout to
108
+ appear is itself a defect worth naming.
109
+ ```
110
+
111
+ Two failed attempts on the same claim is the ceiling. Report and move on.
112
+
113
+ ## Output Format
114
+
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
+ ```
140
+
141
+ ## What Does NOT Happen
142
+
143
+ ```
144
+ ✗ Reporting a claim as verified because the code looks right
145
+ ✗ Inventing a screenshot, a response, or a result that wasn't observed
146
+ ✗ Installing a browser driver or scaffolding a test harness to get a result
147
+ ✗ sleep-then-check instead of polling for the condition
148
+ ✗ Retrying the same selector more than twice
149
+ ✗ Killing processes the run didn't start
150
+ ✗ Re-running typecheck/lint/tests — that was finalize's job
151
+ ```
152
+
153
+ ## Artifacts
154
+
155
+ Evidence is **working state**: `<git-root>/.condux/verification/`, gitignored,
156
+ alongside condux's `designs/` and `plans/`. Never the repo root, never the
157
+ project's `docs/`.
158
+
159
+ **Bootstrap.** `.condux/` is created on demand at the git root by the first
160
+ skill that writes there. Before the first write, check it's ignored:
161
+
162
+ ```bash
163
+ git check-ignore -q .condux/ || echo "not ignored"
164
+ ```
165
+
166
+ If it isn't, offer once: "condux keeps its working files in `.condux/` — add
167
+ it to `.gitignore` so they stay out of your commits?" On yes, append
168
+ `.condux/` to the repo's `.gitignore`. If the user would rather not touch a
169
+ tracked file, write it to `.git/info/exclude` instead. Never edit either file
170
+ without asking. Not a git repo → fall back to CWD and say so once.
171
+
172
+ **Override.** A project can relocate this in `AGENTS.md`; an explicit
173
+ override always wins.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: plan-review
3
- description: "Render a plan in a local browser for inline annotation, then return an approve / request-revisions / deny decision to the agent. Auto-captures the plan via a Claude Code ExitPlanMode hook or a Codex Stop hook, or runs manually on any markdown file or spec directory. Self-contained — no network egress, no third-party runtime deps. When the agent finishes planning (Claude Code ExitPlanMode, or a Codex planning turn) and you want to review/annotate before it implements, or when you invoke /plan-review on a markdown plan or spec directory. Also owns its own machinery — steer-mode review loops, the live spec preview, and installing or troubleshooting the ExitPlanMode / Codex Stop hooks. Not for cataloging a whole specs tree; use spec-browser."
3
+ description: "Render a plan in a local browser for inline annotation, then return an approve / request-revisions / deny decision to the agent. Auto-captures the plan via a Claude Code ExitPlanMode hook or a Codex Stop hook, or runs manually on any markdown file or spec directory. Self-contained — no network egress, no third-party runtime deps. When the agent finishes planning (Claude Code ExitPlanMode, or a Codex planning turn) and you want to review/annotate before it implements, or when you invoke /plan-review on a markdown plan or spec directory. Also owns its own machinery — steer-mode review loops, the live spec preview, and installing or troubleshooting the ExitPlanMode / Codex Stop hooks. Phrases include \"let's review the plan\", \"walk me through the plan before we build\", \"annotate the plan\" — use these when the ExitPlanMode or Codex Stop hook doesn't fire. Not for cataloging a whole specs tree; use spec-browser."
4
4
  ---
5
5
 
6
6
  # /plan-review
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: preflight
3
- description: "Lightweight \"am I actually done?\" checklist before calling /finalize. Prevents premature completion — catches skipped steps, missing behavior, and silent regressions. Runs before /finalize at the end of every /workflow tier (automatic on SMALL; the recommended CP-2 choice on MEDIUM/LARGE). Also trigger standalone on \"verify this\", \"am I done?\", or \"preflight\". Not for executing typecheck, lint, format, and tests; use finalize."
3
+ description: "Lightweight \"am I actually done?\" checklist before calling /finalize. Prevents premature completion — catches skipped steps, missing behavior, and silent regressions. Runs before /finalize at the end of every /workflow tier (automatic on SMALL; the recommended CP-2 choice on MEDIUM/LARGE). Also trigger standalone on \"verify this\", \"am I done?\", or \"preflight\". Not for executing typecheck, lint, format, and tests; use finalize. Not for actually running the change and observing it work in a browser or CLI; that's live-verification, after finalize."
4
4
  argument-hint: "[task or feature name]"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: root-cause-analysis
3
- description: "Enforces root-cause-first bug investigation — read the error, reproduce it, trace the data flow backward. Never propose a solution before the investigation phase completes. Trigger the moment debugging starts — never proactively — and always before any fix is proposed or any change is made."
3
+ description: "Enforces root-cause-first bug investigation — read the error, reproduce it, trace the data flow backward. Never propose a solution before the investigation phase completes. Trigger the moment debugging starts — never proactively — and always before any fix is proposed or any change is made. Phrases include \"why is this failing\", \"this bug\", \"unexpected behavior\", \"error when I…\". Not for a jabworks/agentic-toolkit skill or plugin misbehaving (won't trigger, won't show up, dist drift); that's toolkit-debugging-playbook."
4
4
  argument-hint: "<error message or bug description>"
5
5
  effort: high
6
6
  ---
@@ -130,6 +130,7 @@ happened (or was declined) in draft-plan's own save step — don't re-offer it.*
130
130
 
131
131
  | Option | What it does |
132
132
  |---|---|
133
+ | **Verify it live** *(recommended when the change has a runnable surface)* | Load `live-verification` — drive the real UI or endpoint and check each claim against observed behaviour |
133
134
  | **Code review** *(recommended)* | `/code-review` the diff before merging |
134
135
  | **Commit** | Load the `git-commit` skill if installed (conventional message from the diff, safe staging); otherwise follow the repo's commit conventions |
135
136
  | **Cut a release** | Load the `release` skill if installed — machinery detection, dry-run plan, then tag → push → GitHub release; otherwise follow the repo's release conventions |
@@ -148,6 +149,7 @@ Load each only when its step is reached.
148
149
  | `subagent-deployment` | 2+ independent tasks, no shared files/deps | ad-hoc work, not ordered plans |
149
150
  | `preflight` | end of every tier, before finalize | automatic on SMALL; recommended CP-2 choice |
150
151
  | `finalize` | after all implementation | runs in order, once, stops on first failure; check AGENTS.md for the real commands |
152
+ | `live-verification` | after finalize, when the change has a runnable surface | offer at CP-3; one pass, no loop; skipping is fine, silent skipping is not |
151
153
  | `code-review` | on request only | never auto-triggers, never fixes; after finalize you may ask ONCE |
152
154
  | `root-cause-analysis` | any bug investigation | load when debugging starts, not proactively; investigation before fixes |
153
155
  | `plan-review` | plan/spec annotation in the browser | via ExitPlanMode/Stop hook, draft-plan's save step, or manually |