@nullsquare/agent-authority 0.4.4 → 0.4.6

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/README.md CHANGED
@@ -6,64 +6,29 @@
6
6
 
7
7
  ### Give your agent a task, not your account.
8
8
 
9
- **Agent Authority turns a human-approved task into temporary execution authority, then keeps that authority bounded as the agent discovers resources, crosses tools, and performs side effects.**
9
+ **Agent Authority is a small execution layer that lets an agent use existing account permissions only for the task the user actually gave it.**
10
10
 
11
- [Task Leases](docs/task-leases.md) · [Executable evidence](docs/evidence.md) · [Extractor conformance](docs/authority-extractor-conformance.md) · [Google proof](docs/live-google-validation.md) · [Integration contract](docs/integration-contract.md) · [CLI](docs/cli.md) · [Architecture](docs/architecture.md) · [Roadmap](ROADMAP.md) · [Contributing](CONTRIBUTING.md)
11
+ [Task-first API](#task-first-api) · [Product proof gate](docs/product-proof.md) · [Task Leases](docs/task-leases.md) · [Durability](docs/durable-task-leases.md) · [Evidence](docs/evidence.md) · [Transport invariance](docs/transport-invariance.md) · [Roadmap](ROADMAP.md)
12
12
 
13
- > **Status: public pre-alpha / v0.4.3 Developer Preview.** Published on npm as `@nullsquare/agent-authority`. The repository has a working policy runtime, protocol-neutral guard, Task Lease prototype, execution-bound derived facts, reviewed Google and GitHub authority extractors, two-provider conformance tests, approvals, revocation, idempotency, credential isolation, MCP v2 gateway, live GitHub proofs, CI and CodeQL. It is not production-ready yet.
13
+ > **Status: public pre-alpha / v0.4.5 Developer Preview on npm.** The `main` branch may contain unreleased work for the next preview. Agent Authority is not production-ready yet.
14
14
 
15
15
  </div>
16
16
 
17
- ## Install
18
-
19
- Requires Node.js 20+.
20
-
21
- ```bash
22
- npm install @nullsquare/agent-authority
23
- ```
24
-
25
- ## The problem
26
-
27
- AI agents increasingly receive broad provider permissions so they can complete narrow human tasks.
17
+ ## Why this exists
28
18
 
29
- A user says:
19
+ A user gives an agent a narrow task:
30
20
 
31
- > **Handle the demo request in this email thread.**
21
+ > **Handle this customer email.**
32
22
 
33
- The agent may need to:
34
-
35
- ```text
36
- Gmail -> read one thread
37
- |
38
- v
39
- discover sender
40
- |
41
- v
42
- Calendar -> create one meeting with that sender
43
- |
44
- v
45
- Gmail -> reply in the originating thread
46
- ```
23
+ But the connected account may give the application broad standing permission to read every email, create meetings with anyone, update any CRM record, or send mail to anyone.
47
24
 
48
- The underlying OAuth connections may permit reading every email, creating meetings with anyone, or sending mail to anyone.
49
-
50
- Traditional authorization answers:
25
+ OAuth and IAM answer:
51
26
 
52
27
  > Can this application use Calendar?
53
28
 
54
- Agent Authority asks a narrower question immediately before the side effect:
55
-
56
- > **Is this exact effect justified by the task the human authorized?**
57
-
58
- ## Task-bounded autonomy
29
+ Agent Authority asks immediately before the effect:
59
30
 
60
- Agent Authority is trying to make this trade-off unnecessary:
61
-
62
- ```text
63
- broad standing permissions
64
- OR
65
- approve every tool call
66
- ```
31
+ > **Is this exact Calendar action justified by the task the user authorized?**
67
32
 
68
33
  The target is:
69
34
 
@@ -73,344 +38,335 @@ one meaningful task approval
73
38
  v
74
39
  temporary bounded authority
75
40
  |
76
- +--> safe task actions proceed
77
- +--> unrelated resources are blocked
78
- +--> real authority expansion requires step-up
41
+ +--> useful task actions proceed normally
42
+ +--> authority may follow resources discovered through authorized work
43
+ +--> unrelated resources require step-up
79
44
  |
80
45
  v
81
- task completes -> authority disappears
46
+ task completes -> task authority disappears
82
47
  ```
83
48
 
84
49
  The provider credential may continue to exist. The **task authority does not**.
85
50
 
86
- ## The key idea: authority can follow trusted task data
51
+ ## Install
87
52
 
88
- Many resources do not exist in the original prompt. The agent discovers them while working.
53
+ Requires Node.js 20+.
89
54
 
90
- Agent Authority models this with a **Task Lease**:
55
+ ```bash
56
+ npm install @nullsquare/agent-authority
57
+ ```
58
+
59
+ ## Task-first API
60
+
61
+ The preferred developer surface is intentionally small:
91
62
 
92
63
  ```text
93
- Human-approved task
94
- |
95
- v
96
- authority root
97
- Gmail thread #91
98
- |
99
- authorized read
100
- |
101
- +--> ALLOW receipt
102
- +--> exact output hash evidence
103
- |
104
- v
105
- reviewed adapter extractor
106
- |
107
- v
108
- derived fact
109
- customer@example.com
110
- |
111
- v
112
- exact binding
113
- Calendar attendee must equal that sender
64
+ Task -> Effect -> Authority
114
65
  ```
115
66
 
116
- A request for `customer@example.com` can proceed.
67
+ ```js
68
+ import { createTask } from '@nullsquare/agent-authority/task';
69
+
70
+ const task = createTask({
71
+ principal: 'user:me',
72
+ agent: 'agent:assistant',
73
+ request: 'Find issue #42 and leave one comment only on that issue',
74
+
75
+ permissions: {
76
+ github: {
77
+ allow: ['issue.list', 'issue.comment'],
78
+ deny: ['issue.close', 'repo.delete'],
79
+ constraints: { repository: ['acme/app'] }
80
+ }
81
+ },
117
82
 
118
- A request for `other@example.com` does not silently inherit the same authority. It becomes an **authority delta** and requires step-up.
83
+ authority: {
84
+ repository: {
85
+ kind: 'github.repository',
86
+ value: 'acme/app'
87
+ }
88
+ },
119
89
 
120
- This is **derived authority**: authority follows a resource discovered through authorized execution, but never broadens into a standing wildcard permission.
90
+ bindings: [
91
+ {
92
+ service: 'github',
93
+ action: 'issue.list',
94
+ field: 'repository',
95
+ authority: 'repository'
96
+ }
97
+ ]
98
+ });
121
99
 
122
- See [Task Leases and Derived Authority](docs/task-leases.md).
100
+ const discovery = await task.run({
101
+ service: 'github',
102
+ action: 'issue.list',
103
+ context: { repository: 'acme/app' }
104
+ }, () => github.listIssues());
105
+
106
+ const issue = task.authorityFrom(discovery, {
107
+ name: 'issue',
108
+ kind: 'github.issue.number',
109
+ from: 'repository',
110
+ extractor: selectedIssueExtractor
111
+ });
123
112
 
124
- ## Core invariant
113
+ task.bind({
114
+ service: 'github',
115
+ action: 'issue.comment',
116
+ field: 'issue_number',
117
+ authority: 'issue'
118
+ });
125
119
 
126
- ```text
127
- Task Lease authority <= Mission authority
120
+ await task.run({
121
+ service: 'github',
122
+ action: 'issue.comment',
123
+ context: {
124
+ repository: 'acme/app',
125
+ issue_number: issue.value,
126
+ body: 'Handled.'
127
+ }
128
+ }, () => github.comment(issue.value, 'Handled.'));
128
129
  ```
129
130
 
130
- The mission remains the ceiling. A Task Lease may narrow an action to resources discovered during the task, but it cannot grant an action that the mission already denies or never allowed.
131
+ If the agent changes `issue_number` to an unrelated issue, the callback does not run. Agent Authority returns an authority-delta step-up that can be explained to a human:
131
132
 
132
- More generally:
133
+ ```js
134
+ try {
135
+ await task.run(unrelatedRequest, effect);
136
+ } catch (error) {
137
+ console.log(task.explain(error).summary);
138
+ }
139
+ ```
133
140
 
134
- > **Authority may stay the same or shrink as it moves through agents, tools and transports. It must never silently grow.**
141
+ Example output:
135
142
 
136
- ## Run the derived-authority demo
143
+ ```text
144
+ The task established authority for 42 but this action requested 7.
145
+ ```
146
+
147
+ The task-first API is a facade over the existing Mission, Task Lease, execution-evidence and guard primitives. It does not weaken or replace them.
137
148
 
138
- Requirements: Node.js 20+.
149
+ ## Run the product demo
150
+
151
+ From a checkout:
139
152
 
140
153
  ```bash
141
- git clone https://github.com/Null-Square/agent-authority.git
142
- cd agent-authority
143
154
  npm install
144
- npm test
145
- npm run demo:task-lease
155
+ npm run demo:task
146
156
  ```
147
157
 
148
- The demo performs this flow without provider credentials:
158
+ The self-contained GitHub-shaped demo performs:
149
159
 
150
160
  ```text
151
- 1. ALLOW read of one task-authorized Gmail thread
152
- 2. derive sender email from that same Task Lease receipt
153
- 3. ALLOW Calendar event for that sender
154
- 4. REQUIRE_APPROVAL for a different attendee
155
- 5. complete task
156
- 6. DENY subsequent actions
161
+ 1. authorized issue discovery
162
+ 2. exact guarded result becomes downstream authority
163
+ 3. comment on the discovered issue succeeds
164
+ 4. comment on an unrelated issue requires step-up
165
+ 5. blocked attempt executes zero provider callbacks
157
166
  ```
158
167
 
159
- The side-effect callbacks for blocked actions never run.
168
+ The callback bodies are intentionally replaceable with the SDK/provider calls an application already uses.
160
169
 
161
- The repository also includes a real Gmail → Calendar validation path and a reusable Google provider adapter. The strict path binds the derived sender to the exact guarded output before it becomes authority. See [Live Gmail → Calendar validation](docs/live-google-validation.md) and [Executable Evidence](docs/evidence.md).
170
+ ## Utility benchmark
162
171
 
163
- v0.4.3 applies the **same primitive to GitHub**: a root-bound repository + fixture marker are used by the reviewed GitHub adapter to select one issue from a real `issue.list` response; `deriveFromEvidence()` establishes that exact issue number as downstream authority; one real comment mutation succeeds; unrelated and post-completion issue mutations never reach the provider. Google and GitHub are now exercised by the same [authority extractor conformance contract](docs/authority-extractor-conformance.md).
172
+ Security is necessary but not sufficient. Agent Authority also tracks whether normal agent work still succeeds without approval fatigue.
164
173
 
165
- ## Minimal developer API
174
+ ```bash
175
+ npm run benchmark:task
176
+ ```
166
177
 
167
- ```js
168
- import { AuthorityRuntime } from '@nullsquare/agent-authority';
169
- import { createTaskLease } from '@nullsquare/agent-authority/task-lease';
170
- import { createTaskLeaseGuard } from '@nullsquare/agent-authority/guard';
171
- import { gmailThreadSenderAuthorityExtractor } from '@nullsquare/agent-authority/providers/google';
172
-
173
- const lease = createTaskLease({
174
- mission,
175
- request: 'Handle the demo request in thread:demo-91',
176
- roots: [
177
- { fact_id: 'fact:thread', kind: 'gmail.thread', value: 'thread:demo-91' }
178
- ],
179
- bindings: [
180
- {
181
- service: 'calendar',
182
- action: 'event.create',
183
- context_field: 'attendee_email',
184
- fact_id: 'fact:sender-email'
185
- }
186
- ]
187
- });
178
+ The first deterministic fixture measures:
188
179
 
189
- const guard = createTaskLeaseGuard({
190
- lease,
191
- runtime: new AuthorityRuntime()
192
- });
180
+ - normal task completion rate;
181
+ - false approval rate;
182
+ - true authority-delta step-up rate;
183
+ - unauthorized effect rate;
184
+ - provider effects required for completed tasks.
193
185
 
194
- const read = await guard.run({
195
- service: 'gmail',
196
- action: 'thread.read',
197
- context: { thread_id: 'thread:demo-91' }
198
- }, () => gmail.readThread('thread:demo-91'));
199
-
200
- const senderFact = lease.deriveFromEvidence({
201
- fact_id: 'fact:sender-email',
202
- kind: 'email.address',
203
- from: ['fact:thread'],
204
- receipt: read.receipt,
205
- evidence: read.evidence,
206
- output: read.output,
207
- extractor: gmailThreadSenderAuthorityExtractor
208
- });
186
+ Its current regression target is:
209
187
 
210
- await guard.run({
211
- service: 'calendar',
212
- action: 'event.create',
213
- context: { attendee_email: senderFact.value }
214
- }, () => calendar.createEvent({ attendee: senderFact.value }));
188
+ ```text
189
+ normal task completion rate = 100%
190
+ false approval rate = 0%
191
+ true authority-delta step-up rate = 100%
192
+ unauthorized effect rate = 0%
215
193
  ```
216
194
 
217
- `deriveFromEvidence()` does not accept the authority value. The reviewed extractor selects a normalized output field, and Task Lease resolves that value only after verifying that the output still matches the exact allowed execution evidence.
218
-
219
- The older `derive()` API remains available as the explicitly **host-trusted compatibility path**.
195
+ This is a deterministic product regression fixture, **not a real-world benchmark**. Real provider and harness workloads should replace or supplement it as adoption grows.
220
196
 
221
- The host keeps its existing SDK, connector and authentication. Agent Authority controls whether the effect may happen.
197
+ See [Product proof gate](docs/product-proof.md).
222
198
 
223
- ## Three integration modes, one authority model
199
+ ## The differentiated mechanism
224
200
 
225
- Agent Authority is deliberately **not tied to MCP, OAuth, or one agent framework**.
201
+ Many task resources are unknown when the user gives the instruction. They are discovered during execution.
226
202
 
227
- ### 1. In-process guard
203
+ Agent Authority lets authority follow those resources only when the value comes from already-authorized work:
228
204
 
229
205
  ```text
230
- agent code -> guard.run() -> existing SDK / API
206
+ human-approved task
207
+ |
208
+ v
209
+ authority root
210
+ repository = acme/app
211
+ |
212
+ authorized issue discovery
213
+ |
214
+ +--> ALLOW receipt
215
+ +--> exact output evidence
216
+ |
217
+ reviewed extractor
218
+ |
219
+ v
220
+ derived authority
221
+ issue = 42
222
+ |
223
+ v
224
+ later effect may bind issue_number == 42
231
225
  ```
232
226
 
233
- Best when the application already owns the provider connection. This is the primary v0.4 adoption path.
227
+ A request for issue `42` can proceed.
228
+
229
+ A request for issue `7` does not inherit the same authority simply because the underlying GitHub credential can access it.
234
230
 
235
- ### 2. MCP gateway
231
+ That is the core contribution we are testing:
232
+
233
+ > **Authority may follow the task's proven execution path without becoming ambient account authority.**
234
+
235
+ ## Core invariant
236
236
 
237
237
  ```text
238
- MCP host -> Agent Authority -> existing MCP server
238
+ Task Lease authority <= Mission authority
239
239
  ```
240
240
 
241
- Best when the harness already speaks MCP. MCP is an integration transport, not the product identity.
241
+ The Mission remains the ceiling. Task authority may stay the same or shrink as work crosses tools, transports and durable state. It must never silently grow.
242
+
243
+ ## Existing stack, not a replacement stack
242
244
 
243
- ### 3. Brokered execution
245
+ Agent Authority is not trying to replace OAuth, IAM, MCP, gateways or agent frameworks.
244
246
 
245
247
  ```text
246
- agent -> Agent Authority -> isolated credential -> provider
248
+ agent reasoning
249
+ |
250
+ v
251
+ Agent Authority
252
+ |
253
+ v
254
+ existing SDK / MCP / gateway / OAuth / provider
247
255
  ```
248
256
 
249
- Best when the agent should not receive the provider credential at all.
250
-
251
- The long-term validation target is the **same Task Lease and authority lineage across all three paths**.
252
-
253
- ## What is implemented
254
-
255
- ### Task authority
256
-
257
- - mission validation and deterministic `ALLOW / DENY / REQUIRE_APPROVAL`
258
- - explicit deny precedence
259
- - resource/context constraints
260
- - expiry and cumulative budgets
261
- - delegation attenuation
262
- - durable mission revocation
263
- - Task Lease prototype
264
- - explicit authority roots
265
- - same-lease provenance-bound derived facts
266
- - execution evidence binding an allowed receipt, request and exact output hash
267
- - strict `deriveFromEvidence()` path where the caller cannot provide the authority value
268
- - reviewed Gmail sender authority extractor bound to `gmail:thread.read`
269
- - reviewed GitHub selected-issue-number extractor bound to marker-scoped `github:issue.list`
270
- - shared Google/GitHub authority-extractor conformance suite
271
- - legacy host-trusted `derive()` compatibility path
272
- - required parent lineage and extraction selector
273
- - exact context-field bindings
274
- - authority-delta step-up signal
275
- - immediate task completion/expiry enforcement
276
- - Task Lease IDs/hashes in decision receipts
277
-
278
- ### Enforcement
279
-
280
- - protocol-neutral `guard.run()` wrapper
281
- - blocked side effects never invoke their callback
282
- - successful guarded effects return separate execution evidence
283
- - one-time human approvals bound to exact request
284
- - mutation idempotency
285
- - conservative uncertain-state handling
286
- - signed harness action grants
287
- - MCP v2 read-only gateway/proxy
288
-
289
- ### Credentials and runtime
290
-
291
- - persistent connection metadata
292
- - AES-256-GCM local encrypted secret store
293
- - safe reconnect cleanup
294
- - GitHub brokered execution without returning the token to the agent
295
- - GitHub REST mappings for repository access plus evidence-derived `issue.list` / `issue.comment`
296
- - Google REST provider mappings for Gmail thread reads and Calendar event mutations
297
- - short-lived signed local agent-instance tokens
298
- - local CLI/daemon
299
-
300
- ### Engineering quality
301
-
302
- - adversarial authorization tests
303
- - execution-evidence substitution, tampering, replay, cross-lease and selector tests
304
- - the same provider-derived-authority conformance attacks against Google and GitHub
305
- - Node 20 and Node 22 CI
306
- - coverage run
307
- - package checks
308
- - clean-consumer npm registry verification
309
- - live GitHub read and evidence-derived mutation proofs
310
- - CodeQL
311
-
312
- ## What is different from OAuth, IAM and MCP authorization?
313
-
314
- Agent Authority is **not trying to replace them**.
315
-
316
- OAuth/IAM answer who or what may access a provider and with which standing scopes. MCP authorization protects an MCP transport. Agent Authority operates at a different boundary:
257
+ Three execution modes already share the same Task Lease semantics:
317
258
 
318
259
  ```text
319
- human task
320
- |
321
- v
322
- temporary task authority
323
- |
324
- v
325
- exact agent-originated effect
326
- |
327
- +--> existing OAuth / IAM / MCP / SDK / CLI
260
+ in-process guard
261
+ MCP gateway
262
+ brokered provider execution
328
263
  ```
329
264
 
330
- The project should consume existing identity/authentication mechanisms and emerging standards rather than invent another login or token format.
331
-
332
- The contribution we are testing is operational: **make task-scoped, provenance-aware least privilege usable inside ordinary agent stacks.**
265
+ A real Vercel AI SDK `ToolLoopAgent` integration also exercises the protected-tool boundary. See [Transport invariance](docs/transport-invariance.md).
333
266
 
334
- ## Example use cases
267
+ ## Durability
335
268
 
336
- ### Support / sales
269
+ For local workflows that must survive process restarts, pass a `JsonFileTaskLeaseStore` to the same task-first API:
337
270
 
338
- > Handle this customer request.
271
+ ```js
272
+ import { JsonFileTaskLeaseStore } from '@nullsquare/agent-authority/storage';
273
+ import { createTask } from '@nullsquare/agent-authority/task';
339
274
 
340
- Bind later actions to the customer, thread, ticket or meeting discovered from the authorized task path.
275
+ const store = new JsonFileTaskLeaseStore({
276
+ dir: config.paths.task_leases,
277
+ keyPath: config.paths.master_key
278
+ });
341
279
 
342
- ### Finance
280
+ const task = createTask({
281
+ ...taskDefinition,
282
+ store
283
+ });
284
+ ```
343
285
 
344
- > Refund the customer from this ticket, but never more than the original charge.
286
+ The task facade then uses the durable Task Lease session internally. Normal task calls do not change.
345
287
 
346
- Discover customer -> order -> charge through authorized reads, then bind the refund to those concrete facts and amount ceiling.
288
+ Durable state currently provides authenticated local recovery, exact Mission binding, atomic whole-state replacement, per-lease local locking, stale-writer compare-and-swap protection, durable completion/expiry, and refresh before authority evaluation.
347
289
 
348
- ### Coding / operations
290
+ See [Durable Task Leases](docs/durable-task-leases.md).
349
291
 
350
- > Fix issue #42, open a PR, do not merge or deploy production.
292
+ ## What is already proven
351
293
 
352
- Keep repo/issue/branch authority bounded as subagents and tools change.
294
+ - deterministic allow / deny / require-approval decisions;
295
+ - explicit deny precedence and Mission ceiling;
296
+ - execution evidence bound to exact guarded output;
297
+ - strict evidence-derived authority where callers do not provide the derived value;
298
+ - reviewed Google Gmail-sender and GitHub selected-issue extractors;
299
+ - shared two-provider adversarial conformance tests;
300
+ - live GitHub read and evidence-derived comment mutation proofs;
301
+ - connected Gmail -> Calendar smoke proof;
302
+ - direct SDK / MCP / broker transport invariance;
303
+ - real Vercel AI SDK protected-tool execution proof;
304
+ - authenticated durable Task Lease recovery;
305
+ - stale-writer/CAS and mission-alias protection;
306
+ - automatic durable Task Lease sessions;
307
+ - Node 20/22 CI, coverage, packed-consumer validation and CodeQL;
308
+ - independent npm registry consumer verification.
353
309
 
354
- ### Personal / company operating agents
310
+ The lower-level evidence is documented under `docs/` and remains available for security review.
355
311
 
356
- > Handle this email.
312
+ ## Product direction
357
313
 
358
- Allow a natural workflow across mail, calendar, CRM and internal systems without turning every connected account into ambient agent authority.
314
+ The next product risk is **not lack of another security subsystem**. It is adoption and useful autonomy.
359
315
 
360
- ## Security principles
316
+ Before deeper distributed/crypto infrastructure becomes a priority, Agent Authority should prove:
361
317
 
362
- 1. **Task before credential.** A provider token is not task authority.
363
- 2. **Mission is the ceiling.** Task Leases cannot override explicit denies.
364
- 3. **No side effect before authorization.** Denied and step-up actions never execute.
365
- 4. **Authority lineage matters.** Provider-derived authority should bind the exact allowed receipt and guarded output to a reviewed extractor; legacy host-trusted derivation remains identifiable in provenance.
366
- 5. **No silent resource expansion.** A different concrete resource becomes an authority delta.
367
- 6. **Task authority ends with the task.** Completion and expiry are independent from provider credential lifetime.
368
- 7. **Authority may shrink, never silently grow.** Delegation and transport changes must preserve non-amplification.
369
- 8. **The evaluated request must be the executed request.** Request hashes, grants and idempotency protect the boundary.
370
- 9. **Credentials stay out of model context where Agent Authority owns them.**
371
- 10. **Security gaps are documented, not marketed away.**
318
+ 1. a new developer can get a meaningful workflow running in under 10 minutes;
319
+ 2. coding, support/communications and operations/finance workflows all fit the task-first model;
320
+ 3. normal task completion stays high without approval spam;
321
+ 4. unrelated-resource effects still execute zero provider callbacks;
322
+ 5. at least one external developer adopts the package without project-author assistance.
372
323
 
373
- See [SECURITY.md](SECURITY.md).
324
+ See [Product proof gate](docs/product-proof.md) and [Roadmap](ROADMAP.md).
374
325
 
375
326
  ## Current limitations
376
327
 
377
328
  This is still a validation implementation.
378
329
 
379
- - Task Lease state is currently process-local.
380
- - `deriveFromEvidence()` proves consistency with the exact output returned through the trusted Agent Authority guard, but the output is not cryptographically attested by Gmail, GitHub, or another remote provider.
381
- - The legacy `derive()` API remains host-trusted for compatibility; audit provenance distinguishes it from `execution-evidence-v1` derivation.
382
- - Source-data changes do not yet automatically invalidate already-derived authority facts.
383
- - Bindings currently target top-level request context fields.
384
- - Approved authority deltas are surfaced but not automatically applied back into a live lease.
385
- - GitHub token-stdin is a developer bridge, not final browser OAuth onboarding.
386
- - The encrypted local vault is not an OS keychain/KMS/HSM backend.
387
- - Remote authenticated deployment and a production approval UX are not complete.
330
+ - Durable persistence is a trusted-local-host reference backend, not distributed consensus or hostile-host containment.
331
+ - Another worker can still change durable state after an `ALLOW` decision and before asynchronous remote provider I/O begins. Remote effect + receipt + Task Lease state are not one distributed transaction.
332
+ - A crashed local worker may leave a per-lease lock requiring explicit recovery.
333
+ - Transport/harness proofs do not contain a malicious host that deliberately exposes a separate unguarded tool, shell, network path or credential.
334
+ - Provider outputs are evidence-bound inside the trusted Agent Authority runtime but are not provider-signed remote attestations.
335
+ - Source-data changes do not yet automatically invalidate already-derived authority.
336
+ - Approved authority deltas are surfaced but not automatically applied into a live durable task.
337
+ - GitHub token-stdin and the local encrypted vault are developer bridges, not final production OAuth/KMS UX.
338
+ - Remote authenticated deployment and production approval UX remain incomplete.
339
+
340
+ These are real limitations. They are not reasons to build every possible infrastructure layer before product adoption is proven.
388
341
 
389
- These are follow-on validation problems. We are intentionally not solving them with a giant policy language or another agent framework.
342
+ ## What we are deliberately not prioritizing now
390
343
 
391
- ## What we are deliberately not building
344
+ Unless a real workflow proves otherwise:
392
345
 
393
- - another agent harness
394
- - another OAuth or identity protocol
395
- - an MCP replacement
396
- - a connector marketplace
397
- - a giant proprietary policy DSL
398
- - an enterprise dashboard before the enforcement primitive proves adoption
346
+ - another agent harness;
347
+ - a new OAuth/identity/token protocol;
348
+ - an MCP replacement/control plane;
349
+ - a connector marketplace;
350
+ - a proprietary universal policy DSL;
351
+ - distributed Task Lease databases;
352
+ - provider-attestation protocol design;
353
+ - A2A implementation;
354
+ - dashboard-first enterprise product work.
399
355
 
400
356
  ## Contributing
401
357
 
402
- The best contribution is not another abstract feature. It is a real integration or adversarial case that answers:
358
+ The most valuable contribution answers:
403
359
 
404
- > **Can this agent complete the intended task while being technically unable to use the same underlying account authority for an unrelated effect?**
360
+ > **Can this agent complete the intended task while being technically unable to use the same standing account authority for an unrelated effect?**
405
361
 
406
- We especially want:
362
+ Especially useful:
407
363
 
408
- - framework integrations around `guard.run()`;
409
- - trustworthy operation -> resource-context mappings;
410
- - Task Lease examples from real workflows;
364
+ - real task-first workflows;
365
+ - trustworthy operation -> resource mappings;
366
+ - utility-regression cases that cause unnecessary approvals;
411
367
  - derived-authority / provenance attacks;
412
- - MCP and non-MCP conformance cases;
413
- - secure persistence and extraction-verification designs that stay simple.
368
+ - transport or multi-worker attacks;
369
+ - feedback from developers trying to integrate the package for the first time.
414
370
 
415
371
  See [CONTRIBUTING.md](CONTRIBUTING.md).
416
372