paqad-ai 1.60.2 → 1.61.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/CHANGELOG.md CHANGED
@@ -1,5 +1,126 @@
1
1
  # paqad-ai
2
2
 
3
+ ## 1.61.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 496950a: fix(#394): feature-development plan/spec must land in the feature bundle
8
+
9
+ A feature-development change could produce correct code yet write its plan and spec
10
+ to an invented `.paqad/features/<slug>/` directory, never creating the bundle's rigid
11
+ `plan.json` / `specification.json`, while the stages still read green. Three fixes
12
+ close that:
13
+
14
+ - **Rules (RC-1):** the feature-development rule pack and requirement-analyst agent now
15
+ instruct `paqad-ai plan compile` / `paqad-ai spec freeze` into the bundle and no longer
16
+ name `.paqad/plans/*` or `.paqad/specs/*` as durable write targets.
17
+ - **Enforcement (RC-2):** a `planning` / `specification` stage-end whose artifact is not
18
+ the active bundle's `plan.json` / `specification.json` is recorded inconclusive (the
19
+ artifact is dropped so no digest is hashed), with a message naming the compile/freeze
20
+ verb. `review` and the mutation stages are unchanged.
21
+ - **Verdict (RC-3):** the end-of-change completeness verdict now asserts the bundle
22
+ actually contains a non-empty `plan.json` and `specification.json`; missing either
23
+ reads incomplete / Needs your attention, never Safe to merge.
24
+
25
+ The dogfooded fix produced both artifacts in its own feature bundle, and no
26
+ `.paqad/features/` directory was created.
27
+
28
+ ## 1.61.0
29
+
30
+ ### Minor Changes
31
+
32
+ - 9467f47: feat(#389): imperative advisory-host stage protocol + honest JetBrains tiering
33
+
34
+ The JetBrains Claude Agent incident (framework followed, but stages unenforced and
35
+ the ledger empty of planning/specification artifacts) exposed that on advisory hosts
36
+ paqad had zero enforcement and relied on the model voluntarily self-recording. The
37
+ bootstrap only said "narrate every stage and the verdict yourself" — too weak. The
38
+ advisory-host section now imperatively requires running the host-independent CLI for
39
+ a feature-development change: `paqad-ai stage start/end`, `paqad-ai plan compile`, and
40
+ `paqad-ai spec freeze`, in order, so the stage-evidence ledger carries real planning +
41
+ specification artifacts even where no lifecycle hook fires.
42
+
43
+ The verification-enforcement doc now documents the three JetBrains products honestly:
44
+ **Claude Agent / AI Assistant** reads `CLAUDE.md`-equivalent guidance but fires no
45
+ Claude Code hooks (advisory — the incident's host), the **Claude Code [Beta] plugin**
46
+ runs the real `claude` CLI so paqad's hooks fire (full, hook-enforced — the supported
47
+ enforcement path), and **Junie** is advisory. The `aiassistant` adapter (already
48
+ correctly `hooks:false`) is now listed in the per-adapter coverage matrix, and a
49
+ reproducible manual advisory-host protocol is documented. No host-detection change and
50
+ no overclaim of enforcement paqad does not have on the host.
51
+
52
+ - 9467f47: fix(#390): gate feature-evidence bundle creation + report render to the feature-development route
53
+
54
+ Feature-evidence artifacts — the `feature-evidence/change-<ULID>/` bundle,
55
+ `stage-evidence.jsonl`, `report.html`, `receipt.json`, `ai-bom.json`, `rag.jsonl`,
56
+ and `_session/<id>.json` — were created for **every** workflow, not only
57
+ feature-development. A `root-cause-analysis` (or any non-feature) session that emitted
58
+ `paqad:stage` markers and reached Stop still minted a `change-<ULID>` bundle and a
59
+ `report.html`, because both the marker-driven auto-open and the report/receipt render
60
+ gated only on "is a feature pointer active?" (`currentFeature() != null`), never on the
61
+ routed workflow.
62
+
63
+ Both seams now consult the **persisted route** via `isFeatureDevelopmentRoute` (a new
64
+ `routeIsAffirmativelyNonFeature` helper), not the working-tree diff:
65
+
66
+ - `parseAndRecordMarkers` records nothing when the route is affirmatively
67
+ non-feature-development, so no bundle or `_session` control is minted.
68
+ - The per-feature receipt/AI-BOM projection and `renderActiveFeatureReport` in
69
+ `run-repository-verification.ts` write nothing when the route is affirmatively
70
+ non-feature-development, even if a pointer leaks through.
71
+
72
+ **Cross-provider safe by design:** suppression fires **only** on a route we can prove
73
+ is non-feature. The route seam runs only in Claude's UserPromptSubmit hook, so
74
+ Codex/Gemini sessions — which record markers through the same recorder but never write
75
+ route state — have **no** route state; an absent route is treated as "unknown" and
76
+ preserves today's recording behaviour rather than silently killing all cross-provider
77
+ feature-evidence. Feature-development behaviour is unchanged.
78
+
79
+ - 9467f47: feat(#388): stop auto-opening report.html in the browser and remove the `feature_report_auto_open` config option
80
+
81
+ The per-feature `report.html` no longer opens in the OS browser. The auto-open-on-completion
82
+ path (fired by the completion hook) and the manual `paqad-ai feature report --open` path are
83
+ both removed, and the sandbox-aware opener (`report-open.ts`) is deleted — no code path opens a
84
+ browser anymore.
85
+
86
+ **Removed config key:** `feature_report_auto_open` is gone from the config registry, resolver,
87
+ serializer, listing, the project-profile type and JSON schema, the onboarding default seed, and
88
+ the generated config templates. On the next onboard/update the config-split reconcile (#227)
89
+ prunes the key from team/local `.config.*` files, so existing projects stop opening the browser
90
+ without manual edits — every still-valid value is preserved.
91
+
92
+ Report **generation** is unchanged: the `feature_report` flag (default on) and
93
+ `renderActiveFeatureReport` still write `report.html` into the feature bundle exactly as before.
94
+
95
+ ### Patch Changes
96
+
97
+ - 9467f47: fix(#387): reject sequential decision ids at write, migrate legacy fixtures
98
+
99
+ Decision packets could still be minted with sequential `D-{number}` ids when an
100
+ agent bypassed the sanctioned writer and hand-authored the JSON, seeded by legacy
101
+ `D-1`/`D-2`/`D-3` example packets. The creation paths now funnel through a single
102
+ canonical `D-<ULID>` guard — `DecisionStore.writePending` rejects a caller-supplied
103
+ non-ULID id, and `createPendingDecision` already mints one — while read, validate,
104
+ and list stay tolerant of legacy ids so pre-existing packets keep working. Onboard
105
+ and update now best-effort migrate any `.paqad/decisions/{pending,resolved}/D-{N}.json`
106
+ to a minted ULID id (updating the in-file id and index reference, idempotent on
107
+ already-ULID packets), the repo's own legacy fixtures are migrated, and the bootstrap
108
+ now states imperatively that packets are created only via the `decision` skill,
109
+ never by hand — including on advisory hosts with no Decision-Pause hook.
110
+
111
+ - 9467f47: Close two CodeQL high-severity findings surfaced on the evidence/decision paths:
112
+
113
+ - **Resource exhaustion (`js/resource-exhaustion-from-deep-object-traversal`)** — `SchemaValidator` no longer sets ajv `allErrors: true`, so validation short-circuits at the first error instead of traversing an entire (potentially deeply nested, caller-influenced) object to collect every error. `verbose` is retained so error output still carries the offending value; results now report the first failure rather than all of them.
114
+ - **File-system race (`js/file-system-race`)** — the legacy decision-id migration's `remapIndex` dropped its `existsSync` check-then-`writeFileSync` sequence, which was a time-of-check/time-of-use race. It now relies on the existing `try/catch` (a missing index throws `ENOENT`, treated as "nothing to remap"), with identical behaviour and no race window.
115
+
116
+ - 9467f47: fix(#386): batch onboarding's git check-ignore to a single call
117
+
118
+ Repository discovery spawned two synchronous `git check-ignore` subprocesses per
119
+ visited directory, so onboarding stalled for seconds before the provider prompt on
120
+ large repositories. It now walks the tree once into memory and resolves all
121
+ git-ignored paths with a single batched `git check-ignore` call, cutting spawns
122
+ from O(directories) to O(1) with identical detection output.
123
+
3
124
  ## 1.60.2
4
125
 
5
126
  ### Patch Changes