empirical-sdd 0.28.0 → 0.30.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
@@ -8,6 +8,121 @@ under the alpha rules in [docs/versioning.md](docs/versioning.md).
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.30.0] - 2026-09-01
12
+
13
+ ### Added
14
+
15
+ - Added a zero-build, responsive project wiki with practical onboarding,
16
+ architecture and workflow guidance, searchable task-oriented navigation,
17
+ accessible Agentum motion, strict content security, reduced-motion support,
18
+ and meaningful no-JavaScript fallbacks.
19
+ - Added exact GitHub Copilot MCP configuration management that preserves
20
+ unrelated servers and user-owned collisions while installing and removing
21
+ only Empirical's managed stdio bridge.
22
+ - Added in-memory OAuth for Linear's official remote MCP endpoint through the
23
+ standalone `empirical mcp` bridge, using dynamic client registration, PKCE,
24
+ a state-bound ephemeral loopback callback, URL-mode elicitation, bounded
25
+ remote operations, sanitized failures, and complete session cleanup.
26
+
27
+ ### Changed
28
+
29
+ - Replaced the long-form README with a concise project introduction derived
30
+ from the wiki while retaining strict tracker recovery guidance and keeping
31
+ obsolete public integration examples out of generated onboarding.
32
+ - Generated initialization guidance now recommends an OAuth-capable Empirical
33
+ host when the current skill-only host cannot perform the browser handoff,
34
+ while retaining the secure host-only secret-file fallback.
35
+
36
+ ### Fixed
37
+
38
+ - Linear discovery, lifecycle suggestion, and preview now accept any finite
39
+ workflow-state position, including the negative floating-point ordering
40
+ values Linear legitimately assigns to backlog states.
41
+ - Fixed standalone Linear OAuth lifecycle behavior so cancellation, timeout,
42
+ callback races, invalid responses, and transport shutdown remain bounded and
43
+ cannot leak credentials or leave callback listeners running.
44
+
45
+ ### Migration
46
+
47
+ No migration required.
48
+
49
+ ## [0.29.0] - 2026-08-28
50
+
51
+ ### Added
52
+
53
+ - Added a disabled-by-default, protected-environment emergency release path with
54
+ exact administrator, incident, PR, merge, version, integrity, check, expiry,
55
+ and audit receipts while preserving ordinary exact protected-merge gates.
56
+ - Added public CLI help and README guidance explaining how Empirical routes and
57
+ advances work, where durable evidence lives, and how to use one consolidated
58
+ development setup command block.
59
+ - Added configurable pull-request review with a recommended independently
60
+ authenticated GitHub bot and an explicit fresh-context fallback, one
61
+ canonical criterion-complete review body, exact base/head diff binding, and
62
+ guided name-only credential setup.
63
+ - Added a guarded, idempotent `develop` to `main` release pipeline that binds
64
+ exact protected PR merge provenance and clean release checks to one
65
+ changelog-backed Git tag, non-draft GitHub Release, and npm trusted
66
+ publication with provenance.
67
+ - Added deterministic patch, minor, migration, conflict, partial-effect,
68
+ lost-response, duplicate, and retry fixtures plus an offline release dry run.
69
+ - Added a checked repository release-request shorthand and canonical playbook so
70
+ `make a new release` prepares every current `develop` change, verifies the
71
+ candidate, and creates or resumes the two guarded PR stages without granting
72
+ merge or direct publication authority.
73
+ - Added opt-in Tracker Policy v2 `strict` enforcement so deterministically
74
+ required work hard-stops before further source or workflow mutation until its
75
+ exact current revision is bound and synchronized.
76
+ - Added structured tracker mutation gates, exact feature-addressed terminal
77
+ synchronization, and crash recovery that refuses new work while strict final
78
+ tracking remains unresolved.
79
+ - Added criterion-complete risk-based QA matrices, anomaly-visible immutable
80
+ receipts, fresh-context and clean packaged-consumer acceptance, deterministic
81
+ failure-path coverage, and exact full-CI promotion gates.
82
+
83
+ ### Changed
84
+
85
+ - Ordinary release publication now supports solo-owned repositories without a
86
+ mandatory positive review while retaining `CHANGES_REQUESTED` blocking,
87
+ protected two-parent merge proof, complete CI and Release Gate, immutable
88
+ conflict refusal, protected npm environment, and trusted OIDC provenance.
89
+ - Made `develop` the ordinary feature/fix and source-evidence integration base;
90
+ protected `main` now accepts only the validated release PR from `develop`.
91
+ - Superseded the human-created GitHub Release boundary with exact merged-PR
92
+ authorization while preserving branch protection, immutable conflicts,
93
+ least-privilege GitHub/OIDC jobs, and token-free npm publication.
94
+ - Generated agent guidance now treats a blocked strict tracker gate as a hard
95
+ stop with OAuth/host-file, binding, reconciliation, or sync recovery, while
96
+ best-effort, optional, off, and Tracker Policy v1 behavior remain compatible.
97
+ - Approved worktree creation now resumes its returned action immediately,
98
+ including across a required host restart, without requesting a second
99
+ confirmation.
100
+
101
+ ### Fixed
102
+
103
+ - Normalized GitHub's null and empty post-merge `reviewDecision` forms before
104
+ complete review-history reduction so later reconciliation matches the earlier
105
+ solo-owner authorization while effective change requests still block.
106
+ - Made mutually exclusive ordinary/emergency authorizers use explicit
107
+ predecessor-success conditions so an intentionally skipped sibling cannot
108
+ transitively skip GitHub, npm, provenance, or verification jobs.
109
+ - Made immutable tag reconciliation create an annotated tag object and exact
110
+ tag ref through authenticated GitHub APIs instead of Git transport, while
111
+ retaining observation-led lost-response recovery and conflict refusal.
112
+ - Made Release Gate authentication available only to its exact read-only
113
+ candidate preflight while preserving `contents: read` and rejecting GitHub,
114
+ npm, tag, release, push, publish, and dist-tag mutation authority.
115
+ - Made protected delivery keep request-changes PRs draft, refuse draft or stale
116
+ merges, stop after two automatic repair rounds, and accept a valid non-author
117
+ latest approval when GitHub leaves aggregate `reviewDecision` empty.
118
+ - Made guarded tracker host files decode supported single- and double-quoted
119
+ dotenv values across LF and CRLF while rejecting malformed or control-bearing
120
+ assignments before provider access.
121
+
122
+ ### Migration
123
+
124
+ No migration required.
125
+
11
126
  ## [0.28.0] - 2026-08-24
12
127
 
13
128
  ### Added
@@ -236,7 +351,9 @@ Published through GitHub Actions trusted publishing with npm provenance.
236
351
 
237
352
  - Prepared and released package version `0.20.2`.
238
353
 
239
- [Unreleased]: https://github.com/goempirical/empirical-sdd/compare/v0.28.0...HEAD
354
+ [Unreleased]: https://github.com/goempirical/empirical-sdd/compare/v0.30.0...HEAD
355
+ [0.30.0]: https://github.com/goempirical/empirical-sdd/compare/v0.29.0...v0.30.0
356
+ [0.29.0]: https://github.com/goempirical/empirical-sdd/compare/v0.28.0...v0.29.0
240
357
  [0.28.0]: https://github.com/goempirical/empirical-sdd/compare/v0.27.0...v0.28.0
241
358
  [0.27.0]: https://github.com/goempirical/empirical-sdd/compare/v0.26.1...v0.27.0
242
359
  [0.26.1]: https://github.com/goempirical/empirical-sdd/compare/v0.26.0...v0.26.1
package/README.md CHANGED
@@ -1,153 +1,135 @@
1
1
  # Empirical SDD
2
2
 
3
- Agent-neutral, resumable spec-driven development for coding agents. Empirical
4
- turns an ordinary change request into a deterministic workflow with durable
5
- state, reviewable evidence, and safe Git integration.
3
+ **Agent work that survives the chat.**
6
4
 
7
- > Empirical 0.28 is alpha software. It requires Node.js 22 or newer.
5
+ Empirical is a repository-native harness for coding agents. The model writes;
6
+ Empirical keeps the contract, progress, proof, and exact next action in Git so
7
+ work can resume across sessions, agents, and machines.
8
8
 
9
- ## Install
9
+ > Empirical 0.29 is alpha software and requires Node.js 22 or newer.
10
10
 
11
- ```sh
12
- npm install -g empirical-sdd
13
- empirical install
14
- ```
11
+ **[Open the practical harness guide](https://goempirical.github.io/empirical-sdd/)**
12
+ for the visual walkthrough, diagrams, generated-file explorer, and complete
13
+ workflow. Its zero-build source is [docs/index.html](docs/index.html).
14
+
15
+ ## Start in three steps
16
+
17
+ 1. Install the package and the agent integrations you use.
18
+
19
+ ```sh
20
+ npm install -g empirical-sdd
21
+ empirical install
22
+ ```
23
+
24
+ 2. Initialize each repository once from your coding agent.
25
+
26
+ - Codex: `$empirical-init`
27
+ - Claude Code: `/empirical-init`
28
+
29
+ 3. Ask for the change normally.
30
+
31
+ ```text
32
+ Add rate limiting to the public API and prove the failure path.
33
+ ```
34
+
35
+ Repository mutations route automatically. Read-only questions remain
36
+ read-only. If work stops, reopen the same checkout and ask the agent to
37
+ continue—the committed journal provides the resume point.
15
38
 
16
- Choose the agents you use, reload them, then run `empirical-init` once in each
17
- repository. After initialization, ask for work normally—for example, “fix the
18
- pagination bug.” Empirical activates automatically for change requests while
19
- read-only questions stay outside the workflow.
20
-
21
- Codex uses `$empirical-init`, Claude Code uses `/empirical-init`, and Windsurf
22
- uses `@empirical-init`. Existing 0.22 repositories should invoke it once after
23
- upgrading; configuration, history, and evidence are preserved.
24
-
25
- Doctor verifies that completed repositories still have every required local
26
- instruction, native skill, and MCP bridge, including nested-directory and
27
- linked-worktree discovery. It distinguishes missing, stale, malformed, unsafe,
28
- non-canonical, shadowing, and global-collision states. Invoke `empirical-init`
29
- explicitly to reconcile Empirical-owned artifacts; unmanaged or unsafe
30
- conflicts are preserved. Correct files do not prove that an existing host
31
- session loaded them, so Doctor reports runtime loading as unverified and gives
32
- the applicable reload or fresh-session step.
33
-
34
- ## What it provides
35
-
36
- - Deterministic Fast or Complex routing based on the request's risk.
37
- - Resumable Specify, Design, Plan, Implement, Verify, Review, and Integrate phases.
38
- - Immutable evidence tied to criteria, source state, and provenance.
39
- - Isolated parallel work through linked Git worktrees.
40
- - Guided Linear, GitHub Issues + Projects, or Jira ticket mirrors with automatic
41
- binding, milestone comments, and safe evidence projection.
42
- - Selectable concise or detailed agent questions and runtime summaries.
43
- - Explicit, guarded delivery and npm publication boundaries.
44
-
45
- Completion is reported only at the highest proven level: implemented,
46
- verified, integrated, delivered, or published.
47
-
48
- ## Tracker setup
49
-
50
- `empirical-init` always shows Interaction and Tracker sections. New recommended
51
- setup selects **concise** questions: agents ask only when an answer changes
52
- scope, architecture, authorization, or a safety gate. **Detailed** preserves
53
- the expanded guidance used by existing Schema-5 repositories. Automation can
54
- set the same value with `--questions concise|detailed` or the MCP `questions`
55
- field.
56
-
57
- When no tracker choice exists, Init recommends **Track work by type** and
58
- requires choosing that or **No tracking** before setup can be saved. Track work
59
- selects Linear, GitHub Projects, or Jira; No tracking persists a provider-free
60
- choice and makes no provider requests.
61
-
62
- Authentication starts with OAuth when a trusted host supplies a connection.
63
- MCP clients may open that connection only through explicitly negotiated
64
- URL-mode elicitation; Empirical never requests a credential through a form,
65
- tool argument, tool result, assistant message, or repository file. The default
66
- standalone CLI has no hosted OAuth broker and truthfully proceeds to the
67
- host-only fallback.
68
-
69
- > **Never paste credentials into chat.** If OAuth is unavailable, edit the
70
- > secrets file directly on the host: `${XDG_CONFIG_HOME:-$HOME/.config}/empirical/secrets.env`
71
- > on POSIX or `%APPDATA%\Empirical\secrets.env` on Windows. Do not put a
72
- > credential value in a shell command, process argument, tool call, or
73
- > repository `.env` file.
74
-
75
- New setup uses `LINEAR_SECRET_KEY` for Linear, `GITHUB_TOKEN` for GitHub, and
76
- both `JIRA_EMAIL` and `JIRA_API_TOKEN` for Jira. The file must be a regular,
77
- non-symbolic-link file outside the repository and, on POSIX, owner-only (for
78
- example mode `0600`). Runtime precedence is connected host OAuth, then a
79
- complete injected environment set, then the checked host file. Existing
80
- Tracker Policy v1/v2 names—including `LINEAR_API_KEY` and custom names—remain
81
- valid and are never rewritten automatically.
82
-
83
- After authentication, Empirical discovers accessible targets and workflow
84
- states, proposes all seven semantic mappings, and shows the complete
85
- secret-free policy before saving. Ambiguous state suggestions require an
86
- explicit choice; simple boards may intentionally reuse one provider state for
87
- several phases. Repair preserves an existing tracker policy or explicit No
88
- tracking choice unless you change it.
89
-
90
- Tracker Policy v2 supports `off`, `manual`, and `ensure` ticket behavior plus
91
- blockers/final, phase-milestone, or every-revision progress comments. `ensure`
92
- validates a referenced ticket, reconciles the feature marker, and creates only
93
- when neither identifies one unique ticket. Local workflow state commits first;
94
- provider outages leave exact retry state and never rewind local work. Comments
95
- preserve user-authored descriptions, and receipt-approved evidence is uploaded
96
- or linked only after repository containment, media, size, and digest checks.
97
- Existing Tracker Policy v1 files remain valid with manual binding and legacy
98
- projection until deliberately upgraded.
99
-
100
- An optional strict `ticketRules` matrix refines `ensure` by change type and
101
- workflow size. The recommended `features+large-fixes` preset is:
102
-
103
- | Work | Fast | Quick | Complex |
104
- | --- | --- | --- | --- |
105
- | Feature | required | required | required |
106
- | Fix | optional | required | required |
107
- | Chore | optional | optional | optional |
108
-
109
- Optional work with no referenced ticket stays local without OAuth, provider
110
- access, ticket creation, or a redundant question. One explicit reference is
111
- attached; multiple references fail closed. See the [demo](docs/demo.md) for a
112
- provider-independent new-feature run and [MCP documentation](docs/mcp.md) for
113
- the complete custom JSON form.
114
-
115
- ## CLI
116
-
117
- | Command | Purpose |
39
+ ## Why use it?
40
+
41
+ | Without a harness | With Empirical |
118
42
  | --- | --- |
119
- | `empirical install` | Select agents and install or repair Empirical integrations. |
120
- | `empirical update` | Upgrade the package and refresh installed integrations. |
121
- | `empirical uninstall` | Remove Empirical-managed global files and the package. |
122
- | `empirical --help` | Show commands and automation options. |
43
+ | Lost chat | **Continuity** resume from repository state. |
44
+ | Ambiguous request | **Shared contract** agree on observable outcomes first. |
45
+ | Confidence without proof | **Honest evidence** bind claims to exact source, commands, attempts, and results. |
46
+ | Scope drift | **Reviewable scope** — keep decisions, diffs, failures, and gaps visible. |
47
+ | Unsafe convergence | **Safer integration** — isolate parallel work and validate against an independent target. |
48
+ | Accidental publication | **Bounded authority** — keep implementation, delivery, and publication separate. |
49
+
50
+ ## How it works
123
51
 
124
- `empirical uninstall` preserves project `.empirical` history, evidence, and
125
- repository configuration. Automation must confirm removal with `--yes`.
52
+ Empirical routes by risk, not prompt length:
126
53
 
127
- ## Safety
54
+ - **Fast** handles explicit, tiny, localized, reversible, contract-neutral work
55
+ with focused proof.
56
+ - **Complex** carries material work through a durable contract, decisions,
57
+ verification, exact-diff review, and independent integration.
128
58
 
129
- Empirical asks when a material product choice or permission is missing. It does
130
- not bypass host permissions or branch protection, extract credentials,
131
- force-write Git history, delete real worktrees, or infer publication. Releases
132
- remain bound to an exact version, commit, tag, and npm dist-tag.
59
+ ```text
60
+ Specify Design Plan Implement Context? → Verify → Review → Integrate
61
+ ```
62
+
63
+ Context runs when repository knowledge needs refinement. Failed verification or
64
+ requested review changes return to implementation. Evidence, review, and
65
+ integration are different claims, and Empirical reports only the highest level
66
+ actually proven: `implemented`, `verified`, `integrated`, `delivered`, or
67
+ `published`.
68
+
69
+ Delivery is never implied. Empirical does not infer permission to merge a pull
70
+ request, bypass protection, create a release, or publish a package.
71
+
72
+ ## What it creates
73
+
74
+ Init installs the harness; selected work fills in the record:
75
+
76
+ ```text
77
+ repository/
78
+ ├── AGENTS.md / CLAUDE.md / GEMINI.md bounded activation markers
79
+ ├── agent skill + MCP entries selected integrations
80
+ └── .empirical/
81
+ ├── config.json project setup
82
+ ├── policy.json verification and delivery policy
83
+ ├── tracker.json secret-free tracker choice
84
+ ├── context/ repository knowledge
85
+ ├── specs/<feature>/
86
+ │ ├── spec.md + decisions.md contract and decisions
87
+ │ ├── design.md + plan.md Complex approach and plan
88
+ │ ├── impact.json affected behavior and surfaces
89
+ │ ├── state.json + events/ phase and resumable journal
90
+ │ ├── evidence/receipts/ immutable attempts and artifacts
91
+ │ ├── reviews/ exact-diff review, when reached
92
+ │ └── integration-receipt.json convergence proof, when reached
93
+ └── capabilities/<capability>/ living behavior after integration
94
+ ```
95
+
96
+ Exact host files depend on the integrations selected during install. Init
97
+ creates durable setup and empty work containers; a real mutation creates a
98
+ feature record, and conditional artifacts appear only when their phases run.
99
+
100
+ Optional tracking mirrors approved milestones to Linear, GitHub, or Jira; the
101
+ repository remains authoritative. Policy supports
102
+ `enforcement: "best-effort" | "strict"`; strict recovery retries the exact
103
+ feature. Credentials never belong in chat, prompts, repository files, tool
104
+ arguments, or evidence.
105
+
106
+ When GitHub Copilot is selected, installation also reconciles the exact
107
+ Empirical stdio bridge in `~/.copilot/mcp-config.json`; start a new session after
108
+ install or update. Linear setup then uses an in-memory OAuth client for Linear's
109
+ official remote MCP endpoint, with browser authorization through negotiated URL
110
+ elicitation. Empirical never reads Copilot's token store or persists the OAuth
111
+ token. The guarded `LINEAR_SECRET_KEY` host file remains a fallback, not the
112
+ default requirement for an OAuth-capable session.
133
113
 
134
114
  ## Documentation
135
115
 
136
- [Protocol](docs/protocol.md) · [Architecture](docs/architecture.md) ·
137
- [MCP and tracking](docs/mcp.md) · [Demo](docs/demo.md) ·
138
- [Security](docs/security.md) · [Migration](docs/migration-v1.md) ·
139
- [Versioning](docs/versioning.md) · [Changelog](CHANGELOG.md)
116
+ - [Practical guide](https://goempirical.github.io/empirical-sdd/) visual onboarding and diagrams
117
+ - [Demo](docs/demo.md) — installation and representative scenarios
118
+ - [Protocol](docs/protocol.md) state machine, artifacts, and completion rules
119
+ - [Architecture](docs/architecture.md) persistence and trust boundaries
120
+ - [MCP and tracking](docs/mcp.md) — agent operations and tracker configuration
121
+ - [Security](docs/security.md) — credentials, execution, review, and authority
122
+ - [Releasing](docs/releasing.md) — guarded maintainer playbook
140
123
 
141
124
  ## Development
142
125
 
143
- Development requires Node.js 22+ and Bun. CI covers Node 22, 24, and 26.
144
-
145
126
  ```sh
146
- bun install
127
+ bun install --frozen-lockfile
147
128
  bun run ci
148
129
  ```
149
130
 
150
- The package exports `.`, `./protocol`, `./mcp`, and `./integrations`.
131
+ CI covers Node.js 22, 24, and 26. Ordinary changes target `develop`; `main` is
132
+ reserved for validated release pull requests.
151
133
 
152
134
  ## License
153
135
 
@@ -189,6 +189,8 @@ export declare const AGENT_SKILL_TARGETS: readonly [{
189
189
  readonly label: "GitHub Copilot";
190
190
  readonly globalSkillPath: ".copilot/skills";
191
191
  readonly detectPaths: readonly [".copilot"];
192
+ readonly reload: "Start a new Copilot CLI or Agent Host session so it reloads the global Empirical MCP bridge.";
193
+ readonly projectMcp: true;
192
194
  }, {
193
195
  readonly id: "goose";
194
196
  readonly label: "Goose";