@passioncode-ai/fabric-agent-adapter 0.35.1 → 0.35.2
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 +10 -0
- package/package.json +1 -1
- package/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/resilience-and-autonomy.md +25 -2
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session.py +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.35.2 - 2026-10-18
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **`creating-fabric-agents` → resilience and autonomy, second pass**: retries moved at most once and only before the
|
|
8
|
+
first byte, a persisted `Retry-After`; deciding for a waiting peer and releasing a lease with its commit; live-only,
|
|
9
|
+
exactly-once hand-overs; protocols ported from shared vectors; bytecode cleared before mutation runs; blocking work
|
|
10
|
+
off request workers and interruptible socket waits; bounded recursive parsing, content-addressed revocation, no
|
|
11
|
+
refresh of a person's own credentials. From the same retrospective's later answers (2026-10-17/18).
|
|
12
|
+
|
|
3
13
|
## 0.35.1 - 2026-10-17
|
|
4
14
|
|
|
5
15
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/fabric-agent-adapter",
|
|
3
|
-
"version": "0.35.
|
|
3
|
+
"version": "0.35.2",
|
|
4
4
|
"description": "Create Fabric-compatible agents, run them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract. This package is the installer CLI.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "python3 test/validate.py && python3 -m unittest discover -s test -q && node --test 'test/*.test.mjs'"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "fabric-agent-adapter",
|
|
4
4
|
"displayName": "Fabric Agent Adapter",
|
|
5
5
|
"description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles; and teach a coding agent to work in a project through Fabric (fabric-mcp, fabric_whoami, claim and release), with Claude Code session hooks.",
|
|
6
|
-
"version": "0.35.
|
|
6
|
+
"version": "0.35.2",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
9
9
|
"url": "https://passioncode.ai/"
|
|
@@ -5,7 +5,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
5
5
|
compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode.
|
|
6
6
|
metadata:
|
|
7
7
|
author: PassionCode.ai
|
|
8
|
-
version: "0.35.
|
|
8
|
+
version: "0.35.2"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "d8146cfb0a1c74fc6432284c4356bb0c864b37b5"
|
|
11
11
|
---
|
|
@@ -18,7 +18,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
18
18
|
compatibility: Python 3.9+ or Node.js 20+ for the kits; the probe needs Python 3.9+. launchd steps are macOS-only; Linux services install a systemd user unit and Windows ones a per-user Scheduled Task with the kits' writers. Dashboard handoff optionally uses Fabric Dashboards MCP link/host_status/open; without it, report unresolved host capability. The contract checkout is optional.
|
|
19
19
|
metadata:
|
|
20
20
|
author: PassionCode.ai
|
|
21
|
-
version: "0.35.
|
|
21
|
+
version: "0.35.2"
|
|
22
22
|
contract-version: "0.1.0"
|
|
23
23
|
extension: "fabric-service/0.1"
|
|
24
24
|
extension-commit: "d8146cfb0a1c74fc6432284c4356bb0c864b37b5"
|
|
@@ -5,7 +5,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
5
5
|
compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode. Ships in one plugin with adapting-projects-to-fabric, whose scripts it reuses.
|
|
6
6
|
metadata:
|
|
7
7
|
author: PassionCode.ai
|
|
8
|
-
version: "0.35.
|
|
8
|
+
version: "0.35.2"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "d8146cfb0a1c74fc6432284c4356bb0c864b37b5"
|
|
11
11
|
---
|
|
@@ -40,6 +40,10 @@ mechanism that held after the fix. Every rule is cheaper to build in than to ret
|
|
|
40
40
|
the next one. Retries there stalled a waiting user. Stagger many resumes; bound each worker's
|
|
41
41
|
working set (a narrow time window, a prefix), so one stop does not become a burst.
|
|
42
42
|
|
|
43
|
+
8. **Move a refused request to another account at most once, and only before any byte reached the
|
|
44
|
+
client** — a replay after streaming began duplicated output. Persist a provider's `Retry-After`
|
|
45
|
+
across restarts; a check inside the hold answers the stored observation instead of probing.
|
|
46
|
+
|
|
43
47
|
## Model answers are untrusted until accepted
|
|
44
48
|
|
|
45
49
|
1. **"Answered" is not "usable".** Each call site has its own `accept(text)` — the parser the
|
|
@@ -117,9 +121,17 @@ mechanism that held after the fix. Every rule is cheaper to build in than to ret
|
|
|
117
121
|
6. **Background chores never hold a finished command open**, unattended runs skip them, and an
|
|
118
122
|
unattended `--yes` never reverses a "no" a person saved.
|
|
119
123
|
|
|
124
|
+
7. **When a peer waits on your decision, make it**, mark it reversible, record it where the work
|
|
125
|
+
lives and reply naming the record; a platform once built nothing for days waiting on a
|
|
126
|
+
definition. Release a coordination lease in the same step as the commit that used it, the
|
|
127
|
+
failure path included.
|
|
128
|
+
8. **Hand work over only while it is alive**, and claim each hand-over exactly once by an exclusive
|
|
129
|
+
create; a forgotten workflow was handed over twice.
|
|
130
|
+
|
|
120
131
|
## Verification you can believe
|
|
121
132
|
|
|
122
|
-
1. **A test counts once it was watched failing against a planted defect
|
|
133
|
+
1. **A test counts once it was watched failing against a planted defect** (clear bytecode caches
|
|
134
|
+
first — stale bytecode reported mutants killed); a mutation battery
|
|
123
135
|
asserts its own reach ("no tests ran" is not "all plants survived"). Exercise every guard
|
|
124
136
|
with a must-catch and a must-pass case.
|
|
125
137
|
2. **Write expectations out; never compute them from the code under test**, and run a reference
|
|
@@ -141,7 +153,9 @@ mechanism that held after the fix. Every rule is cheaper to build in than to ret
|
|
|
141
153
|
9. **Probe live after every deploy on every consumer channel**, not the default one; read the
|
|
142
154
|
nightly full-suite result first when resuming work, and release from a full local run, not a
|
|
143
155
|
selected subset.
|
|
144
|
-
10. **
|
|
156
|
+
10. **Port a protocol from the contract's shared vectors, never its prose** — vendored with a hash
|
|
157
|
+
per file and run case by case; a prose port accepted a year-0000 date the vectors refused.
|
|
158
|
+
11. **Read an external contract from its raw documentation or a recorded live snapshot**, never
|
|
145
159
|
from a summarising fetch; fail closed on a field nobody documented.
|
|
146
160
|
|
|
147
161
|
## Operations that survive restarts
|
|
@@ -178,6 +192,10 @@ mechanism that held after the fix. Every rule is cheaper to build in than to ret
|
|
|
178
192
|
11. **Admit work only when the machine can carry it** — free disk, swap, a cap on concurrent
|
|
179
193
|
sessions — and say why when you defer.
|
|
180
194
|
|
|
195
|
+
12. **Keep blocking work off the workers that answer requests**, never let a read wait behind a long
|
|
196
|
+
transaction, and log a transaction held long with the step that held it. Every blocking network
|
|
197
|
+
wait is interruptible from outside, with its deadline on the socket, not between frames.
|
|
198
|
+
|
|
181
199
|
## Secrets and confinement
|
|
182
200
|
|
|
183
201
|
1. **A secret never enters an environment, argv, URL or log a child can read.** Hand it over a
|
|
@@ -198,6 +216,11 @@ mechanism that held after the fix. Every rule is cheaper to build in than to ret
|
|
|
198
216
|
an error.
|
|
199
217
|
8. **Widen an access configuration first, code second**, so nothing is over-scoped even briefly.
|
|
200
218
|
|
|
219
|
+
9. **Bound every recursive parse of untrusted input** (a depth limit, tested at the limit and one
|
|
220
|
+
above). Revoke or retire by a content-addressed reference, never a reusable name: a re-keyed
|
|
221
|
+
machine keeps its key id. Never refresh a person's own credentials as a side effect; renew only
|
|
222
|
+
what you own.
|
|
223
|
+
|
|
201
224
|
## Checklist
|
|
202
225
|
|
|
203
226
|
Before the first release, answer each with a file and a test: where a limit pauses and resumes;
|
|
@@ -63,7 +63,7 @@ WATCH_MAX_BACKOFF_S = 900
|
|
|
63
63
|
SESSION_ID = re.compile(r"[A-Za-z0-9._:-]{1,128}")
|
|
64
64
|
LOOPBACK_ORIGIN = re.compile(r"http://127\.0\.0\.1:(\d{1,5})")
|
|
65
65
|
LOCAL_ORIGIN = re.compile(r'"origin": "http://(?:127\.0\.0\.1|localhost)')
|
|
66
|
-
VERSION = "0.35.
|
|
66
|
+
VERSION = "0.35.2"
|
|
67
67
|
HOSTS = {"claude": "Claude Code", "codex": "Codex", "kimi": "Kimi Code",
|
|
68
68
|
"hermes": "Hermes", "opencode": "OpenCode", "openclaw": "OpenClaw", "pi": "Pi"}
|
|
69
69
|
NATIVE_PLUGIN_HOSTS = frozenset(("hermes", "opencode", "openclaw", "pi"))
|