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