empirical-sdd 0.30.0 → 0.32.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 +90 -1
- package/README.md +39 -2
- package/dist/checkouts.d.ts +16 -1
- package/dist/cli.js +10171 -8130
- package/dist/core.d.ts +11 -1
- package/dist/demo-integration-repair.js +9725 -8071
- package/dist/demo-ticket-policy.js +9781 -8127
- package/dist/index.d.ts +3 -2
- package/dist/index.js +9736 -8079
- package/dist/integrations.js +635 -230
- package/dist/knowledge.d.ts +1 -1
- package/dist/linear-mcp-tracking.d.ts +66 -0
- package/dist/mcp.js +9795 -8064
- package/dist/mockup-preview.d.ts +26 -0
- package/dist/mockups.d.ts +104 -0
- package/dist/protocol.d.ts +7 -1
- package/dist/protocol.js +7 -23
- package/dist/qa.d.ts +2 -0
- package/dist/runtime.d.ts +23 -0
- package/dist/storage.d.ts +13 -4
- package/dist/tracker-content.d.ts +5 -0
- package/dist/tracking.d.ts +178 -1
- package/dist/types.d.ts +94 -1
- package/dist/worktrees.d.ts +6 -1
- package/docs/demo.md +28 -1
- package/docs/mcp.md +145 -2
- package/docs/protocol.md +174 -3
- package/docs/verification-performance.md +63 -0
- package/docs/versioning.md +6 -6
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,93 @@ under the alpha rules in [docs/versioning.md](docs/versioning.md).
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
+
## [0.32.0] - 2026-09-08
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Added a six-step initialization wizard covering Setup, Preferences, Review
|
|
16
|
+
bot, Tracking, Confirm, and Apply, with Back/Edit navigation, retained
|
|
17
|
+
choices, and explicit Save before setup changes.
|
|
18
|
+
- Added clickable app and feature mockup previews through `empirical mockups`,
|
|
19
|
+
human approval before UI contracts freeze, and fidelity checks against the
|
|
20
|
+
approved design during verification.
|
|
21
|
+
- Added explicit reuse of exact-revision QA receipts after validating source,
|
|
22
|
+
specification, policy, command, runtime, executable, and artifact identities.
|
|
23
|
+
- Added bounded verification progress and a repeatable benchmark for measuring
|
|
24
|
+
final verification without treating diagnostics as promotion evidence.
|
|
25
|
+
- Added explicit selection of existing specs and recoverable approved worktree
|
|
26
|
+
handoffs, including retries after interrupted Git creation or feature setup.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- Capability claims are now non-exclusive: specs in separate worktrees can
|
|
31
|
+
progress on the same capability while integration retains semantic conflict
|
|
32
|
+
detection against each spec's recorded base.
|
|
33
|
+
- Git worktrees now use their own selected feature instead of automatically
|
|
34
|
+
inheriting unfinished spec histories. Multiple unclaimed specs may remain
|
|
35
|
+
inactive without blocking unrelated new work.
|
|
36
|
+
- Reviewer-bot setup is optional, includes an explicit disable choice, and
|
|
37
|
+
preserves saved fresh-context review without repeated credential prompts.
|
|
38
|
+
- Linear tracking prefers authenticated sibling MCP tools, including upgrade
|
|
39
|
+
recovery from legacy API-key configuration, and derives ticket content from
|
|
40
|
+
the specification while storing recovery identities in attachment metadata.
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- Prevented unrelated malformed or blocked feature histories and sibling
|
|
45
|
+
checkout metadata from blocking normal work in another Git checkout.
|
|
46
|
+
- Preserved strict tracker recovery obligations and checkout ownership across
|
|
47
|
+
terminal transitions, interrupted handoffs, and explicit feature selection.
|
|
48
|
+
- Bound reused verification evidence to the selected executable and runtime
|
|
49
|
+
permission metadata so changed execution conditions cannot reuse stale proof.
|
|
50
|
+
- Rejected blank mockup approvals and ambiguous fidelity fields, and preserved
|
|
51
|
+
path containment and explicit human design decisions.
|
|
52
|
+
- Preserved user-authored tracker content while validating bounded MCP recovery
|
|
53
|
+
results and avoiding repeated provider mutations after ambiguous responses.
|
|
54
|
+
|
|
55
|
+
### Migration
|
|
56
|
+
|
|
57
|
+
After upgrading, run `empirical update` to refresh installed bootstrap guidance
|
|
58
|
+
and invoke `empirical-init` in existing repositories to refresh managed local
|
|
59
|
+
workflow instructions while retaining saved settings. Schema 5 remains in use;
|
|
60
|
+
no manual data conversion is required.
|
|
61
|
+
|
|
62
|
+
A Git checkout without a selected feature now remains idle. To resume an existing
|
|
63
|
+
spec, explicitly select its feature through `empirical_select`; unclaimed specs
|
|
64
|
+
are retained. UI changes must record the mockup approval and fidelity artifacts
|
|
65
|
+
requested by the workflow. Verification receipts without matching current runtime
|
|
66
|
+
and executable identities must be rerun rather than reused.
|
|
67
|
+
|
|
68
|
+
## [0.31.0] - 2026-09-04
|
|
69
|
+
|
|
70
|
+
### Added
|
|
71
|
+
|
|
72
|
+
- Added authenticated Linear MCP tracker transport that reuses the host's
|
|
73
|
+
existing OAuth connection without copying credentials, with durable
|
|
74
|
+
discovery, preview, prepare, reconciliation, and exactly-once acceptance.
|
|
75
|
+
- Added a conditional design-language knowledge page for repositories with a
|
|
76
|
+
product interface, supporting explicit import, repository-derived proposals,
|
|
77
|
+
and human-confirmed elicitation while excluding documentation-only surfaces.
|
|
78
|
+
|
|
79
|
+
### Changed
|
|
80
|
+
|
|
81
|
+
- Projected the shipped specialist-consult protocol into living capability and
|
|
82
|
+
workflow-routing specifications so required, bounded advisories remain
|
|
83
|
+
reviewable and protected from specification drift.
|
|
84
|
+
|
|
85
|
+
### Fixed
|
|
86
|
+
|
|
87
|
+
- Kept Linear OAuth timeout handling live on Windows and isolated its complete
|
|
88
|
+
test suite from the Bun coverage instrumentation hang while retaining
|
|
89
|
+
aggregate coverage enforcement.
|
|
90
|
+
- Hardened Linear MCP bridge persistence against symlink escapes and serialized
|
|
91
|
+
intent acceptance so concurrent submissions cannot both advance one durable
|
|
92
|
+
operation.
|
|
93
|
+
|
|
94
|
+
### Migration
|
|
95
|
+
|
|
96
|
+
No migration required.
|
|
97
|
+
|
|
11
98
|
## [0.30.0] - 2026-09-01
|
|
12
99
|
|
|
13
100
|
### Added
|
|
@@ -351,7 +438,9 @@ Published through GitHub Actions trusted publishing with npm provenance.
|
|
|
351
438
|
|
|
352
439
|
- Prepared and released package version `0.20.2`.
|
|
353
440
|
|
|
354
|
-
[Unreleased]: https://github.com/goempirical/empirical-sdd/compare/v0.
|
|
441
|
+
[Unreleased]: https://github.com/goempirical/empirical-sdd/compare/v0.32.0...HEAD
|
|
442
|
+
[0.32.0]: https://github.com/goempirical/empirical-sdd/compare/v0.31.0...v0.32.0
|
|
443
|
+
[0.31.0]: https://github.com/goempirical/empirical-sdd/compare/v0.30.0...v0.31.0
|
|
355
444
|
[0.30.0]: https://github.com/goempirical/empirical-sdd/compare/v0.29.0...v0.30.0
|
|
356
445
|
[0.29.0]: https://github.com/goempirical/empirical-sdd/compare/v0.28.0...v0.29.0
|
|
357
446
|
[0.28.0]: https://github.com/goempirical/empirical-sdd/compare/v0.27.0...v0.28.0
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ Empirical is a repository-native harness for coding agents. The model writes;
|
|
|
6
6
|
Empirical keeps the contract, progress, proof, and exact next action in Git so
|
|
7
7
|
work can resume across sessions, agents, and machines.
|
|
8
8
|
|
|
9
|
-
> Empirical 0.
|
|
9
|
+
> Empirical 0.31 is alpha software and requires Node.js 22 or newer.
|
|
10
10
|
|
|
11
11
|
**[Open the practical harness guide](https://goempirical.github.io/empirical-sdd/)**
|
|
12
12
|
for the visual walkthrough, diagrams, generated-file explorer, and complete
|
|
@@ -26,6 +26,17 @@ workflow. Its zero-build source is [docs/index.html](docs/index.html).
|
|
|
26
26
|
- Codex: `$empirical-init`
|
|
27
27
|
- Claude Code: `/empirical-init`
|
|
28
28
|
|
|
29
|
+
Init guides you through six steps in your agent chat: **Setup → Preferences →
|
|
30
|
+
Review bot → Tracking → Confirm → Apply**. It shows your current step and asks
|
|
31
|
+
one question at a time. Use **Back** or **Edit** to revisit a section while
|
|
32
|
+
keeping your other answers. Nothing is applied until you confirm **Save**.
|
|
33
|
+
|
|
34
|
+
Bot review is optional. Init offers it once; say “no,” “skip,” or “ignore”
|
|
35
|
+
to save fresh-context review without a bot token. Future init runs preserve
|
|
36
|
+
that choice. To enable it later, tell your agent “enable bot review.”
|
|
37
|
+
Fresh-context review still uses an isolated reviewer, but does not count as
|
|
38
|
+
an independent GitHub approval.
|
|
39
|
+
|
|
29
40
|
3. Ask for the change normally.
|
|
30
41
|
|
|
31
42
|
```text
|
|
@@ -60,6 +71,12 @@ Empirical routes by risk, not prompt length:
|
|
|
60
71
|
Specify → Design → Plan → Implement → Context? → Verify → Review → Integrate
|
|
61
72
|
```
|
|
62
73
|
|
|
74
|
+
A feature that shows an interface gets its mockup at Specify, while the
|
|
75
|
+
contract is still open, because seeing a screen reveals states and flows that
|
|
76
|
+
prose misses and those belong in the criteria. `empirical mockups` serves the
|
|
77
|
+
directions on a local address so a person can click through and choose one;
|
|
78
|
+
Verify then checks what was built against what was approved.
|
|
79
|
+
|
|
63
80
|
Context runs when repository knowledge needs refinement. Failed verification or
|
|
64
81
|
requested review changes return to implementation. Evidence, review, and
|
|
65
82
|
integration are different claims, and Empirical reports only the highest level
|
|
@@ -82,8 +99,10 @@ repository/
|
|
|
82
99
|
├── policy.json verification and delivery policy
|
|
83
100
|
├── tracker.json secret-free tracker choice
|
|
84
101
|
├── context/ repository knowledge
|
|
102
|
+
├── mockups/decision.md app mockups adopted or declined
|
|
85
103
|
├── specs/<feature>/
|
|
86
104
|
│ ├── spec.md + decisions.md contract and decisions
|
|
105
|
+
│ ├── mockups/ approved directions and fidelity
|
|
87
106
|
│ ├── design.md + plan.md Complex approach and plan
|
|
88
107
|
│ ├── impact.json affected behavior and surfaces
|
|
89
108
|
│ ├── state.json + events/ phase and resumable journal
|
|
@@ -109,7 +128,11 @@ install or update. Linear setup then uses an in-memory OAuth client for Linear's
|
|
|
109
128
|
official remote MCP endpoint, with browser authorization through negotiated URL
|
|
110
129
|
elicitation. Empirical never reads Copilot's token store or persists the OAuth
|
|
111
130
|
token. The guarded `LINEAR_SECRET_KEY` host file remains a fallback, not the
|
|
112
|
-
default requirement for an OAuth-capable session.
|
|
131
|
+
default requirement for an OAuth-capable session. On Codex, Policy v2 can use
|
|
132
|
+
`connection: "linear-mcp"`: Empirical emits durable secret-free intents, Codex
|
|
133
|
+
executes them through the authenticated Linear MCP tools, and validated results
|
|
134
|
+
converge the same binding, milestone, and strict-gate records without sharing
|
|
135
|
+
the OAuth token.
|
|
113
136
|
|
|
114
137
|
## Documentation
|
|
115
138
|
|
|
@@ -134,3 +157,17 @@ reserved for validated release pull requests.
|
|
|
134
157
|
## License
|
|
135
158
|
|
|
136
159
|
[MIT](LICENSE)
|
|
160
|
+
|
|
161
|
+
### Shared specs across worktrees
|
|
162
|
+
|
|
163
|
+
Specs and capability contracts are repository artifacts. Each Git worktree
|
|
164
|
+
selects and claims its own active feature in local Git metadata; different
|
|
165
|
+
worktrees can execute different features concurrently. Unclaimed or temporarily
|
|
166
|
+
inactive specs stay in `.empirical/specs/`. They are not abandoned work.
|
|
167
|
+
|
|
168
|
+
Use the agent's `empirical_select` operation to resume an existing unclaimed
|
|
169
|
+
feature. Explicit new feature starts and repository setup/context repair are not
|
|
170
|
+
blocked by unrelated unclaimed specs. If a feature-required operation needs a
|
|
171
|
+
choice, it lists candidates rather than choosing or moving a spec. An approved
|
|
172
|
+
worktree handoff can be retried with its original input after interruption.
|
|
173
|
+
See [selection and recovery semantics](docs/protocol.md#shared-specs-and-checkout-selection).
|
package/dist/checkouts.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** Serialize checkout ownership across every worktree sharing Git metadata. */
|
|
2
|
+
export declare function withCheckoutLock<T>(root: string, operation: () => Promise<T>): Promise<T>;
|
|
1
3
|
export interface CheckoutSelection {
|
|
2
4
|
feature: string | null;
|
|
3
5
|
linked: boolean;
|
|
@@ -5,4 +7,17 @@ export interface CheckoutSelection {
|
|
|
5
7
|
claimedElsewhere: Set<string>;
|
|
6
8
|
}
|
|
7
9
|
export declare function readCheckoutSelection(rootInput: string): Promise<CheckoutSelection>;
|
|
8
|
-
export declare function writeCheckoutSelection(rootInput: string, feature: string | null): Promise<void>;
|
|
10
|
+
export declare function writeCheckoutSelection(rootInput: string, feature: string | null, expectedFeature?: string): Promise<void>;
|
|
11
|
+
/** Read only this checkout's recovery anchor, never sibling selections. */
|
|
12
|
+
export declare function readCheckoutLastFeature(rootInput: string): Promise<{
|
|
13
|
+
git: boolean;
|
|
14
|
+
feature: string | null;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function readCheckoutRecoveryFeatures(rootInput: string): Promise<{
|
|
17
|
+
git: boolean;
|
|
18
|
+
features: string[];
|
|
19
|
+
}>;
|
|
20
|
+
/** Write-ahead ownership: call after validation but before a terminal journal
|
|
21
|
+
* commit, so a process exit before selector cleanup cannot orphan the effect. */
|
|
22
|
+
export declare function recordCheckoutRecoveryFeature(rootInput: string, feature: string): Promise<void>;
|
|
23
|
+
export declare function forgetCheckoutRecoveryFeatures(rootInput: string, resolvedFeatures: string[]): Promise<void>;
|