@synapsor/runner 1.4.123 → 1.5.3

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.
Files changed (98) hide show
  1. package/CHANGELOG.md +144 -19
  2. package/README.md +132 -135
  3. package/dist/authoring.d.ts +23 -0
  4. package/dist/authoring.d.ts.map +1 -0
  5. package/dist/authoring.mjs +1318 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +4 -5
  8. package/dist/local-ui.d.ts +14 -0
  9. package/dist/local-ui.d.ts.map +1 -1
  10. package/dist/runner.mjs +18427 -7084
  11. package/dist/runtime.d.ts +50 -0
  12. package/dist/runtime.d.ts.map +1 -0
  13. package/dist/runtime.mjs +15094 -0
  14. package/dist/shadow.d.ts +36 -0
  15. package/dist/shadow.d.ts.map +1 -0
  16. package/dist/shadow.mjs +5262 -0
  17. package/docs/README.md +44 -5
  18. package/docs/alternatives.md +122 -0
  19. package/docs/capability-authoring.md +44 -1
  20. package/docs/client-recipes.md +218 -0
  21. package/docs/contract-testing.md +9 -7
  22. package/docs/cursor-plugin.md +78 -0
  23. package/docs/database-enforced-scope.md +273 -0
  24. package/docs/dependency-license-inventory.md +6 -2
  25. package/docs/doctor.md +17 -0
  26. package/docs/effect-regression.md +179 -0
  27. package/docs/fresh-developer-usability.md +110 -0
  28. package/docs/getting-started-own-database.md +103 -2
  29. package/docs/host-compatibility.md +59 -0
  30. package/docs/local-mode.md +12 -7
  31. package/docs/mcp-apps.md +188 -0
  32. package/docs/mcp-audit.md +220 -2
  33. package/docs/mcp-client-setup.md +20 -4
  34. package/docs/mcp-clients.md +41 -4
  35. package/docs/oss-vs-cloud.md +3 -0
  36. package/docs/production.md +8 -0
  37. package/docs/release-notes.md +138 -14
  38. package/docs/release-policy.md +9 -5
  39. package/docs/runner-config-reference.md +25 -0
  40. package/docs/schema-api-candidates.md +68 -0
  41. package/docs/security-boundary.md +30 -5
  42. package/docs/shadow-studies.md +241 -0
  43. package/docs/troubleshooting-first-run.md +46 -0
  44. package/examples/mcp-postgres-billing-app-handler/app-handler.mjs +9 -1
  45. package/examples/mcp-postgres-billing-app-handler/schema.sql +11 -0
  46. package/examples/mcp-postgres-billing-app-handler/synapsor-handler.mjs +3 -0
  47. package/examples/raw-sql-vs-synapsor/Makefile +2 -2
  48. package/examples/raw-sql-vs-synapsor/README.md +6 -4
  49. package/examples/support-billing-agent/Makefile +5 -1
  50. package/examples/support-billing-agent/README.md +57 -5
  51. package/examples/support-billing-agent/app/README.md +6 -0
  52. package/examples/support-billing-agent/app/contract.ts +28 -0
  53. package/examples/support-billing-agent/app/effect-adapter.mjs +23 -0
  54. package/examples/support-billing-agent/app/record-shadow-outcomes.mjs +44 -0
  55. package/examples/support-billing-agent/db/schema.sql +88 -1
  56. package/examples/support-billing-agent/db/seed.sql +15 -15
  57. package/examples/support-billing-agent/scripts/run-demo.sh +4 -0
  58. package/examples/support-billing-agent/scripts/run-evaluation.sh +63 -0
  59. package/examples/support-billing-agent/shadow-study/cases.jsonl +6 -0
  60. package/examples/support-billing-agent/shadow-study/outcomes.jsonl +2 -0
  61. package/examples/support-billing-agent/synapsor.runner.json +17 -5
  62. package/examples/support-plan-credit/README.md +48 -2
  63. package/examples/support-plan-credit/mcp-client-examples/README.md +23 -0
  64. package/examples/support-plan-credit/mcp-client-examples/claude-code.sh +34 -0
  65. package/examples/support-plan-credit/mcp-client-examples/codex.config.toml +24 -0
  66. package/examples/support-plan-credit/mcp-client-examples/generic-stdio.mjs +35 -0
  67. package/examples/support-plan-credit/mcp-client-examples/generic-streamable-http.mjs +31 -0
  68. package/examples/support-plan-credit/mcp-client-examples/google-adk.py +40 -0
  69. package/examples/support-plan-credit/mcp-client-examples/langchain.mjs +29 -0
  70. package/examples/support-plan-credit/mcp-client-examples/llamaindex.py +36 -0
  71. package/examples/support-plan-credit/mcp-client-examples/openai-agents-stdio.ts +1 -1
  72. package/examples/support-plan-credit/mcp-client-examples/openai-agents-streamable-http.ts +1 -1
  73. package/examples/support-plan-credit/mcp-client-examples/vscode.mcp.json +20 -0
  74. package/examples/support-plan-credit/synapsor/actions/support.propose_plan_credit.contract-tests.generated.json +221 -0
  75. package/examples/support-plan-credit/synapsor/actions/support.propose_plan_credit.ts +34 -0
  76. package/fixtures/effects/changed/eff_support_late_fee_v1.result.json +58 -0
  77. package/fixtures/effects/dataset.json +8 -0
  78. package/fixtures/effects/results/eff_support_late_fee_v1.result.json +59 -0
  79. package/fixtures/effects/support-late-fee.effect.json +71 -0
  80. package/fixtures/generators/drizzle/malicious.ts +11 -0
  81. package/fixtures/generators/drizzle/schema.ts +12 -0
  82. package/fixtures/generators/openapi/external-ref.yaml +15 -0
  83. package/fixtures/generators/openapi/openapi.yaml +81 -0
  84. package/fixtures/generators/prisma/schema.prisma +34 -0
  85. package/fixtures/mcp-audit/README.md +14 -0
  86. package/fixtures/mcp-audit/cursor-bypass-config.json +38 -0
  87. package/fixtures/mcp-audit/dangerous-tools-list.json +33 -0
  88. package/fixtures/mcp-audit/reviewed-proposal-tools-list.json +60 -0
  89. package/package.json +29 -3
  90. package/schemas/effect-dataset.schema.json +19 -0
  91. package/schemas/effect-fixture.schema.json +191 -0
  92. package/schemas/effect-result.schema.json +52 -0
  93. package/schemas/mcp-audit-candidates.schema.json +41 -0
  94. package/schemas/mcp-audit-report.schema.json +203 -0
  95. package/schemas/schema-candidate-review.schema.json +167 -0
  96. package/schemas/schema-candidates.schema.json +49 -0
  97. package/schemas/synapsor.contract-tests.schema.json +1 -1
  98. package/schemas/synapsor.runner.schema.json +51 -0
package/docs/mcp-audit.md CHANGED
@@ -8,7 +8,10 @@ available for users who look for the command under the MCP namespace.
8
8
  From a source checkout, use `./bin/synapsor-runner ...` if the global binary is not
9
9
  linked yet.
10
10
 
11
- It does not call business tools. It only inspects names, descriptions, input schemas, output schemas, annotations, and examples when those are present.
11
+ Static mode does not launch configured MCP servers or call business tools. It
12
+ only inspects names, descriptions, input schemas, output schemas, annotations,
13
+ and examples when those are present. An explicitly consented live check calls
14
+ only `initialize` and `tools/list` on one named server.
12
15
 
13
16
  Every report includes this disclaimer:
14
17
 
@@ -37,6 +40,15 @@ Human-readable output:
37
40
  npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json
38
41
  ```
39
42
 
43
+ The default terminal report groups repeated findings into the three most
44
+ important root causes. It shows affected tools, a short blast-radius statement,
45
+ and one next action instead of repeating the same explanation for every tool.
46
+ Use the complete view when triaging every finding:
47
+
48
+ ```bash
49
+ npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json --verbose
50
+ ```
51
+
40
52
  Remote `tools/list` endpoint with a bearer token kept in the environment:
41
53
 
42
54
  ```bash
@@ -62,12 +74,51 @@ JSON output:
62
74
  npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json --format json
63
75
  ```
64
76
 
77
+ The JSON contract remains `synapsor.mcp-audit.v1`; its published schema is
78
+ [`schemas/mcp-audit-report.schema.json`](../schemas/mcp-audit-report.schema.json).
79
+
80
+ SARIF 2.1.0 output for code-scanning ingestion:
81
+
82
+ ```bash
83
+ npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json --format sarif > mcp-audit.sarif
84
+ ```
85
+
65
86
  Markdown output for issues, PRs, or security review notes:
66
87
 
67
88
  ```bash
68
89
  npx -y -p @synapsor/runner synapsor-runner audit --example dangerous-db-mcp --format markdown
69
90
  ```
70
91
 
92
+ Inspect a project-scoped Cursor configuration without launching anything:
93
+
94
+ ```bash
95
+ npx -y -p @synapsor/runner synapsor-runner audit \
96
+ --mcp-config ./.cursor/mcp.json \
97
+ --format markdown
98
+ ```
99
+
100
+ Static client-config output marks every server without supplied tool metadata
101
+ as `requires_operator_verification`. To query one reviewed stdio command, name
102
+ that exact server and give explicit consent:
103
+
104
+ ```bash
105
+ npx -y -p @synapsor/runner synapsor-runner audit \
106
+ --mcp-config ./.cursor/mcp.json \
107
+ --live-server synapsor \
108
+ --yes \
109
+ --format json
110
+ ```
111
+
112
+ Runner does not use a shell and refuses unresolved interpolation. For Cursor's
113
+ documented `${workspaceFolder}` token, a config under `.cursor/mcp.json`
114
+ resolves against the project root. Live mode executes no business, approval,
115
+ apply, commit, or revert tool. It cannot prove the selected server is secure.
116
+
117
+ The bypass check matters after installing Runner: another model-visible MCP
118
+ server may still expose `execute_sql` or a direct write. Synapsor cannot govern
119
+ calls routed around Runner. Audit reports the server and observed tool names,
120
+ but never removes or rewrites unrelated MCP configuration automatically.
121
+
71
122
  During local development, the repo-local wrapper can run the same command:
72
123
 
73
124
  ```bash
@@ -75,6 +126,55 @@ During local development, the repo-local wrapper can run the same command:
75
126
  ./bin/synapsor-runner audit ./tools-list.json --format json
76
127
  ```
77
128
 
129
+ ## Generate review candidates
130
+
131
+ Audit can create a separate review directory without editing or activating the
132
+ source configuration:
133
+
134
+ ```bash
135
+ npx -y -p @synapsor/runner synapsor-runner audit generate \
136
+ ./tools-list.json \
137
+ --output ./synapsor-audit-candidates
138
+ ```
139
+
140
+ Open the same blocked candidate directly in the secured local review
141
+ workbench:
142
+
143
+ ```bash
144
+ npx -y -p @synapsor/runner synapsor-runner audit generate \
145
+ ./tools-list.json \
146
+ --output ./synapsor-audit-candidates \
147
+ --open-ui
148
+ ```
149
+
150
+ This does not activate the candidate. The generated Runner config has no source
151
+ and every proposal writeback is `none`.
152
+
153
+ The generator uses the same parser and findings as `audit`. It writes:
154
+
155
+ - a canonical `@synapsor/spec` contract;
156
+ - a strict-shadow Runner scaffold with no configured source;
157
+ - deny, redaction, and operator-boundary test candidates;
158
+ - before/after model tool-surface reports;
159
+ - a `REVIEW.md` checklist.
160
+
161
+ Generated candidates do not carry authority. Every proposal has
162
+ `writeback.mode: none`, the Runner scaffold is `shadow`, and the source map is
163
+ empty. Subject identifiers and visible/write fields are conspicuous
164
+ `review_required_*` placeholders. Input fields that look like SQL, dynamic
165
+ identifiers, tenant/principal scope, credentials, approval identity, or row
166
+ version are omitted rather than copied into model arguments.
167
+
168
+ The output excludes raw descriptions, defaults, examples, enum values, bearer
169
+ tokens, and credentials. Unknown business meaning becomes a TODO. A developer
170
+ must inspect the real schema, choose trusted tenant/principal bindings, run the
171
+ generated tests and a Shadow study, then deliberately copy reviewed definitions
172
+ into an active contract.
173
+
174
+ Generation refuses an existing directory. `--force` only replaces a directory
175
+ that carries Runner's `synapsor.audit-candidates.v1` ownership marker; it will
176
+ not overwrite an arbitrary hand-edited directory.
177
+
78
178
  ## Supported inputs
79
179
 
80
180
  The audit accepts common exported shapes:
@@ -93,7 +193,33 @@ The audit accepts common exported shapes:
93
193
 
94
194
  It also scans nested `adapter`, `mcpServers`, and `servers` blocks when they include tool metadata.
95
195
 
96
- For live targets, the audit calls only JSON-RPC `tools/list`. It does not call business tools, approval tools, commit tools, or writeback tools.
196
+ For live stdio targets, the audit performs MCP `initialize`, then calls only
197
+ JSON-RPC `tools/list`. Remote URL mode calls `tools/list`. It does not call
198
+ business tools, approval tools, commit tools, or writeback tools.
199
+
200
+ Checked-in deterministic fixtures live under
201
+ [`fixtures/mcp-audit`](../fixtures/mcp-audit). The repository's
202
+ [`mcp-audit` GitHub Actions workflow](https://github.com/Synapsor/Synapsor-Runner/blob/main/.github/workflows/mcp-audit.yml)
203
+ builds the package, proves the dangerous fixture is detected, emits SARIF for
204
+ the reviewed proposal fixture, validates the SARIF shape, and uploads the
205
+ artifacts. Code-scanning upload runs only outside pull requests so forks do not
206
+ receive write authority.
207
+
208
+ ## Model-authority map
209
+
210
+ Every text, JSON, Markdown, and SARIF report records structural evidence for:
211
+
212
+ - semantic reads and semantic proposals;
213
+ - direct writes and raw SQL/query authority;
214
+ - arbitrary identifier and model-controlled trust inputs;
215
+ - model-visible approval/apply/commit/revert authority;
216
+ - structured output and observable conflict/idempotency signals;
217
+ - controls that require an operator or sit outside static audit visibility.
218
+
219
+ Statuses are `observed`, `not_observed`, `requires_operator_verification`, or
220
+ `outside_static_audit_visibility`. These are evidence labels, not a numerical
221
+ security score. `not_observed` means only that the supplied metadata did not
222
+ show the authority. It is not proof of absence at runtime.
97
223
 
98
224
  ## Findings
99
225
 
@@ -110,6 +236,85 @@ The audit flags database-commit risks such as:
110
236
  - ambiguous read/write tool boundaries;
111
237
  - missing business descriptions, annotations, or fixture examples.
112
238
 
239
+ ### Finding remediation index
240
+
241
+ The report carries one stable remediation URL for every finding. These anchors
242
+ are intentionally durable for JSON, Markdown, SARIF, pull requests, and code
243
+ scanning.
244
+
245
+ <a id="finding-generic-sql-tool"></a>
246
+ <a id="finding-write-tool-accepts-arbitrary-sql"></a>
247
+ <a id="finding-arbitrary-identifier-input"></a>
248
+ <a id="finding-arbitrary-predicate-input"></a>
249
+
250
+ #### Raw SQL, arbitrary identifiers, and free-form predicates
251
+
252
+ Replace generic SQL/query tools and model-selected schemas, tables, databases,
253
+ columns, filters, predicates, or WHERE clauses with a reviewed semantic
254
+ capability. Fixed identifiers and row-selection rules belong in the contract;
255
+ model inputs carry bounded business values only.
256
+
257
+ <a id="finding-model-controlled-trust-scope"></a>
258
+
259
+ #### Model-controlled trust scope
260
+
261
+ Bind tenant, principal, source, allowed fields, approval identity, and conflict
262
+ authority from verified context outside model arguments. Retain database RLS,
263
+ restricted views, and least-privilege roles underneath Runner.
264
+
265
+ <a id="finding-model-callable-commit-or-approval"></a>
266
+ <a id="finding-write-without-proposal-boundary"></a>
267
+ <a id="finding-mcp-bypass-direct-authority"></a>
268
+
269
+ #### Missing review boundary or bypass
270
+
271
+ Expose an immutable proposal rather than direct mutation. Keep activation,
272
+ approval, apply, commit, and revert outside MCP. Disable or independently
273
+ constrain another model-visible server that bypasses Runner; Synapsor cannot
274
+ govern calls made through that server.
275
+
276
+ <a id="finding-no-idempotency-field"></a>
277
+ <a id="finding-no-conflict-guard"></a>
278
+ <a id="finding-ambiguous-read-write-tool"></a>
279
+
280
+ #### Retry, stale-state, and mixed-authority gaps
281
+
282
+ Separate reads from proposals and require stable operation identity,
283
+ idempotency receipts, an exact conflict/version guard, and an affected-row
284
+ bound before trusted writeback.
285
+
286
+ <a id="finding-no-structured-output-schema"></a>
287
+
288
+ #### Missing structured output
289
+
290
+ Publish typed results that distinguish reads, pending proposals, conflicts,
291
+ failures, receipts, evidence, replay, and retry guidance without parsing prose.
292
+
293
+ <a id="finding-missing-business-description"></a>
294
+ <a id="finding-missing-risk-annotations"></a>
295
+ <a id="finding-missing-test-fixture"></a>
296
+
297
+ #### Reviewability gaps
298
+
299
+ Add a reviewer-readable business description, honest read/destructive hints,
300
+ and a non-production fixture. Annotations are vocabulary for clients, not an
301
+ enforcement boundary.
302
+
303
+ <a id="finding-mcp-server-tool-surface-unverified"></a>
304
+
305
+ #### Unverified configured server
306
+
307
+ Export that server's `tools/list`, or run the exact named `--live-server` check
308
+ after reviewing its configured command. Static client configuration does not
309
+ reveal the actual tool catalog.
310
+
311
+ <a id="finding-no-tools-found"></a>
312
+
313
+ #### No tools found
314
+
315
+ Provide an exported `tools/list` response, a supported manifest, a Runner
316
+ config, or an explicitly consented live target.
317
+
113
318
  ## Recommended target shape
114
319
 
115
320
  A safer model-facing database MCP tool should look like a reviewed semantic proposal capability:
@@ -151,6 +356,19 @@ A safer model-facing database MCP tool should look like a reviewed semantic prop
151
356
 
152
357
  Trusted values such as tenant, principal, source, allowed columns, approval identity, row-version guard, and database credentials must come from Synapsor/runner context, not from model-facing arguments.
153
358
 
359
+ To turn an identified business write into a disabled reviewed action, continue
360
+ with the Safe Action Composer:
361
+
362
+ ```bash
363
+ synapsor-runner start \
364
+ --action refund_order \
365
+ --description "Propose one reviewed order refund"
366
+ ```
367
+
368
+ The generated TypeScript action remains disabled. A coding agent may complete
369
+ and validate it; only a human can activate its exact digest in the secured
370
+ localhost Workbench.
371
+
154
372
  ## Related Fixture Benchmark
155
373
 
156
374
  `synapsor-runner benchmark mcp-efficiency` compares a fixed generic database
@@ -11,9 +11,18 @@ or SDK. The simplest local-client contract is stdio. Standard HTTP MCP is
11
11
  available through Streamable HTTP when your agent connects to a long-running
12
12
  Runner service.
13
13
 
14
- Command examples use the published alpha package through `npx`. From a source
15
- checkout, use `./bin/synapsor-runner ...` only when you intentionally want the local
16
- source wrapper.
14
+ The checked [Client And Framework Recipes](client-recipes.md) use one shared
15
+ `support.propose_plan_credit` flow and distinguish host evidence from standard
16
+ MCP protocol evidence.
17
+
18
+ Proposal tools also advertise a standard display-only
19
+ [MCP App](mcp-apps.md). Supporting hosts discover it from tool metadata;
20
+ other clients keep the same text/JSON proposal result. Approval and apply
21
+ remain outside MCP in both cases.
22
+
23
+ Command examples use the stable untagged package through `npx`. From a source
24
+ checkout, use `./bin/synapsor-runner ...` only when you intentionally want the
25
+ local source wrapper.
17
26
 
18
27
  Checked examples live in:
19
28
 
@@ -136,6 +145,11 @@ backup before writing. Noninteractive scripts must add `--yes`.
136
145
  The command writes only the local stdio MCP command and args. It does not write
137
146
  database URLs or passwords into the client config.
138
147
 
148
+ No separate Apps flag is required. A compatible host discovers
149
+ `ui://synapsor/proposal-review.html` from proposal-tool metadata. The app can
150
+ display the exact diff, but it has no approval/apply authority; use the
151
+ standalone local UI or terminal for human review.
152
+
139
153
  ## Start Command
140
154
 
141
155
  From the runner repository:
@@ -144,7 +158,9 @@ From the runner repository:
144
158
  npx -y -p @synapsor/runner synapsor-runner mcp serve --config ./examples/mcp-postgres-billing/synapsor.runner.json --store ./.synapsor/local.db
145
159
  ```
146
160
 
147
- For the alpha package, keep the package tag explicit in client configuration.
161
+ For reproducible deployments, pin an exact stable version in package manifests
162
+ and MCP client configuration. The untagged examples above intentionally resolve
163
+ the current `latest` release.
148
164
 
149
165
  For standard app/server HTTP MCP mode:
150
166
 
@@ -4,12 +4,22 @@ Synapsor Runner exposes reviewed semantic tools over standard MCP. The model
4
4
  receives inspect/propose capabilities; it does not receive raw SQL, database
5
5
  credentials, approval commands, or apply commands.
6
6
 
7
+ Proposal tools advertise a display-only [MCP App](mcp-apps.md). Hosts that
8
+ implement the Apps extension can render the exact proposal diff inline.
9
+ Clients without it receive the same structured/text result, and human approval
10
+ still occurs in the standalone operator UI or terminal.
11
+
7
12
  The complete copy-paste templates live in:
8
13
 
9
14
  - [`examples/support-plan-credit/mcp-client-examples/`](../examples/support-plan-credit/mcp-client-examples/)
10
15
  - every local `synapsor-runner contract bundle` output;
11
16
  - every downloadable Synapsor Cloud runner bundle.
12
17
 
18
+ For one shared proposal call across Claude Code, Codex, VS Code, OpenAI Agents,
19
+ LangChain/LangGraph, Google ADK, LlamaIndex, and generic MCP clients, see
20
+ [Client And Framework Recipes](client-recipes.md). Each recipe states whether
21
+ it is host-tested, configuration-tested, protocol-tested, or recipe-only.
22
+
13
23
  Before connecting a client, validate the local boundary:
14
24
 
15
25
  ```bash
@@ -57,15 +67,39 @@ repository file.
57
67
 
58
68
  ### Cursor
59
69
 
60
- For one repository, place the project template at `.cursor/mcp.json`. For a
61
- global setup, merge `cursor-global.mcp.json` through Cursor's MCP settings and
62
- replace every `<absolute-path-to-bundle>` marker. Restart the MCP server from
63
- Cursor settings after editing.
70
+ Prefer Runner's owned project lifecycle for one repository:
71
+
72
+ ```bash
73
+ synapsor-runner mcp install cursor --project --dry-run \
74
+ --config ./synapsor.runner.json \
75
+ --store ./.synapsor/local.db
76
+ synapsor-runner mcp install cursor --project --yes \
77
+ --config ./synapsor.runner.json \
78
+ --store ./.synapsor/local.db
79
+ synapsor-runner mcp status cursor --project --check-launch
80
+ ```
81
+
82
+ Runner previews the merge, backs up an existing `.cursor/mcp.json`, preserves
83
+ other MCP servers/settings, writes an exact-version `npx` invocation, and
84
+ tracks only its own entry with an integrity marker. Repeating install is
85
+ idempotent. `mcp uninstall cursor --project --yes` removes only that intact,
86
+ Runner-owned entry and also creates a backup.
87
+
88
+ For global setup, merge `cursor-global.mcp.json` through Cursor's MCP settings
89
+ and replace every `<absolute-path-to-bundle>` marker. Restart the MCP server
90
+ from Cursor settings after editing.
64
91
 
65
92
  The model-facing list should contain only the contract's inspect/propose tools.
66
93
  If Cursor reports a missing config or store, use absolute paths and rerun
67
94
  `tools preview` from the same working directory.
68
95
 
96
+ Cursor can be configured to auto-run model-facing tools. Synapsor therefore
97
+ never exposes approval, apply, revert, policy activation, trusted identity, or
98
+ credentials as MCP tools. Inline MCP App review is not assumed for Cursor; use
99
+ the secured localhost workbench or operator CLI. No Add to Cursor deep link is
100
+ generated because Runner has not verified a currently documented generic
101
+ payload for this server. See [Host Compatibility](host-compatibility.md).
102
+
69
103
  ### OpenAI Agents SDK
70
104
 
71
105
  Install the SDK in your agent project and run either TypeScript template:
@@ -110,6 +144,9 @@ The preview must list semantic capabilities and must not list `execute_sql`,
110
144
  approval/apply tools, database URLs, write credentials, or model-controlled
111
145
  tenant authority.
112
146
 
147
+ MCP App discovery is automatic from the proposal tool's
148
+ `_meta.ui.resourceUri`; it does not require credentials in the client snippet.
149
+
113
150
  ## Troubleshooting
114
151
 
115
152
  - `ENOENT` or missing config: use absolute config/store paths.
@@ -22,6 +22,7 @@ runtime stay local.
22
22
  | Contract source | Local files reviewed in Git | Shared registry with immutable versions and digests |
23
23
  | Trusted context | Local environment/session bindings | Registered bindings plus deployment-specific Cloud session context |
24
24
  | Capabilities | Local semantic MCP tools | Registry, version history, and capability inspection |
25
+ | Safe Action activation | Explicit digest-confirmed local Workbench activation after a source-unchanged staging Data PR | Governed Cloud activation and immutable registry version; local coding agents still cannot activate |
25
26
  | Evidence and replay | Local SQLite ledger by default; optional shared Postgres runtime store | Redacted shared chronology and references; full evidence payload stays local by default |
26
27
  | Approval | Local CLI or localhost UI | Human-authenticated shared approval inbox; unavailable to MCP/Runner tokens |
27
28
  | Writeback | Guarded one-row CRUD, fixed/frozen bounded sets, or app-owned executor | Durable approval/job/lease coordination; the local Runner rechecks and executes |
@@ -36,6 +37,8 @@ runtime stay local.
36
37
  - direct access to Postgres or MySQL;
37
38
  - the process that executes guarded writeback;
38
39
  - local development ledgers when Cloud linkage is not enabled.
40
+ - local disabled Safe Action drafts, project agent instructions, and source
41
+ database preview/writeback execution.
39
42
 
40
43
  Cloud contract registration does not require uploading database credentials or
41
44
  business rows. A Runner bundle contains the normalized contract, placeholder
@@ -94,6 +94,14 @@ Read credential:
94
94
  - can `SELECT` only the tables/views used by capabilities;
95
95
  - should be restricted by views/RLS where possible.
96
96
 
97
+ Name the scope mode in production reviews. The compatibility default is
98
+ application-level Runner predicates with a shared credential. PostgreSQL can
99
+ add database-enforced RLS to catch omitted predicates and pooled-context
100
+ leakage. Tenant-bound credentials or isolated processes remove
101
+ organization-wide authority from a Runner process. See
102
+ [Database-Enforced Tenant And Principal
103
+ Scope](database-enforced-scope.md).
104
+
97
105
  Write credential for direct `sql_update`:
98
106
 
99
107
  - can use only the operation-specific business DML and reviewed columns;
@@ -10,7 +10,131 @@ npx -y -p @synapsor/runner synapsor-runner demo --quick
10
10
  The OSS runner command is `synapsor-runner`. The `synapsor` command is reserved
11
11
  for the Synapsor Cloud CLI.
12
12
 
13
- ## 1.4.123 (prepared, not published)
13
+ ## 1.5.3 (prepared, not published)
14
+
15
+ ### Intent to Safe Action
16
+
17
+ - `start --action <name> --description <intent>` creates one inert TypeScript
18
+ Safe Action scaffold from an existing reviewed read boundary. Project-scoped
19
+ instructions let a coding agent complete and validate only the draft.
20
+ - `action validate` statically parses the restricted object and emits a
21
+ digest-addressed disabled canonical draft, explanation, and deterministic
22
+ allow/deny/effect tests. It does not import adopter code, activate the action,
23
+ or alter the active MCP tool catalog.
24
+ - The secured Workbench runs one real source-unchanged staging Data PR before
25
+ activation and requires `ACTIVATE` plus the complete digest. Cloud-linked
26
+ projects use governed Cloud activation. Existing proposals remain bound to
27
+ the exact active contract digest they were created under.
28
+ - The package includes a current-format Cursor plugin with
29
+ `/synapsor-protect`, diagnostics, deterministic package verification, and
30
+ project-safe MCP wiring. Cursor host claims remain evidence-labeled; a stable
31
+ UI pass and Marketplace submission are owner gates.
32
+ - MCP audit now renders a model-authority map and opt-in bypass evidence as
33
+ text, JSON, Markdown, or SARIF. A checked-in GitHub Actions workflow and Safe
34
+ Action team CI are deterministic and non-mutating.
35
+ - Proposal-only integration recipes cover Claude Code, Codex, VS Code, OpenAI
36
+ Agents, LangChain/LangGraph, Google ADK, LlamaIndex, and generic MCP clients.
37
+ - The first two README screens, public website, article, discovery routes, and
38
+ 36-second evidence-backed demo now lead with the own-project Data PR path.
39
+
40
+ Prepared package version: `@synapsor/runner@1.5.3`. Spec, DSL, and Cloud CLI
41
+ packages are unchanged. Nothing has been published by this repository change.
42
+
43
+ ## 1.5.2 (prepared, not published)
44
+
45
+ ### First safe action in an existing application
46
+
47
+ - `start --from-env DATABASE_URL` and
48
+ `try --prove --from-env DATABASE_URL` now converge on one own-data
49
+ onboarding path. It inspects a staging database read-only, asks the developer
50
+ to choose trusted scope and one reviewed action, emits canonical files, and
51
+ never substitutes synthetic data after an own-data failure.
52
+ - The localhost workbench presents Project, Data source, Trust scope, Action,
53
+ Agent, Test, and Review plus an exact proposal Data PR. Test is complete only
54
+ after a scoped tool call records query audit, not after config validation.
55
+ - Project-scoped Cursor install/status/uninstall previews and owns only its MCP
56
+ entry, preserves other entries, and launches the exact Runner version.
57
+ Approval, apply, revert, credentials, and trusted identity stay outside MCP.
58
+ - Local activation reports measure proof, onboarding, Cursor, first read, and
59
+ first proposal without telemetry or business identifiers. Product time
60
+ excludes initial package download; cold `npx` time is reported separately
61
+ as an observed environment-specific measurement.
62
+ - Optional TypeScript authoring emits the same canonical Spec contract. Shadow
63
+ trust progression and provider-neutral effect regression remain
64
+ non-activating and preserve deterministic/external-model provenance.
65
+ - MCP audit candidates can open directly in the secured workbench, and the
66
+ release includes the host-compatibility matrix and support/billing reference
67
+ workflow.
68
+ - The package now requires Node 22.13.0 or newer, the first Node 22 release
69
+ where Runner's `node:sqlite` dependency is available without an experimental
70
+ runtime flag. Older Node versions fail immediately with an actionable error.
71
+
72
+ Prepared package version: `@synapsor/runner@1.5.2`. Spec, DSL, and Cloud CLI
73
+ packages are unchanged. Nothing has been published by this repository change.
74
+
75
+ ## 1.5.1 (prepared, not published)
76
+
77
+ ### Safe disposable state ownership
78
+
79
+ - `try --state-dir` no longer treats the supplied directory as disposable.
80
+ The supplied path is a caller-owned container and Runner uses a marked
81
+ managed child beneath it.
82
+ - Cleanup removes only known direct try-state files. Unrelated files remain in
83
+ place, and roots, home/cwd/repository paths, traversal, symlink escapes,
84
+ unmarked lookalikes, and linked managed files fail closed.
85
+ - An atomic state lease prevents concurrent runs from corrupting each other and
86
+ permits recovery from a valid lease whose process is no longer alive.
87
+ - `demo inspect --state-dir` resolves the same managed child. The default
88
+ `.synapsor/try` path safely adopts only the recognized legacy file layout.
89
+ - Explicit `--force` replacement of generated schema and MCP-audit candidate
90
+ directories now rejects protected paths, symlinked ancestors, and linked or
91
+ invalid ownership markers.
92
+ - The embedded `try` data source is consistently identified as synthetic.
93
+ - The packaged YAML parser is updated to `2.8.3` to include the upstream fix
94
+ for deeply nested collection denial of service.
95
+
96
+ Prepared package version: `@synapsor/runner@1.5.1`. Spec, DSL, and Cloud CLI
97
+ packages are unchanged. Nothing has been published by this repository change.
98
+
99
+ ## 1.5.0 (published 2026-07-20)
100
+
101
+ ### Complete guarded-action developer proof
102
+
103
+ - `synapsor-runner try --prove` now demonstrates the complete embedded
104
+ business-action boundary without an account, database, Docker daemon, MCP
105
+ client, or model key: scoped evidence, exact `late_fee_cents: 5500 -> 0`
106
+ proposal, no pre-approval mutation, guarded commit, duplicate-free retry,
107
+ changed-intent collision refusal, stale conflict, receipt, and replay.
108
+ - Deployments can explicitly select application-level shared-credential scope,
109
+ PostgreSQL RLS defense in depth, or a tenant-bound credential resolver.
110
+ Diagnostics report the active assurance and remaining trust boundary;
111
+ hardened modes fail closed when prerequisites are missing.
112
+ - Strict Shadow Mode now has durable studies, bounded case imports,
113
+ authoritative human outcomes, deterministic comparison/readiness reports,
114
+ and effect-level regression fixtures. No study or evaluation path grants
115
+ authority or writes source data.
116
+ - Proposal tools advertise a standard display-only MCP App where the host
117
+ supports it. The app and standalone local UI share one reviewer-facing view;
118
+ approval/apply authority and privileged tokens remain outside MCP.
119
+ - `audit` can generate disabled canonical replacement candidates, while
120
+ Prisma, Drizzle, and OpenAPI generators create bounded review-only candidate
121
+ contracts without executing adopter source.
122
+ - The `support-billing-agent` reference now provides a live disposable
123
+ PostgreSQL/RLS proof for tenant/principal scope, kept-out fields, proposal,
124
+ approval/apply, receipt/retry, stale conflict, replay, strict shadow, and
125
+ effect regression.
126
+ - The bundled app-owned handler helper now uses a pre-provisioned receipt table
127
+ without requiring schema `CREATE`; DDL is attempted only when the table is
128
+ absent. The source-workspace and packed billing-handler examples both verify
129
+ transactional apply and idempotent retry.
130
+ - The public README leads with `try --prove`, keeps MCP database-risk audit
131
+ immediately second, and distinguishes application scope, PostgreSQL RLS, and
132
+ tenant-bound isolation without overstating any of them.
133
+
134
+ Published package version: `@synapsor/runner@1.5.0`. Spec, DSL, and Cloud CLI
135
+ packages were unchanged.
136
+
137
+ ## 1.4.123 (2026-07-17)
14
138
 
15
139
  ### Advisory capability-surface fitness lint
16
140
 
@@ -25,10 +149,10 @@ for the Synapsor Cloud CLI.
25
149
  CI policy gate with `--strict` or `--fail-on warning`; canonical validity and
26
150
  runtime enforcement are unchanged.
27
151
 
28
- Prepared package version: `@synapsor/runner@1.4.123`. Spec, DSL, and Cloud CLI
152
+ Published package version: `@synapsor/runner@1.4.123`. Spec, DSL, and Cloud CLI
29
153
  packages are unchanged.
30
154
 
31
- ## 1.4.122 (2026-07-16)
155
+ ## 1.4.122 (2026-07-17)
32
156
 
33
157
  ### Trusted principal scope and Cloud-linked authority
34
158
 
@@ -54,11 +178,11 @@ packages are unchanged.
54
178
  projects, scoped credentials, Runner connections, proposal decisions, and
55
179
  audit records. Runner keeps the `synapsor-runner` binary and local boundary.
56
180
 
57
- Prepared package versions: `@synapsor/spec@1.4.2`,
181
+ Published package versions: `@synapsor/spec@1.4.2`,
58
182
  `@synapsor/dsl@1.4.3`, `@synapsor/runner@1.4.122`, and
59
183
  `@synapsor/cli@0.1.0-beta.1`.
60
184
 
61
- ## 1.4.121 (prepared, not published)
185
+ ## 1.4.121 (2026-07-15)
62
186
 
63
187
  ### Contract trust surface and bounded-set parser correctness
64
188
 
@@ -90,10 +214,10 @@ Prepared package versions: `@synapsor/spec@1.4.2`,
90
214
  - C++/Cloud validators and exporters preserve the new additive enum/aggregate
91
215
  fields for canonical round-trip compatibility.
92
216
 
93
- Prepared package versions: `@synapsor/spec@1.4.1`,
217
+ Published package versions: `@synapsor/spec@1.4.1`,
94
218
  `@synapsor/dsl@1.4.2`, and `@synapsor/runner@1.4.121`.
95
219
 
96
- ## 1.4.12 (prepared, not published)
220
+ ## 1.4.12 (2026-07-14)
97
221
 
98
222
  ### Runtime-store smoke-call consistency
99
223
 
@@ -108,10 +232,10 @@ Prepared package versions: `@synapsor/spec@1.4.1`,
108
232
  - Local SQLite and mirror modes retain their existing behavior; no source row
109
233
  changes before the normal external approval/apply path.
110
234
 
111
- Prepared package version: `@synapsor/runner@1.4.12`.
235
+ Published package version: `@synapsor/runner@1.4.12`.
112
236
  `@synapsor/dsl` remains `1.4.1`; `@synapsor/spec` remains `1.4.0`.
113
237
 
114
- ## 1.4.1 (prepared, not published)
238
+ ## 1.4.1 (2026-07-14)
115
239
 
116
240
  ### Bounded-set digest compatibility patch
117
241
 
@@ -131,10 +255,10 @@ Prepared package version: `@synapsor/runner@1.4.12`.
131
255
  authority, hand-built semantic tools, structural enforcement, build-vs-adopt
132
256
  fit, and regulated-data boundaries.
133
257
 
134
- Prepared package versions: `@synapsor/dsl@1.4.1` and
258
+ Published package versions: `@synapsor/dsl@1.4.1` and
135
259
  `@synapsor/runner@1.4.1`. `@synapsor/spec` remains `1.4.0`.
136
260
 
137
- ## 1.4.0 (prepared, not published)
261
+ ## 1.4.0 (2026-07-14)
138
262
 
139
263
  ### Reviewed Reversible Change Sets
140
264
 
@@ -149,7 +273,7 @@ Prepared package versions: `@synapsor/dsl@1.4.1` and
149
273
  - Keeps hard DELETE restoration, app-owned handlers, payments, messages, and
150
274
  other external effects outside Runner's automatic compensation claim.
151
275
 
152
- Prepared package versions: `@synapsor/spec@1.4.0`,
276
+ Published package versions: `@synapsor/spec@1.4.0`,
153
277
  `@synapsor/dsl@1.4.0`, and `@synapsor/runner@1.4.0`.
154
278
 
155
279
  ## 1.3.0 (prepared, not published)
@@ -254,7 +378,7 @@ Released package versions: `@synapsor/spec@1.1.0`,
254
378
  - Declares the first semver contract for the documented CLI, schema, contract,
255
379
  MCP result, writeback, approval, metrics, and replay surfaces.
256
380
 
257
- Prepared package versions: `@synapsor/spec@1.0.0`,
381
+ Released package versions: `@synapsor/spec@1.0.0`,
258
382
  `@synapsor/dsl@1.0.0`, and `@synapsor/runner@1.0.0`.
259
383
 
260
384
  ## 0.1.16
@@ -706,7 +830,7 @@ not change and must not be republished for this release.
706
830
  CDC, managed runner fleets, compliance exports, production SLA, or C++ DBMS
707
831
  internals.
708
832
  - The local store is single-node SQLite for local/dev/staging usage.
709
- - Node >= 22.5.0 is required because the local ledger uses Node's
833
+ - Node >= 22.13.0 is required because the local ledger uses Node's unflagged
710
834
  `node:sqlite` runtime. Use a supported Node runtime or the Docker-backed
711
835
  source demo path.
712
836