@passioncode-ai/passioncode 0.2.1 → 0.2.4
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 +38 -0
- package/README.md +35 -0
- package/family.json +1 -1
- package/package.json +1 -1
- package/payload/.claude-plugin/marketplace.json +2 -2
- package/payload/manifest.json +8 -8
- package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +3 -3
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +23 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +24 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +58 -16
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md +102 -0
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +2 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board.mjs +144 -11
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package.mjs +590 -0
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package.schema.json +631 -0
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-service.mjs +2 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board.py +140 -10
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_package.py +824 -0
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_service.py +4 -3
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +3 -3
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/references/project-board.md +24 -3
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session.py +1 -1
- package/payload/plugins/passioncode/.claude-plugin/plugin.json +1 -1
- package/payload/plugins/passioncode/hooks/repo-rules.js +9 -4
- package/payload/plugins/passioncode/skills/working-in-passioncode/SKILL.md +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.4 - 2026-10-14
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **Fabric Agent Adapter is pinned at `v0.32.1`** (it was `v0.32.0`). v0.32.1 makes the
|
|
8
|
+
`building-fabric-services` lifecycle reference the rule its public readers follow: it states the lifecycle
|
|
9
|
+
itself (the supervisor owns the process, the descriptor, readiness) and links only public sources, where it used
|
|
10
|
+
to defer to the organization's private lifecycle contract (release iteration 1, N-12).
|
|
11
|
+
- 0.2.3 was not published on its own; this release carries its changes below.
|
|
12
|
+
|
|
13
|
+
## 0.2.3 - 2026-10-14
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **The session-start line names Fabric principles 10 and 11.** In a passioncode-ai repository the
|
|
18
|
+
line now also says to work by principle 10, a free agent takes the next task (a wait goes on a
|
|
19
|
+
watcher, stop only at a human gate), and principle 11, a project moves in releases and every run
|
|
20
|
+
leaves a lesson the next one reads, each with its anchor in the knowledge base's `principles.md`.
|
|
21
|
+
The knowledge base's rules §4 relies on this line to reach every session, so an `AGENTS.md` need
|
|
22
|
+
not restate the rule (`test/repo-rules.test.js`).
|
|
23
|
+
- **`working-in-passioncode` §4 carries both principles** in two bullets with their links, and a
|
|
24
|
+
new scenario eval (`a-wait-is-not-a-stop`) holds the behaviour.
|
|
25
|
+
- **README: "With the ssheleg family"** — what the public sshlg-skills family is, how it relates to
|
|
26
|
+
this set (routers, the method, what each side adds, one channel per plugin id) and the two update
|
|
27
|
+
commands.
|
|
28
|
+
|
|
29
|
+
## 0.2.2 - 2026-10-14
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- **Fabric Agent Adapter is pinned at `v0.32.0`** (it was `v0.30.0`).
|
|
34
|
+
- v0.31.0 added packing, signing and verifying an agent as a `fabric-package/1` folder, in both service kits and from
|
|
35
|
+
the command line (`npx @passioncode-ai/fabric-agent-adapter pack|sign|verify`). This is the adapter's part of the
|
|
36
|
+
RM-28 pilot.
|
|
37
|
+
- v0.31.1 lets this launcher vendor the kit.
|
|
38
|
+
- v0.32.0 pins contract `1636fa9`: a board responder now waits under an operator's hold, never treating it as an
|
|
39
|
+
outage, and reads the estate owner's settlement.
|
|
40
|
+
|
|
3
41
|
## 0.2.1 - 2026-10-13
|
|
4
42
|
|
|
5
43
|
### Changed
|
package/README.md
CHANGED
|
@@ -141,6 +141,41 @@ turns automatic updates off. Unsupported flags are rejected before mutation.
|
|
|
141
141
|
Repository docs describe the current source. See the [documentation index](docs/README.md)
|
|
142
142
|
and dated handoffs for which changes have actually been published or installed.
|
|
143
143
|
|
|
144
|
+
## With the ssheleg family
|
|
145
|
+
|
|
146
|
+
The ssheleg family ([sshlg-skills](https://github.com/ssheleg/sshlg-skills), on npm as
|
|
147
|
+
`sshlg-skills`) is a separate, public set of skills for coding agents: a working method with
|
|
148
|
+
`task-pipeline` (gated delivery and release iterations), `agent-sync` (leases and id
|
|
149
|
+
reservation), `super-ux`, `sheleg-design`, `make-skill`, `agent-stack` and others. It is not a
|
|
150
|
+
member of this launcher's set, and neither set installs or vendors the other's plugins. Install
|
|
151
|
+
both and update each as one set with its own command:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
npx @passioncode-ai/passioncode@latest update # this set: Fabric Agent Adapter, Observatory Log, passioncode
|
|
155
|
+
npx --yes sshlg-skills@latest update # the family; it takes no member argument
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
- **Routers.** `npx sshlg-skills routers` writes one routing block into each agent's global
|
|
159
|
+
instructions (`~/.claude/CLAUDE.md`, `~/.codex/AGENTS.md`, `~/.gemini/GEMINI.md`, …). It says
|
|
160
|
+
which member owns which kind of work: interface behaviour, look, copy, delivery, coordination.
|
|
161
|
+
On a computer where Fabric is installed (its services directory exists) the block gains a
|
|
162
|
+
`fabric` router, which sends questions about the computer's agent services to the Fabric
|
|
163
|
+
tooling and to this set's Fabric Agent Adapter skills.
|
|
164
|
+
- **The method.** Fabric principle 11 (a project moves in releases, and every run leaves a lesson)
|
|
165
|
+
takes its method from `task-pipeline`'s release iteration. Principle 10's wait rule (a wait is
|
|
166
|
+
not a stop) reaches personal repositories as the family's opt-in rule block
|
|
167
|
+
(`npx sshlg-skills config set rules.wait on`). In a passioncode-ai repository both reach the
|
|
168
|
+
agent through this plugin's session-start line and `working-in-passioncode` instead.
|
|
169
|
+
- **What the family gains here.** Where Project Observatory runs, `task-pipeline` writes workflow
|
|
170
|
+
checkpoints and planned handoffs through it and records cross-project lessons in its shared
|
|
171
|
+
lesson store, as proposals; `agent-sync` takes the git leases that passioncode-ai repositories
|
|
172
|
+
declare.
|
|
173
|
+
- **One channel per plugin id.** Each plugin comes from one source: this set's from the
|
|
174
|
+
`passioncode` marketplace, each family member's from its own (`<name>@<name>`). A plain skill
|
|
175
|
+
copy in `~/.claude/skills` shadows a plugin; both updaters take such copies out of the way and
|
|
176
|
+
never create one. Never update a plugin member with a bare `npx skills update <name>`: it
|
|
177
|
+
recreates that copy.
|
|
178
|
+
|
|
144
179
|
## Release (maintainers)
|
|
145
180
|
|
|
146
181
|
1. Tag every member at the version to ship; set `ref` to that tag in `family.json`.
|
package/family.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/passioncode",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Set up PassionCode.ai on a computer with one command — the apps from their verified releases, their MCP servers for every coding agent and the PassionCode.ai skills — and check and repair it with the same command or `doctor`.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"passioncode": "bin/passioncode.js"
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"name": "fabric-agent-adapter",
|
|
12
12
|
"displayName": "Fabric Agent Adapter",
|
|
13
13
|
"source": "./plugins/fabric-agent-adapter",
|
|
14
|
-
"version": "0.
|
|
14
|
+
"version": "0.32.1",
|
|
15
15
|
"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.",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "PassionCode.ai",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"name": "passioncode",
|
|
36
36
|
"displayName": "PassionCode.ai",
|
|
37
37
|
"source": "./plugins/passioncode",
|
|
38
|
-
"version": "0.2.
|
|
38
|
+
"version": "0.2.4",
|
|
39
39
|
"description": "Set up and check PassionCode.ai on a computer with one command (setting-up-passioncode), the organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
|
|
40
40
|
"author": {
|
|
41
41
|
"name": "PassionCode.ai",
|
package/payload/manifest.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"family": "passioncode",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"release": true,
|
|
5
5
|
"members": [
|
|
6
6
|
{
|
|
7
7
|
"name": "fabric-agent-adapter",
|
|
8
8
|
"displayName": "Fabric Agent Adapter",
|
|
9
9
|
"repo": "passioncode-ai/fabric-agent-adapter",
|
|
10
|
-
"ref": "v0.
|
|
11
|
-
"commit": "
|
|
12
|
-
"version": "0.
|
|
10
|
+
"ref": "v0.32.1",
|
|
11
|
+
"commit": "4a90eb326e45f5c440103a4396b8151567a198b7",
|
|
12
|
+
"version": "0.32.1",
|
|
13
13
|
"via": "clone of https://***@github.com/passioncode-ai/fabric-agent-adapter.git",
|
|
14
14
|
"skills": [
|
|
15
15
|
"adapting-projects-to-fabric",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"legacyMarketplaces": [
|
|
24
24
|
"fabric-agent-adapter"
|
|
25
25
|
],
|
|
26
|
-
"contentHash": "sha256:
|
|
26
|
+
"contentHash": "sha256:8bb67aa1250509ab7b9cce69be9d0a4e960eed56ef4a7a654d3f89a9d3c6e343",
|
|
27
27
|
"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.",
|
|
28
28
|
"author": {
|
|
29
29
|
"name": "PassionCode.ai",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
"name": "passioncode",
|
|
63
63
|
"displayName": "PassionCode.ai",
|
|
64
64
|
"repo": "passioncode-ai/passioncode",
|
|
65
|
-
"ref": "v0.2.
|
|
65
|
+
"ref": "v0.2.4",
|
|
66
66
|
"commit": null,
|
|
67
|
-
"version": "0.2.
|
|
67
|
+
"version": "0.2.4",
|
|
68
68
|
"via": "this repository",
|
|
69
69
|
"skills": [
|
|
70
70
|
"setting-up-passioncode",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
],
|
|
73
73
|
"legacyPluginIds": [],
|
|
74
74
|
"legacyMarketplaces": [],
|
|
75
|
-
"contentHash": "sha256:
|
|
75
|
+
"contentHash": "sha256:80ca398a05c5ea27bc97b7c2eb2116a8ce7f1160e978a66e0c58e500cf7b6003",
|
|
76
76
|
"description": "Set up and check PassionCode.ai on a computer with one command (setting-up-passioncode), the organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
|
|
77
77
|
"author": {
|
|
78
78
|
"name": "PassionCode.ai",
|
|
@@ -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.
|
|
6
|
+
"version": "0.32.1",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
9
9
|
"url": "https://passioncode.ai/"
|
|
@@ -5,9 +5,9 @@ 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.
|
|
8
|
+
version: "0.32.1"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
10
|
+
contract-commit: "1636fa97262f4a26e2086572d540c2ee701e0010"
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Adapting projects to Fabric
|
|
@@ -70,7 +70,7 @@ Use exactly:
|
|
|
70
70
|
|
|
71
71
|
- contract version `0.1.0`;
|
|
72
72
|
- repository `https://github.com/passioncode-ai/fabric-agent-contract`;
|
|
73
|
-
- commit `
|
|
73
|
+
- commit `1636fa97262f4a26e2086572d540c2ee701e0010`.
|
|
74
74
|
|
|
75
75
|
This is the default for new bundles. When checking an issued legacy bundle, preserve its
|
|
76
76
|
explicit supported lock and use that exact clean checkout. Never silently upgrade or
|
|
@@ -21,10 +21,10 @@ import fabric_secrets as _secrets # noqa: E402 - the contract's credential dete
|
|
|
21
21
|
|
|
22
22
|
CONTRACT_VERSION = "0.1.0"
|
|
23
23
|
CONTRACT_REPOSITORY = "https://github.com/passioncode-ai/fabric-agent-contract"
|
|
24
|
-
CONTRACT_COMMIT = "
|
|
24
|
+
CONTRACT_COMMIT = "1636fa97262f4a26e2086572d540c2ee701e0010"
|
|
25
25
|
# #region supported-contract-revisions — docs: README.md#contract-pin
|
|
26
26
|
# Only this declaration may name a legacy revision in live files.
|
|
27
|
-
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "a046f57cf46ea9e3da57ff8ce6a3ed4d26d8774b", "fe55fc67cba1a9e34a736da7d148d4fe2a8fbfa0", "b291bf09e0a9f9fd3c16cf540832cd021203b7d1", "0cacd08b0e95b6abf131eae1206b60792138bc3c", "2eb91c00e852d9c31d804310d38fad91589fcbac", "8e49fbd5fbbf230e32c1969cd24ac3c22422f0a5", "a83bec6b47776af688402c18efec507143061f68", "52da526d7cc1e063d74c5b520dbc03d0ace15246", "78b2da018d2c4bd9ac1bde1dc3b7f1a110a175f5", "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
27
|
+
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "f00a7685e3861c27f7899c033fb850a145a1708f", "a046f57cf46ea9e3da57ff8ce6a3ed4d26d8774b", "fe55fc67cba1a9e34a736da7d148d4fe2a8fbfa0", "b291bf09e0a9f9fd3c16cf540832cd021203b7d1", "0cacd08b0e95b6abf131eae1206b60792138bc3c", "2eb91c00e852d9c31d804310d38fad91589fcbac", "8e49fbd5fbbf230e32c1969cd24ac3c22422f0a5", "a83bec6b47776af688402c18efec507143061f68", "52da526d7cc1e063d74c5b520dbc03d0ace15246", "78b2da018d2c4bd9ac1bde1dc3b7f1a110a175f5", "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
28
28
|
# #endregion supported-contract-revisions
|
|
29
29
|
INTEROP_KEY = "https://fabric.passioncode.ai/agent-contract/extensions/interop/0.1"
|
|
30
30
|
MCP_REVISION = "2026-07-28"
|
|
@@ -8,19 +8,20 @@ description: >-
|
|
|
8
8
|
"make this agent a local service", "make an online dashboard a Fabric service", "add the
|
|
9
9
|
well-known endpoint", «расходы агента на модели». Covers fabric-service/0.1:
|
|
10
10
|
surfaces, token and one-time login, state, one copy, launchd, descriptor, well-known document,
|
|
11
|
-
events, the usage report; online: the https guard,
|
|
12
|
-
__Host- cookie; the board responder (fenced claims); Python, Node and dashboard kits, probes
|
|
11
|
+
events, the usage report; online: the https guard, token-gated well-known, the
|
|
12
|
+
__Host- cookie; the board responder (fenced claims); Python, Node and dashboard kits, probes;
|
|
13
|
+
packing and signing (fabric-package/1).
|
|
13
14
|
NOT for a one-off script or cron job, a hosted product
|
|
14
|
-
with no agent
|
|
15
|
+
with no agent, the provider manifest (adapting-projects-to-fabric), or building Fabric
|
|
15
16
|
Dashboards.
|
|
16
17
|
license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
17
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.
|
|
18
19
|
metadata:
|
|
19
20
|
author: PassionCode.ai
|
|
20
|
-
version: "0.
|
|
21
|
+
version: "0.32.1"
|
|
21
22
|
contract-version: "0.1.0"
|
|
22
23
|
extension: "fabric-service/0.1"
|
|
23
|
-
extension-commit: "
|
|
24
|
+
extension-commit: "1636fa97262f4a26e2086572d540c2ee701e0010"
|
|
24
25
|
---
|
|
25
26
|
|
|
26
27
|
# Building Fabric services
|
|
@@ -271,6 +272,23 @@ Then prove the lock: start a second copy by hand against the same data directory
|
|
|
271
272
|
must exit 75 while the first keeps serving. Prove recovery: `kill -9` the launchd pid;
|
|
272
273
|
the well-known document must answer again with a new pid within about 15 seconds.
|
|
273
274
|
|
|
275
|
+
## Packing and signing it — `fabric-package/1`
|
|
276
|
+
|
|
277
|
+
To hand an agent to another machine or an organization, pack it as one folder (contract DEC-0050, DEC-0051). Write the
|
|
278
|
+
author's `fabric.package.json` (the descriptive fields; for an agent `resultSignal` and `evals` with the receipt of the
|
|
279
|
+
suite as packed), then:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
python3 <skill-dir>/scripts/fabric_package.py pack <folder> # or: node fabric-package.mjs, npx @passioncode-ai/fabric-agent-adapter pack
|
|
283
|
+
python3 <skill-dir>/scripts/fabric_package.py pack <folder> --apply
|
|
284
|
+
python3 <skill-dir>/scripts/fabric_package.py sign <folder> --key <key file> --kid <kid> --apply
|
|
285
|
+
python3 <skill-dir>/scripts/fabric_package.py verify <folder> --trust <trust.json>
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
`pack` derives `agentRef`, lists every file with its SHA-256, computes the digest and checks the schema, the rules and
|
|
289
|
+
the folder; it refuses `.env`, keys, `.git`, caches and symlinks. `sign` uses a key file the person names (Ed25519,
|
|
290
|
+
`EdDSA`); it never makes, keeps or prints a key. Read [the package reference](references/package.md) before packing.
|
|
291
|
+
|
|
274
292
|
## The repository around the service
|
|
275
293
|
|
|
276
294
|
**For a PassionCode.ai repository**, the service's repository follows the organization's
|
package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Answering a Project's requests on Fabric's project board
|
|
2
2
|
|
|
3
3
|
Read this when a service should answer requests other Projects post to its Project on Fabric's project board
|
|
4
|
-
(`fabric-project-comms/0.1`, contract DEC-0022, DEC-0073, DEC-0077, DEC-0078; Fabric ADR-0149). The kits do it with
|
|
4
|
+
(`fabric-project-comms/0.1`, contract DEC-0022, DEC-0073, DEC-0077, DEC-0078, DEC-0079, DEC-0081; Fabric ADR-0149). The kits do it with
|
|
5
5
|
two modules each: the hub door client [`fabric_hub.py`](../scripts/fabric_hub.py) /
|
|
6
6
|
[`fabric-hub.mjs`](../scripts/fabric-hub.mjs) and the responder [`fabric_board.py`](../scripts/fabric_board.py) /
|
|
7
7
|
[`fabric-board.mjs`](../scripts/fabric-board.mjs). A coding agent that only reads and writes the board is the other
|
|
@@ -15,6 +15,7 @@ skill's business (working-with-fabric, `references/project-board.md`).
|
|
|
15
15
|
- The request is data: the input gate
|
|
16
16
|
- Effects, observation, evidence and the reply
|
|
17
17
|
- When the board says stop, and restarts
|
|
18
|
+
- When the operator holds work (DEC-0079)
|
|
18
19
|
- What a board session may call
|
|
19
20
|
- Looking a Project up in the directory (FAC-SEM-107)
|
|
20
21
|
- Events, the probe and the live smoke
|
|
@@ -115,6 +116,28 @@ accepted ones go back to this responder with `com.responder_replace {expectedGen
|
|
|
115
116
|
contract has no `com.claim` read-back and `com.claim` never moves an accepted request. A known outcome is sent after the
|
|
116
117
|
transfer without running the handler again. `shutdown()` drains, then leaves the session (its DELETE releases the slot).
|
|
117
118
|
|
|
119
|
+
## When the operator holds work (DEC-0079)
|
|
120
|
+
|
|
121
|
+
The operator can hold a thread, a whole Project or one (Project, capability) slot from Fabric's own controls. While the
|
|
122
|
+
hold lasts, the board refuses **new** work in its scope with `held`, which is always `retryable: true`. It never
|
|
123
|
+
refuses a call that settles, reports on or keeps alive work already started (`com.renew`, `com.progress`,
|
|
124
|
+
`com.complete`, `com.reconcile`), a cancel or a read. `hold_refuses(tool, target, holds)` / `holdRefuses` is the
|
|
125
|
+
contract's matrix, held to its vectors (`test/fixtures/contract/comms-hold-vectors.json`).
|
|
126
|
+
|
|
127
|
+
| Refused `held` | What the kit does |
|
|
128
|
+
|---|---|
|
|
129
|
+
| `com.status` names the slot `held: true` at connect | the slot is not enrolled; it pauses |
|
|
130
|
+
| `com.enroll`, `com.claim`, `com.responder_replace` | the slot pauses: asked again after 15 s, then 30 s, doubling to 15 minutes; one `board.slot.held` event per capability, and `board.slot.released` when an enroll succeeds again |
|
|
131
|
+
| `com.accept` (the hold came after the claim) | nothing was done: the entry is dropped, the claim lapses and the request waits on the board (`board.request.waiting`); the slot pauses |
|
|
132
|
+
| `com.effect_begin` | the effect has not begun: the handler waits (same idempotency key, the pause doubling) while the tick keeps renewing the lease, then begins once the hold is lifted; `ctx.stopped` ends the wait |
|
|
133
|
+
| accepted work at restart under a hold | kept as `lapsed`, then taken back with `com.responder_replace` and a transfer once the hold is lifted — never claimed back |
|
|
134
|
+
|
|
135
|
+
A hold is not an outage: no `board.down`, no notify. Work already accepted keeps running and completes.
|
|
136
|
+
|
|
137
|
+
A receipt's request may carry `settledBy: "owner"` (DEC-0081): the estate owner settled an `outcome_unknown` request
|
|
138
|
+
whose responder was gone. Read it as the owner's attestation, not the responder's; it appears only on `completed` or
|
|
139
|
+
`failed_known`, and its absence means the responder settled it.
|
|
140
|
+
|
|
118
141
|
## What a board session may call
|
|
119
142
|
|
|
120
143
|
A board session (`fabric.board.join`) is served the respond scope only: `com.status`, `com.list`, `com.get`,
|
package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md
CHANGED
|
@@ -1,31 +1,73 @@
|
|
|
1
1
|
# Lifecycle — supervisor, install, release layout, state
|
|
2
2
|
|
|
3
|
-
This page
|
|
4
|
-
|
|
5
|
-
(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
| LC-01 quit reaches exit within a deadline | [Shutdown](#shutdown) | `Drain` / `Drain` |
|
|
11
|
-
| LC-03 a job is bounded and exclusive | [one copy under a supervisor](#one-copy-under-a-supervisor) | `hold_single_instance` / `holdSingleInstance` |
|
|
12
|
-
| LC-09 the footprint is declared | the descriptor and the plist, unit or task; the service's own `AGENTS.md` names its label (unit, task) and port | `write_descriptor`, `launchd_plist`, `systemd_unit` / `systemdUnit`, `task_xml` / `taskXml` |
|
|
13
|
-
| LC-11 previous release kept, older pruned | [Install, upgrade, uninstall](#install-upgrade-uninstall) | `prune_releases` / `pruneReleases` |
|
|
14
|
-
| LC-12 every file is bounded | [Logs](#logs) | `RotatingLog`, `cap_stdout_log` / `RotatingLog`, `capStdoutLog` |
|
|
15
|
-
| LC-14 operator intent wins; uninstall is symmetric | [Install, upgrade, uninstall](#install-upgrade-uninstall), [Linux and Windows](#linux-and-windows) | `launchd_install` / `launchdInstall`, `launchd_uninstall` / `launchdUninstall`; `systemd_install` / `systemdInstall`, `task_install` / `taskInstall` and their uninstalls |
|
|
16
|
-
| LC-15 builds clean up after themselves | release pruning runs inside the installer, not later | `prune_releases` / `pruneReleases` |
|
|
3
|
+
**This page is the rule** for anyone who builds, installs or runs a `fabric-service/0.1` service with this
|
|
4
|
+
skill. Everything you must follow is stated here or in the public Fabric Agent Contract's
|
|
5
|
+
[service specification, *Lifecycle*](https://github.com/passioncode-ai/fabric-agent-contract/blob/main/docs/specification/service.md#lifecycle), which this page
|
|
6
|
+
implements and links; where the two disagree, the specification is right and this page is the defect (report it in
|
|
7
|
+
this repository). Inside
|
|
8
|
+
PassionCode.ai the same rules make up the organization's product lifecycle contract, kept in its knowledge base. The
|
|
9
|
+
`LC-` ids below are that contract's, given for provenance only: nothing behind them is needed to follow this page.
|
|
17
10
|
|
|
18
11
|
## Contents
|
|
19
12
|
|
|
20
|
-
- [
|
|
13
|
+
- [The rules](#the-rules)
|
|
14
|
+
- [launchd plist](#launchd-plist-generate-it-with-launchd_plist-or-launchdplist-both-kits-write-the-same-bytes)
|
|
21
15
|
- [Install, upgrade, uninstall](#install-upgrade-uninstall)
|
|
22
16
|
- [One copy under a supervisor](#one-copy-under-a-supervisor)
|
|
17
|
+
- [An app's own descriptor and the node](#an-apps-own-descriptor-and-the-node)
|
|
23
18
|
- [Directories](#directories)
|
|
24
19
|
- [Logs](#logs)
|
|
25
20
|
- [Shutdown](#shutdown)
|
|
26
21
|
- [Being managed by a host lifecycle broker](#being-managed-by-a-host-lifecycle-broker)
|
|
27
22
|
- [Linux and Windows](#linux-and-windows)
|
|
28
23
|
|
|
24
|
+
## The rules
|
|
25
|
+
|
|
26
|
+
**The supervisor owns the process.** A local service runs under exactly one supervisor, named in its descriptor's
|
|
27
|
+
`lifecycle.manager`: `launchd` (macOS), `systemd` (Linux), `task-scheduler` (Windows) or `node` (Project
|
|
28
|
+
Observatory's node supervising its children). An app a person starts says `person` and has no supervisor; where a host
|
|
29
|
+
runs a lifecycle broker, the broker is the one that quits it ([below](#being-managed-by-a-host-lifecycle-broker)).
|
|
30
|
+
Starting, stopping and restarting go through the supervisor and nothing else:
|
|
31
|
+
|
|
32
|
+
- **Never kill a service.** A host, an agent, an installer or the service's own CLI never starts a service process
|
|
33
|
+
directly and never kills or signals one. It asks the supervisor: on macOS `bootout` + `disable` to stop and keep
|
|
34
|
+
off, `enable` + `bootstrap` to start, `kickstart -k` to restart; [Linux and Windows](#linux-and-windows) have
|
|
35
|
+
their own verbs; a node's child is started, stopped and restarted only through the node.
|
|
36
|
+
- **State comes from the supervisor**: `launchctl print`, `systemctl --user show`, the task's state and last run,
|
|
37
|
+
or the node's record. Compare the supervisor's pid with the well-known `process.pid` to see a second copy.
|
|
38
|
+
- **Restart is the supervisor's.** A service that exits is started again, no sooner than 10 s after its last start
|
|
39
|
+
(`KeepAlive` with `ThrottleInterval` 10, `Restart=always` with `RestartSec=10`, the node likewise; a scheduled task
|
|
40
|
+
restarts on failure every minute). A restart onto new code shows as a new `service.build`.
|
|
41
|
+
- **Off stays off.** The operator's off survives a login, an upgrade and a reinstall (LC-14).
|
|
42
|
+
|
|
43
|
+
**The descriptor is the installation.** The installer writes one descriptor per instance (`<id>.<instance>.json`,
|
|
44
|
+
atomic, mode 0600) and the uninstaller removes it; a running service never writes its own, except an app
|
|
45
|
+
([below](#an-apps-own-descriptor-and-the-node)). It names the supervisor and its file (`label` and `plist`, `unit`,
|
|
46
|
+
or `task`; none for `node` and `person`), the `origin` `http://127.0.0.1:<port>` (a port is a claim: an installer
|
|
47
|
+
refuses a port another instance declares), the service's directories, and commands as argument arrays that never
|
|
48
|
+
carry a credential. Only `doctor` and `update` are commands a host may run.
|
|
49
|
+
|
|
50
|
+
**Started is not ready.** Readiness is the well-known document, `GET /.well-known/fabric-service`: answered without
|
|
51
|
+
authentication, from memory, in under 100 ms, with `service.id` and `service.instance` equal to the descriptor's.
|
|
52
|
+
`status` is `starting`, `ready`, `degraded` or `stopping`; `degraded` is always present, and an empty list asserts
|
|
53
|
+
full health. A process that cannot serve does not answer, and a host derives `down`. An install or upgrade polls
|
|
54
|
+
that document until `service.id` matches (at most 40 s) before it calls the service started.
|
|
55
|
+
|
|
56
|
+
| Id | Rule | Here | Kit (Python / Node) |
|
|
57
|
+
|---|---|---|---|
|
|
58
|
+
| LC-01 | **Quit reaches exit within a deadline.** Every trigger (`SIGTERM`, `SIGINT`, logout, the app's own quit) ends the process: within 5 s idle, within 10 s with work in flight, then a hard exit. Nothing starts after quit begins | [Shutdown](#shutdown) | `Drain` / `Drain` |
|
|
59
|
+
| LC-02 | **Every child has an owner, a deadline and a process group.** No subprocess without a timeout; on timeout or the parent's exit the whole group goes; no orphan survives. Locks and shared resources are released in `finally` | your own code | — |
|
|
60
|
+
| LC-03 | **A job is bounded and exclusive.** One copy holds `service.lock`; a scheduled job has a watchdog shorter than its interval, shares its lock with every manual entry point, bounds every network call and records each run's outcome. Long work is journalled before it starts | [One copy under a supervisor](#one-copy-under-a-supervisor) | `hold_single_instance` / `holdSingleInstance` |
|
|
61
|
+
| LC-04 | **Credentials are silent after setup.** No background prompt; a credential read that is denied or absent is cached and backs off until a person acts | [Directories](#directories) (secret files 0600) | — |
|
|
62
|
+
| LC-05 | **Identity is stable across updates.** The supervisor runs a stable executable inside a release directory, never an interpreter by a versioned package-manager path; signed builds are pinned by team and identifier | [launchd plist](#launchd-plist-generate-it-with-launchd_plist-or-launchdplist-both-kits-write-the-same-bytes) | — |
|
|
63
|
+
| LC-09 | **The footprint is declared.** The service's `AGENTS.md` names every resident process, its supervisor label, unit or task and its port, who starts each and who stops it | the descriptor and the supervisor file | `write_descriptor`, `launchd_plist`, `systemd_unit` / `systemdUnit`, `task_xml` / `taskXml` |
|
|
64
|
+
| LC-11 | **An update is a lifecycle event.** An upgrade writes a new immutable release and restarts through the supervisor; the previous release is kept for rollback, older ones are pruned | [Install, upgrade, uninstall](#install-upgrade-uninstall) | `prune_releases` / `pruneReleases` |
|
|
65
|
+
| LC-12 | **Every file is bounded.** Logs rotate by size (5 × 5 MB), mode 0600, never in `/tmp`; temporary leftovers are swept at start | [Logs](#logs) | `RotatingLog`, `cap_stdout_log` / `RotatingLog`, `capStdoutLog` |
|
|
66
|
+
| LC-14 | **The operator's intent wins; uninstall is symmetric.** No install or upgrade re-enables what the operator turned off; uninstall removes what install added (supervisor file, override, descriptor), and data goes only on an explicit purge | [Install, upgrade, uninstall](#install-upgrade-uninstall), [Linux and Windows](#linux-and-windows) | `launchd_install` / `launchdInstall`, `launchd_uninstall` / `launchdUninstall`; `systemd_install` / `systemdInstall`, `task_install` / `taskInstall` and their uninstalls |
|
|
67
|
+
| LC-15 | **Builds clean up after themselves.** At most the current release and the one before it remain; the prune runs inside the installer, not later | [Install, upgrade, uninstall](#install-upgrade-uninstall) | `prune_releases` / `pruneReleases` |
|
|
68
|
+
| LC-21 | **A secret never travels in a command line.** Keys reach the process through its environment, a 0600 file or a vault, never argv; a supervisor file carries no secret | [launchd plist](#launchd-plist-generate-it-with-launchd_plist-or-launchdplist-both-kits-write-the-same-bytes), [Linux and Windows](#linux-and-windows) | the supervisor-file writers refuse a secret-shaped value |
|
|
69
|
+
| LC-22 | **Work survives a restart.** Work started but not finished is journalled on disk, without secrets, before it starts; the restarted service takes it back or cleans it up | [Shutdown](#shutdown) | — (the service's own journal) |
|
|
70
|
+
|
|
29
71
|
## launchd plist (generate it with `launchd_plist` or `launchdPlist`; both kits write the same bytes)
|
|
30
72
|
|
|
31
73
|
| Key | Value | Why |
|
|
@@ -168,7 +210,7 @@ has to survive being driven from outside:
|
|
|
168
210
|
|
|
169
211
|
- **Quit reaches exit through both doors.** A broker asks the platform's own quit first — on
|
|
170
212
|
macOS `NSRunningApplication.terminate()`, the path Cmd+Q and the Dock take — and `SIGTERM` a few
|
|
171
|
-
seconds later. Handle both and exit inside the deadline (
|
|
213
|
+
seconds later. Handle both and exit inside the deadline (LC-01). A desktop app
|
|
172
214
|
that answers `SIGTERM` by closing its window and staying alive is stopped late or not at all.
|
|
173
215
|
- **A background launch stays in the background.** A broker opens the app non-activating
|
|
174
216
|
(`NSWorkspace.OpenConfiguration.activates = false`); do not call `app.focus()`, `show()` on a
|
package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Packing, signing and verifying — `fabric-package/1`
|
|
2
|
+
|
|
3
|
+
Contract DEC-0050 (format and digest), DEC-0051 (signatures), DEC-0071 and DEC-0074 (a consumer agent), rules
|
|
4
|
+
`FAC-SEM-064`…`066` and `FAC-SEM-102`, all at this plugin's pin. The kit: `scripts/fabric_package.py` and
|
|
5
|
+
`scripts/fabric-package.mjs`, which write the same bytes, and `npx @passioncode-ai/fabric-agent-adapter pack|sign|verify`.
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- [What a package is](#what-a-package-is)
|
|
10
|
+
- [The author's file](#the-authors-file)
|
|
11
|
+
- [pack](#pack)
|
|
12
|
+
- [sign](#sign)
|
|
13
|
+
- [verify](#verify)
|
|
14
|
+
- [A consumer agent](#a-consumer-agent)
|
|
15
|
+
- [What this version does not do](#what-this-version-does-not-do)
|
|
16
|
+
|
|
17
|
+
## What a package is
|
|
18
|
+
|
|
19
|
+
One version of an agent or a skill set, as one folder: `fabric.package.json` at its root, every other file listed in it
|
|
20
|
+
with its SHA-256. The digest is SHA-256 over the RFC 8785 form of the document without `digest` and `signatures`, so it
|
|
21
|
+
covers every file through `files[]`, and a countersignature needs no repacking. A folder that is a Claude Code plugin
|
|
22
|
+
has `.claude-plugin/plugin.json` whose `name` and `version` are the package's `id` and `version`.
|
|
23
|
+
|
|
24
|
+
## The author's file
|
|
25
|
+
|
|
26
|
+
The person writes the descriptive part; `pack` fills in the rest.
|
|
27
|
+
|
|
28
|
+
| You write | `pack` writes |
|
|
29
|
+
|---|---|
|
|
30
|
+
| `schema` (`fabric-package/1`), `kind` (`agent` or `skill-set`), `id` (kebab-case, the plugin name), `version` (semver), `publisher` (a name, never a key), `licence` (SPDX) | `agentRef` = `urn:fabric:agent:<publisher>:<id>`, after `publisher` (an agent only; a hand-written one that differs is refused) |
|
|
31
|
+
| an agent: `resultSignal {name, says}`, `evals {suite, receipt {ranAt, suite, passed, failed, skipped?}}`, and as needed `provider`, `service`, `secrets[]` (slots: name and purpose, never a value), `requires`, `costPresets`, `state[]`, `dependencies[]` | `files[]`: every file but `fabric.package.json`, in UTF-16 order, each with `sha256:` and its hex digest |
|
|
32
|
+
| a skill set: `layer`, `skills` | `digest` |
|
|
33
|
+
|
|
34
|
+
The evals receipt's `suite` is the SHA-256 of the suite **as packed**. When the suite changes, run it again and write that
|
|
35
|
+
receipt; `pack` names the digest it expects. Never edit the receipt to match.
|
|
36
|
+
|
|
37
|
+
## pack
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
python3 scripts/fabric_package.py pack <folder> # a dry run: the package, the digest, every problem
|
|
41
|
+
python3 scripts/fabric_package.py pack <folder> --apply # writes fabric.package.json when nothing is wrong
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
It refuses to list what must not ship, and names each: a symlink, a special file, `.git`, `__pycache__`, `.DS_Store`,
|
|
45
|
+
`*.pyc`, and files that are credentials by name (`.env` and `.env.*` but `.env.example|sample|template`, `*.pem`, `*.key`,
|
|
46
|
+
`*.p12`, `*.pfx`, `*.jks`, `*.keystore`, `id_rsa`-style keys, `.npmrc`, `.netrc`, `.pypirc`). Remove them or pack a clean
|
|
47
|
+
copy. A member named twice in `fabric.package.json` is refused too.
|
|
48
|
+
|
|
49
|
+
Then every problem is listed, each with its `rule`: `schema` (the contract's schema), `FAC-SEM-064` (whole: its own
|
|
50
|
+
digest, each path once, every named file listed with the same SHA-256), `FAC-SEM-065` (no secret), `FAC-SEM-066`
|
|
51
|
+
(`agentRef` derived), `FAC-SEM-102` (one role, one server) and `folder` (`file-missing`, `file-digest`, `file-unlisted`,
|
|
52
|
+
`plugin-manifest`, `provider-manifest`). With a problem, `--apply` writes nothing. Repacking drops old signatures and
|
|
53
|
+
says so: a changed package is signed again.
|
|
54
|
+
|
|
55
|
+
## sign
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
python3 scripts/fabric_package.py sign <folder> --key <key file> [--kid <kid>] [--role publisher|organization] --apply
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- The key is a file the person names: an Ed25519 private JWK (`kty` OKP, `crv` Ed25519, `d`, its `kid`) or a PKCS#8 PEM
|
|
62
|
+
from `openssl genpkey -algorithm ed25519` (then `--kid`). It must be mode 600. The kit never makes, keeps or prints a
|
|
63
|
+
key; where the key lives is the person's decision (contract v4 D3).
|
|
64
|
+
- The signature covers `{"type": "fabric-package-signature/1", "role", "digest"}` in RFC 8785 form, so a publisher's
|
|
65
|
+
signature never stands for a countersignature. `alg` is `EdDSA`, the one algorithm DEC-0051 admits.
|
|
66
|
+
- Only a package that is whole and matches its folder is signed. A publisher signature is always one (re-signing replaces
|
|
67
|
+
it); an organization countersignature under the same `kid` is replaced, another is added.
|
|
68
|
+
- The answer carries `publicKey`, the public JWK the installing machine pins (the estate record's `publisherKeys`,
|
|
69
|
+
DEC-0055). The package names a publisher, never a key.
|
|
70
|
+
|
|
71
|
+
## verify
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
python3 scripts/fabric_package.py verify <folder> --trust trust.json [--countersigned]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`trust.json` is `{"publisher": [jwk…], "organization": [jwk…]}`, the keys this machine pins. The verdict is the
|
|
78
|
+
contract's `verifyPackage`, in PK-1…PK-10's order: `malformed`, `digest-mismatch`, `unsigned`, `no-publisher-signature`,
|
|
79
|
+
then per signature `unknown-algorithm`, `unknown-key` / `duplicate-kid`, `key-algorithm-mismatch` / `unusable-key`,
|
|
80
|
+
`small-order-key` (checked before any verification, DEC-0045), `bad-signature`, and with `--countersigned`
|
|
81
|
+
`no-countersignature`. A countersignature under a key the machine does not pin is listed in `unverified` unless
|
|
82
|
+
`--countersigned` is asked; a bad one under a pinned key refuses the package. `verify` also runs the folder check and the
|
|
83
|
+
rules, so a file changed after signing is caught (`file-digest`, `file-unlisted`).
|
|
84
|
+
|
|
85
|
+
Exit codes for all three: 0 when it holds, 1 when it does not, 2 for a usage error. The answer is JSON on stdout.
|
|
86
|
+
|
|
87
|
+
## A consumer agent
|
|
88
|
+
|
|
89
|
+
An agent that serves nothing and only calls MCP servers is `kind: agent` without `provider` (DEC-0071). It lists its
|
|
90
|
+
`skills` and its plugin manifest, has no `service`, `state` or `layer`, and names the servers it calls in `requires.mcp[]`
|
|
91
|
+
by role and tools. A role names the secret slots that configure its server (`secrets`, DEC-0074), each declared in
|
|
92
|
+
`secrets[]`, one slot to one role. Before installing, `consumer_placement(pkg, configured)` / `consumerPlacement(pkg,
|
|
93
|
+
Map)` names each role the placement does not register and each tool its server lacks.
|
|
94
|
+
|
|
95
|
+
## What this version does not do
|
|
96
|
+
|
|
97
|
+
- **ES256.** It waits for Fabric's decision D2; until then a verifier refuses it as `unknown-algorithm` (FAA-29).
|
|
98
|
+
- **Hub signing for the person's own machines, and the passkey.** Stage 3 of target architecture v4.
|
|
99
|
+
- **The organization's countersignature as a passkey assertion.** It waits for `org-countersign/1` and
|
|
100
|
+
`org-authority/1`; this version's countersignature is a detached Ed25519 signature.
|
|
101
|
+
- **Fabric recording packages by `agentRef`.** It waits for the ADR-0138 D2b amendment.
|
|
102
|
+
- **`publish --to org`** (FAA-28).
|
package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# fabric-service/0.1 — wire reference
|
|
2
2
|
|
|
3
|
-
Pinned to `fabric-agent-contract` commit `
|
|
3
|
+
Pinned to `fabric-agent-contract` commit `1636fa97262f4a26e2086572d540c2ee701e0010`
|
|
4
4
|
(`docs/specification/service.md`, DEC-0015; the usage report DEC-0021; Windows and Linux supervision
|
|
5
5
|
DEC-0032 and DEC-0033; the operator channel DEC-0034 and DEC-0035; the embedded dashboard DEC-0036;
|
|
6
6
|
delegation and the operator session's lifetime DEC-0039; the meter's call window DEC-0041; session handoff DEC-0042;
|
|
@@ -8,7 +8,7 @@ canonical forms DEC-0043; `degraded[].setup` and `run.mcp.stdio.scope` DEC-0044;
|
|
|
8
8
|
DEC-0045; runner and model profiles DEC-0046; the estate record DEC-0055; one copy under any supervisor and its marker,
|
|
9
9
|
the Windows token-file reader DEC-0057; the hub key the estate certifies DEC-0060; signing credentials DEC-0063; the
|
|
10
10
|
estate record's 60 s skew DEC-0066; an app's own descriptor DEC-0069; the descriptor for listings DEC-0061; identifier equality
|
|
11
|
-
by normal form DEC-0076; the project board's directory page DEC-0077 and a replacement's transferred attempts DEC-0078). The contract's schemas are normative;
|
|
11
|
+
by normal form DEC-0076; the project board's directory page DEC-0077 and a replacement's transferred attempts DEC-0078; an operator's hold DEC-0079, a structured finding DEC-0080 and the owner's settlement DEC-0081). The contract's schemas are normative;
|
|
12
12
|
this page is the working summary. Extension key:
|
|
13
13
|
`https://fabric.passioncode.ai/agent-contract/extensions/service/0.1`.
|
|
14
14
|
|