@ssheleg/agent-stack 0.13.5 → 0.14.1
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 +18 -0
- package/README.md +1 -0
- package/package.json +2 -2
- package/plugins/agent-stack/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-stack/skills/agent-harness/references/audit.md +1 -0
- package/plugins/agent-stack/skills/agent-orchestrator/SKILL.md +5 -0
- package/plugins/agent-stack/skills/agent-orchestrator/references/patterns.md +35 -0
- package/plugins/agent-stack/skills/agent-orchestrator/references/provider-lifecycle.md +151 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.14.1 — the workforce axis: provider lifecycle and workspace-scale memory
|
|
4
|
+
|
|
5
|
+
(v0.14.0 was burned during release engineering: its tag landed on a commit a
|
|
6
|
+
protected branch could never reach, and the tag rules forbid deletion — so the
|
|
7
|
+
content ships as v0.14.1 and the dead tag stays as its own cautionary receipt.)
|
|
8
|
+
|
|
9
|
+
The orchestrator gains `references/provider-lifecycle.md` — where providers come
|
|
10
|
+
from and how one earns trust: produced-once/bound-many, the production pipeline
|
|
11
|
+
with its named-consumer gate, knowledge packs whose traps become planted
|
|
12
|
+
fixtures, the canary binding with recorded promotion, the two-extension-mechanisms
|
|
13
|
+
law, workspace lifecycle with the dependency projection, and fleet budgets with
|
|
14
|
+
the run scheduler. `patterns.md` gains the workspace-scale memory rules — the
|
|
15
|
+
journal spine, rebuildable projections with embedding-model versions, isolation
|
|
16
|
+
at the API, promotion with decay, memory-through-the-bundle. The harness audit's
|
|
17
|
+
tools track now asks what the agent was actually equipped with: required,
|
|
18
|
+
installed, loaded — three truths with two receipts. Distilled from the Passion
|
|
19
|
+
Code fabric design review of 2026-08-27.
|
|
20
|
+
|
|
3
21
|
## v0.13.5 — the shared seam is explicit
|
|
4
22
|
|
|
5
23
|
Both shared validators now state `diverges: none`, completing the umbrella
|
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/@ssheleg/agent-stack)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
[](https://skills.sshlg.me/skills/agent-stack/)
|
|
7
|
+
[](https://skills.sh/ssheleg/agent-stack)
|
|
7
8
|
|
|
8
9
|
**Build agent loops, harnesses, evals and protocol boundaries that stay inspectable under production failure.**
|
|
9
10
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ssheleg/agent-stack",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"test": "python3 test/validate.py && python3 test/plant_guard_test.py"
|
|
6
6
|
},
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"SECURITY.md"
|
|
21
21
|
],
|
|
22
22
|
"repository": "github:ssheleg/agent-stack",
|
|
23
|
-
"homepage": "https://
|
|
23
|
+
"homepage": "https://skills.sshlg.me/skills/agent-stack/",
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"author": {
|
|
26
26
|
"name": "ssheleg",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "agent-stack",
|
|
3
3
|
"displayName": "Agent Stack",
|
|
4
4
|
"description": "Two skills: agent-orchestrator — tool-calling loops, multi-stage pipelines with checkpoints, provider routing with fallback, four-layer memory, context engineering, plus the wallet side of reselling LLM access; and agent-evals — run/trace/thread evals, judges, and fixtures grown from production.",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.14.1",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -56,6 +56,7 @@ Walk them in order. Later tracks assume earlier ones.
|
|
|
56
56
|
- Is there a default limit on response size, or only an optional one?
|
|
57
57
|
- Do errors **name the next action**?
|
|
58
58
|
- Are destructive tools guarded by shape (`confirm: true`, absolute paths, enums) rather than by instruction?
|
|
59
|
+
- What was the agent **actually equipped with**? Three different truths — *required* by the task, *installed* on the machine, *loaded* by the session — and the receipts are the compiled bundle's lockfile and the session-init capability list. An audit that reads only the config file has checked the first truth of three.
|
|
59
60
|
|
|
60
61
|
### 3 — Control flow
|
|
61
62
|
|
|
@@ -245,6 +245,10 @@ a floor.
|
|
|
245
245
|
|
|
246
246
|
**Layer 0 — carryover state.** Goal, artifacts, verified work and restrictive
|
|
247
247
|
mode cross a compaction boundary as copied typed blocks, not prose (§12).
|
|
248
|
+
|
|
249
|
+
**Workspace scale.** Managing persistent workspaces rather than sessions shifts
|
|
250
|
+
the scopes — run, workspace, global, doctrine — and adds the journal-spine
|
|
251
|
+
rules: `references/patterns.md` → **Workspace-scale memory**.
|
|
248
252
|
## 8. Self-Learning Feedback Loops
|
|
249
253
|
|
|
250
254
|
Three cycles feed the memory layers, and they differ by what supplies the signal: a failed
|
|
@@ -381,3 +385,4 @@ there, so this table stays an index and the two cannot drift apart.
|
|
|
381
385
|
| [`references/runtime.md`](references/runtime.md) | the agent must **survive a crash, a pause, a second message or a schedule** |
|
|
382
386
|
| [`references/governance.md`](references/governance.md) | the question is **permission, not cost** — what it may do, and how you prove it |
|
|
383
387
|
| [`references/llm-proxy-billing.md`](references/llm-proxy-billing.md) | the product **resells LLM access** |
|
|
388
|
+
| [`references/provider-lifecycle.md`](references/provider-lifecycle.md) | the question is the **workforce, not the loop** — where providers come from, produced-once/bound-many, knowledge packs, canary trust, workspace lifecycle, fleet budgets |
|
|
@@ -20,6 +20,7 @@ that costs no LLM call.
|
|
|
20
20
|
- [Conflict Resolution Pattern](#conflict-resolution-pattern)
|
|
21
21
|
- [Cross-Resource Learning Transfer](#cross-resource-learning-transfer)
|
|
22
22
|
- [Suggestion Engine (No LLM Cost)](#suggestion-engine-no-llm-cost)
|
|
23
|
+
- [Workspace-scale memory — the journal spine](#workspace-scale-memory--the-journal-spine)
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
## Data Models
|
|
@@ -454,3 +455,37 @@ constant to tune and a constant with two homes is one that will disagree with it
|
|
|
454
455
|
Both moved out of `SKILL.md` on 2026-08-16. The mechanisms they describe were already
|
|
455
456
|
in this file — the validation loop, the extractors, the confidence arithmetic — so the
|
|
456
457
|
body was holding a second copy of their surface. One home; the body keeps the decision.
|
|
458
|
+
|
|
459
|
+
## Workspace-scale memory — the journal spine
|
|
460
|
+
|
|
461
|
+
The four layers in the body's §7 are session-scale: chat, working, learnings, insights.
|
|
462
|
+
When the same machinery manages **persistent workspaces** — long-lived projects that own
|
|
463
|
+
agents, schedules and history and outlive every conversation — the scopes shift, and five
|
|
464
|
+
rules keep the store honest at that scale. *Distilled 2026-08-27 from the Passion Code
|
|
465
|
+
fabric design review; the workforce half of that review is
|
|
466
|
+
`references/provider-lifecycle.md`.*
|
|
467
|
+
|
|
468
|
+
| Scope | Holds | Lives |
|
|
469
|
+
|---|---|---|
|
|
470
|
+
| run-working | scratch, intermediates, the transcript | one run; artifacts survive by content hash |
|
|
471
|
+
| workspace | decisions, lessons, report context of one project | permanent, append-only, isolated |
|
|
472
|
+
| global | facts promoted above any one workspace | permanent, with decay |
|
|
473
|
+
| doctrine | intent and standards, versioned in git | the source everything else indexes |
|
|
474
|
+
|
|
475
|
+
1. **One append-only journal is the canonical ledger.** Memory writes are events; every
|
|
476
|
+
register anyone reads is a projection of them. Corrections supersede; erasure leaves a
|
|
477
|
+
tombstone. A store built table-first cannot adopt this later — history that predates
|
|
478
|
+
the journal is unrecoverable at any price.
|
|
479
|
+
2. **Every index is a rebuildable projection**, and an embedding row carries the
|
|
480
|
+
embedding model's name and version — otherwise the first model upgrade silently mixes
|
|
481
|
+
incomparable vectors and similarity search degrades without an error.
|
|
482
|
+
3. **Isolation is enforced at the memory API**, from the authenticated caller's scope —
|
|
483
|
+
never by asking the prompt to respect a boundary. One workspace never writes
|
|
484
|
+
another's memory; transfer happens only as an explicit, revisioned artifact
|
|
485
|
+
(`provider-lifecycle.md` names the vehicle).
|
|
486
|
+
4. **Promotion to global carries provenance, confidence, contradiction links and an
|
|
487
|
+
expiry.** Memory without decay accumulates confident lies, and the global scope is
|
|
488
|
+
where they do the most damage because nothing above it contradicts them.
|
|
489
|
+
5. **Memory reaches the model only through the compiled per-task bundle.** One entry
|
|
490
|
+
point means one supply-chain gate and one lockfile that pins what the agent knew —
|
|
491
|
+
which is the difference between debugging a bad answer and re-litigating it.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Provider lifecycle — where agents come from, and how one earns trust
|
|
2
|
+
|
|
3
|
+
**Load this when** the question is the workforce rather than the loop: an agent is being
|
|
4
|
+
produced, adapted from an existing project, registered, replaced or retired, or a fleet
|
|
5
|
+
of workspaces needs governing. The loop that *runs* a provider is the body; what a call
|
|
6
|
+
costs is `llm-proxy-billing.md`; whether an action is permitted is `governance.md`. This
|
|
7
|
+
file owns the axis none of them hold: a provider's life from intake to retirement.
|
|
8
|
+
|
|
9
|
+
*Distilled 2026-08-27 from the Passion Code fabric design review (its ADR-0015 and
|
|
10
|
+
agent-production design), generalised for any estate of agent workspaces.*
|
|
11
|
+
|
|
12
|
+
## Contents
|
|
13
|
+
|
|
14
|
+
- Produced once, bound many times
|
|
15
|
+
- The production pipeline, stage by stage
|
|
16
|
+
- Knowledge packs — how expertise transfers between projects
|
|
17
|
+
- Trust is earned by watched runs: the canary binding
|
|
18
|
+
- Two extension mechanisms, and only two
|
|
19
|
+
- Workspace lifecycle, and the dependency projection under retirement
|
|
20
|
+
- Fleet governance: hierarchical budgets and the run scheduler
|
|
21
|
+
|
|
22
|
+
## Produced once, bound many times
|
|
23
|
+
|
|
24
|
+
The distinction the whole file stands on:
|
|
25
|
+
|
|
26
|
+
| | **Provider** | **Binding** |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| Is | the agent as artifact: repo, manifest, capability schemas, service or instruction pack | one workspace's versioned decision to use that provider for a capability |
|
|
29
|
+
| Created by | a production run — rare, expensive, gated | a registry write — cheap, reversible |
|
|
30
|
+
| Versioned as | provider revisions; v2 goes through the same pipeline as v1 | immutable binding revisions; a run pins one |
|
|
31
|
+
| Retired by | archiving its home project | unbinding — history and schedules survive it |
|
|
32
|
+
|
|
33
|
+
Conflate the axes and every hire becomes a project: nineteen role types across N
|
|
34
|
+
workspaces is nineteen providers and N× bindings, never 19×N projects. Rollout of a new
|
|
35
|
+
provider version is *rebinding*, never mutation of a binding a running task already
|
|
36
|
+
pinned.
|
|
37
|
+
|
|
38
|
+
## The production pipeline, stage by stage
|
|
39
|
+
|
|
40
|
+
Producing an agent is an ordinary project whose route is data — a versioned stage list,
|
|
41
|
+
not code. The stages that survived review:
|
|
42
|
+
|
|
43
|
+
| Stage | Gate that closes it |
|
|
44
|
+
|---|---|
|
|
45
|
+
| **intake** | capability named in the controlled vocabulary; **a consumer named** — the workspace or schedule that will actually call it; workflow-or-agent decided (`agent-harness`: if every step can be named now, it is a workflow behind a capability, not an autonomous agent); transport chosen by the interop rule; money- and publication-adjacent effects declared per agent |
|
|
46
|
+
| **knowledge** | sources named and distilled into a knowledge pack (below); every claim in it cites its origin |
|
|
47
|
+
| **scaffold** | manifest + capability schemas + one safe fixture validate against the pinned contract revision |
|
|
48
|
+
| **instructions** | the instruction pack is a revision, content-hashed, carrying the enumerated vocabulary — status values, capability names — generated from the schema, never retyped |
|
|
49
|
+
| **build** | the ordinary delivery pipeline of the estate, run inside the agent's own workspace |
|
|
50
|
+
| **evals** | golden fixtures pass AND planted defects are rejected, *watched* — on the two clocks `agent-evals` §6 defines: the **observable** for each requirement written at intake, before the build; the corpus grown from production, where the source project's recorded failures count as production |
|
|
51
|
+
| **admission** | shape conformance → protocol negotiation → side-effect-free semantic probes → an immutable admission record |
|
|
52
|
+
| **canary binding** | bound under mandatory checking and a budget cap; unsupervised operation is a later, recorded promotion |
|
|
53
|
+
|
|
54
|
+
The sharpest gate is the first: **no agent without a named consumer.** A role catalogue
|
|
55
|
+
is not a production queue, and the cheapest agent to operate is the one you did not
|
|
56
|
+
build because nothing would have called it.
|
|
57
|
+
|
|
58
|
+
Two entry doors, one pipeline: **build** (greenfield) and **adapt** — an existing
|
|
59
|
+
project with a stable surface gets inspected without execution, wrapped behind a
|
|
60
|
+
capability, and enters at scaffold with its own docs as the knowledge source and its own
|
|
61
|
+
recorded failures as the first fixtures.
|
|
62
|
+
|
|
63
|
+
## Knowledge packs — how expertise transfers between projects
|
|
64
|
+
|
|
65
|
+
The object that makes "reuse the knowledge, not the code" mechanical rather than
|
|
66
|
+
aspirational:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
knowledge_pack(id, revision, content_hash,
|
|
70
|
+
sources[]: what was read — repos, docs, audits, retros, with refs
|
|
71
|
+
distilled:
|
|
72
|
+
patterns[] what works here, each citing file:line
|
|
73
|
+
traps[] the source's recorded failures and dead ends
|
|
74
|
+
fixtures[] ← traps, converted into planted-defect eval cases
|
|
75
|
+
glossary[] terms the new agent must use exactly as the source does
|
|
76
|
+
)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Three rules give it teeth:
|
|
80
|
+
|
|
81
|
+
- **A trap becomes a fixture.** The new agent is not admitted until it has been watched
|
|
82
|
+
rejecting the exact defects its predecessor was burned by. Knowledge transfers as a
|
|
83
|
+
check, not as prose an instruction pack hopes the model remembers.
|
|
84
|
+
- **A pack travels as an artifact, never as a memory write.** Workspace memory is
|
|
85
|
+
isolated (see `patterns.md` → *Workspace-scale memory*); the pack is the legal vehicle
|
|
86
|
+
between workspaces — explicit, attributable, revisioned.
|
|
87
|
+
- **A pack is an injection surface.** Text composed into a prompt from many sources is
|
|
88
|
+
supply chain; a pack produced by an agent passes the same eval gate as code.
|
|
89
|
+
|
|
90
|
+
## Trust is earned by watched runs: the canary binding
|
|
91
|
+
|
|
92
|
+
Authorship is not evidence. A freshly produced provider — your own included — enters
|
|
93
|
+
under a **canary binding**: its output gates through a checker (the contract lives in
|
|
94
|
+
`graph-engineering.md` §6) and its spend is capped, regardless of who wrote it. Removing
|
|
95
|
+
the supervision is a **promotion**: a recorded decision citing eval results and run
|
|
96
|
+
history, with an author. The record matters more than the ceremony — a checker quietly
|
|
97
|
+
dropped is indistinguishable from one that never existed, and the promotion row is the
|
|
98
|
+
only thing that says which.
|
|
99
|
+
|
|
100
|
+
Store, per provider revision, the **production provenance**: source repo, the run that
|
|
101
|
+
produced it, its eval set, its admission. "Where did this agent come from" must be a
|
|
102
|
+
query, not an archaeology project.
|
|
103
|
+
|
|
104
|
+
## Two extension mechanisms, and only two
|
|
105
|
+
|
|
106
|
+
Everything that extends an agent estate is one of:
|
|
107
|
+
|
|
108
|
+
1. **a versioned registry entry** — a capability name, a skill, a pipeline, a template,
|
|
109
|
+
an event kind;
|
|
110
|
+
2. **a provider behind a profile** — an agent, a connector, a checker.
|
|
111
|
+
|
|
112
|
+
The corollaries do real work: a *connector* is a deterministic provider of `collect.*`
|
|
113
|
+
capabilities (no separate plugin system to build); a *checker* is a provider of
|
|
114
|
+
`check.*` capabilities (so custom checkers ride the same production pipeline and
|
|
115
|
+
admission as any agent, and a checker may never be served by the same binding that
|
|
116
|
+
produced the work it checks). A feature that wants a third extension mechanism is a
|
|
117
|
+
design smell before it is a backlog item.
|
|
118
|
+
|
|
119
|
+
## Workspace lifecycle, and the dependency projection under retirement
|
|
120
|
+
|
|
121
|
+
A workspace moves `proposed → active → dormant → archived`, and two transitions carry
|
|
122
|
+
rules that prevent silent damage:
|
|
123
|
+
|
|
124
|
+
- **dormant pauses its schedules.** A sleeping workspace whose routines still tick burns
|
|
125
|
+
quota and money invisibly — dormancy that does not stop the clock is a label, not a
|
|
126
|
+
state.
|
|
127
|
+
- **archived requires the dependency projection to be empty for it**: no active binding
|
|
128
|
+
in another workspace may still point at this workspace's providers. That projection —
|
|
129
|
+
who consumes whose capabilities — is cheap to maintain and impossible to reconstruct
|
|
130
|
+
during an incident; without it, retiring a workspace is a surprise delivered to its
|
|
131
|
+
dependents at call time.
|
|
132
|
+
|
|
133
|
+
## Fleet governance: hierarchical budgets and the run scheduler
|
|
134
|
+
|
|
135
|
+
Per-call spend limits do not govern a fleet. Two objects do, and both are projections
|
|
136
|
+
over the run record rather than new subsystems:
|
|
137
|
+
|
|
138
|
+
- **A budget hierarchy** — estate → workspace → goal → task — where an exhausted level
|
|
139
|
+
refuses *admission of new runs* rather than killing running ones, and approaching a
|
|
140
|
+
cap is an attention signal. The money mechanics — wallets, reservations, reconciliation
|
|
141
|
+
— are `llm-proxy-billing.md`; the multi-level attribution argument is
|
|
142
|
+
`governance.md`. What this file adds: the cap must exist at every level, because
|
|
143
|
+
sixty workspaces individually under budget is still one bill nobody approved.
|
|
144
|
+
- **A run scheduler** — a ceiling on concurrent runs per host, priority classes
|
|
145
|
+
(incident > scheduled > backfill), and per-provider concurrency tied to the external
|
|
146
|
+
quota records the collectors keep. A fleet without one discovers its capacity limit
|
|
147
|
+
as a pile of half-finished runs on the busiest day of the year.
|
|
148
|
+
|
|
149
|
+
And one heartbeat rule: every scheduled worker writes an observation about itself; a
|
|
150
|
+
stale heartbeat is an attention row. A provider that is not watched is not operated —
|
|
151
|
+
the failure mode of every fleet is not the crash but the silence after it.
|