@passioncode-ai/fabric-agent-adapter 0.58.0 → 0.59.0
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 +44 -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 +3 -2
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/operator-channel-and-repository.md +4 -1
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/source-and-instance.md +27 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +13 -16
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +91 -1
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +19 -7
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/operator-channel-and-repository.md +4 -1
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/source-and-instance.md +27 -2
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/where-agents-run.md +23 -1
- 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_env.py +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.59.0 (2026-11-03)
|
|
4
|
+
|
|
5
|
+
Portable from day 0 (FAA-191, RM-36): on top of 0.58.0's source and instance, every new agent gets a data home, a
|
|
6
|
+
data kind and an uptime category, and a new private agent a `LICENSE` naming its copyright holder, from its first commit, and runs the transfer
|
|
7
|
+
audit at every release until the contract's export (CT-194) replaces it.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- creating-fabric-agents' intake grill asks three more rows: **Does it run around the clock?** (uptime category A, a
|
|
12
|
+
cloud host from the first release, Heroku unless a reason names another, from the cloud Fabric-server template once
|
|
13
|
+
its repository exists; or B, a local service only), **Whose data does it keep?** (kind U, data of people outside the
|
|
14
|
+
owner's team, never in the source, a copy or its tests; or O; in doubt U) and **Who holds the copyright?**
|
|
15
|
+
- Step 2 gives the data a home of its own, `<agent>-data` (a folder beside the checkout or a private repository of
|
|
16
|
+
that name), and the README names the data kind and the uptime category; an agent someone builds for themselves gets
|
|
17
|
+
a `LICENSE` naming the holder (all rights reserved unless the owner gives other terms).
|
|
18
|
+
- Step 5: every release runs `fabric_source_check.py check` as the transfer audit, in Git mode on the checkout and
|
|
19
|
+
with `--every-file` on a clean copy of what Git would commit (building-fabric-services' `references/package.md`).
|
|
20
|
+
references/source-and-instance.md adds why never the checkout (its ignored configuration and dependency folders
|
|
21
|
+
`--every-file` reads too), and that a `LICENSE` whose holder is on the owner's list is named in
|
|
22
|
+
`.fabric-source-ignore`, since authorship travels with the source.
|
|
23
|
+
- references/source-and-instance.md (both skills): *The data home and its kind*; references/where-agents-run.md:
|
|
24
|
+
*Uptime: A or B* and a checklist line. building-fabric-services' Step 0 answers carry the same (data kind, data
|
|
25
|
+
home, uptime, holder, the audit per release).
|
|
26
|
+
- Scenario evals `portable-from-day-zero` (creating-fabric-agents) and `new-service-names-data-and-uptime`
|
|
27
|
+
(building-fabric-services), a trigger, and `test/test_portable_from_day_zero_prose.py` pinning the prose to them.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- The eval `own-agent-licence-is-the-owners-choice` expects a `LICENSE` naming the holder; still no AGPL or
|
|
32
|
+
commercial licence files unasked. The shared operator-channel reference and building-fabric-services say the same
|
|
33
|
+
for an agent built new, and that the kit files the adapter copies in keep their own licence
|
|
34
|
+
(`AGPL-3.0-only OR LicenseRef-PassionCode-Commercial`); adapting-projects-to-fabric leaves an existing agent's
|
|
35
|
+
licence as it is.
|
|
36
|
+
- where-agents-run.md: Heroku is the default host of an A agent unless it runs in the person's or an organization's
|
|
37
|
+
PassionCode cloud or is sold; an A agent's data lives in a durable store, never the host's own folder (source-and-instance.md's
|
|
38
|
+
data home says the same for a host that does not keep its disk), and on a host with no Fabric hub it answers only
|
|
39
|
+
what reaches its own origin.
|
|
40
|
+
- building-fabric-services' gotchas are shorter (the same rules); `test_fabric_kit` runs its by-path load with `-B`.
|
|
41
|
+
|
|
42
|
+
### Upgrading
|
|
43
|
+
|
|
44
|
+
- Nothing to change for an existing agent: an adapted project keeps its licence, data and release checks as they
|
|
45
|
+
are. A new one answers the three grill rows before its first commit.
|
|
46
|
+
|
|
3
47
|
## 0.58.0 (2026-11-03)
|
|
4
48
|
|
|
5
49
|
Portable agents, part 1 (FAA-188, RM-36): an agent keeps its source apart from its instance from its first commit, and
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/fabric-agent-adapter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
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.
|
|
6
|
+
"version": "0.59.0",
|
|
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.
|
|
8
|
+
version: "0.59.0"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "3830a3353923e20f826d466610e1c479f120bec0"
|
|
11
11
|
---
|
|
@@ -242,7 +242,8 @@ relayed, DEC-0121). An agent with neither stops nor notify events skips this ste
|
|
|
242
242
|
repository standard (`knowledge/repository-standard.md`) from its first commit: the licence files,
|
|
243
243
|
the README quick start verified with a real client, `AGENTS.md` and `CLAUDE.md`, listed in the
|
|
244
244
|
shared reference above. An agent someone builds for themselves is not a PassionCode.ai repository:
|
|
245
|
-
its licence is its owner's choice and none of those files is required of it
|
|
245
|
+
its licence is its owner's choice and none of those files is required of it (an agent built new with
|
|
246
|
+
creating-fabric-agents carries a `LICENSE` naming its holder; an existing one keeps what it has).
|
|
246
247
|
|
|
247
248
|
## Completion format
|
|
248
249
|
|
|
@@ -63,4 +63,7 @@ the project).
|
|
|
63
63
|
org-index `scripts/check_format.py` reports 0 findings for it before it is called done. An agent
|
|
64
64
|
someone builds for themselves is not a PassionCode.ai repository: its licence is its owner's
|
|
65
65
|
choice, nothing about it is published or listed by the organization, and none of these files is
|
|
66
|
-
required of it,
|
|
66
|
+
required of it, except that an agent built new carries a `LICENSE` naming the copyright holder (all rights reserved
|
|
67
|
+
unless the owner gives other terms), as does a new private agent built for a client; files the adapter copies in (the service kit, the dashboard kit) keep their own
|
|
68
|
+
licence, `AGPL-3.0-only OR LicenseRef-PassionCode-Commercial` ([COMMERCIAL-LICENSE.md](https://github.com/passioncode-ai/fabric-agent-adapter/blob/main/COMMERCIAL-LICENSE.md)).
|
|
69
|
+
The verified MCP quick start is still how anyone learns to drive it.
|
|
@@ -13,6 +13,7 @@ on it.
|
|
|
13
13
|
## Contents
|
|
14
14
|
|
|
15
15
|
- [The layout](#the-layout)
|
|
16
|
+
- [The data home and its kind](#the-data-home-and-its-kind)
|
|
16
17
|
- [The check](#the-check)
|
|
17
18
|
|
|
18
19
|
## The layout
|
|
@@ -31,7 +32,7 @@ on it.
|
|
|
31
32
|
(an organization's) is a sibling instance, `<id>.<instance>`, never a folder inside the personal one
|
|
32
33
|
(`references/estate-record.md` of that skill).
|
|
33
34
|
- **Ignore the instance in the source**: `.gitignore` names the real configuration (`config/*.json` with
|
|
34
|
-
`!config/*.example.json`), an instance folder
|
|
35
|
+
`!config/*.example.json`), an instance folder an existing project still keeps inside the checkout, and what running
|
|
35
36
|
the agent leaves (`__pycache__/`, `*.pyc`), which the check would otherwise report as binary in Git mode.
|
|
36
37
|
- **State documents are instance data.** A handoff, a decision log or a backlog about this codebase is source
|
|
37
38
|
documentation; a record of what this installation did (runs, conversations, the owner's notes, a journal) lives in
|
|
@@ -47,6 +48,27 @@ on it.
|
|
|
47
48
|
keeps the scaffold's sentinel, and a person's name or account is never written there. The adapter moves both when the
|
|
48
49
|
contract decides how an instance renames them (FAA-188 part 2).
|
|
49
50
|
|
|
51
|
+
## The data home and its kind
|
|
52
|
+
|
|
53
|
+
- **The data has a home of its own from the first commit: `<agent>-data`.** For an agent that is not a kit service it
|
|
54
|
+
is a folder beside the checkout, never inside it, and `<AGENT>_DATA_DIR` names it (its default is
|
|
55
|
+
`../<agent>-data`); a kit service keeps the kit's folders above. When the owner keeps the data in Git, it goes to a
|
|
56
|
+
separate private repository named `<agent>-data`, never to the source's repository. On a cloud host that does not
|
|
57
|
+
keep its disk across a restart (Heroku and the like, an uptime A agent's default), the data home is a durable store
|
|
58
|
+
the same variable names (a database, an object store, that private repository); the folder and the kit's folders
|
|
59
|
+
serve a machine whose disk persists. A copy of the agent starts with an empty home of its own and never connects
|
|
60
|
+
to the original's.
|
|
61
|
+
- **The README names the kind of the data.** **U**: the agent keeps data of people outside the owner's team
|
|
62
|
+
(messages, support requests, reviews, customers' answers); it never enters the source, a copy or its tests, and the
|
|
63
|
+
source holds only the schema and synthetic fixtures (its real-trace corpus and replay samples live in the data
|
|
64
|
+
home). **O**: it keeps none (a tool or service for other agents, the
|
|
65
|
+
owner's reports, runs and media); its working data still goes to the data home. When in doubt, the kind is U.
|
|
66
|
+
- **Every release runs the transfer audit.** `fabric_source_check.py check <project-root>` in Git mode, and
|
|
67
|
+
`check <clean-copy> --every-file` on a clean copy of what Git would commit (`git ls-files --cached --others
|
|
68
|
+
--exclude-standard`, as building-fabric-services' `references/package.md` makes it; never the checkout itself, whose ignored
|
|
69
|
+
configuration and dependency folders `--every-file` reads too), each exit 0, with the owner's list or its absence recorded, until the contract's export (CT-194)
|
|
70
|
+
replaces it.
|
|
71
|
+
|
|
50
72
|
## The check
|
|
51
73
|
|
|
52
74
|
`fabric_source_check.py check` reads the files the source would carry (what Git would commit: tracked files and
|
|
@@ -124,7 +146,10 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/fabric_source_ch
|
|
|
124
146
|
repository is not read; `--every-file` and a folder outside Git read its files, its `.git` left out. An exception line (`!`) is refused, since what it would
|
|
125
147
|
bring back would go unread. Name the files, or a folder that holds
|
|
126
148
|
only synthetic vectors, never a whole source folder (a nested repository checked in its own tree is the one
|
|
127
|
-
exception), and say why on the line above.
|
|
149
|
+
exception), and say why on the line above. The `LICENSE` is the other: its copyright line names the holder, which is
|
|
150
|
+
authorship and travels with the source, so when the holder is on the owner's list the licence file is named in the ignore
|
|
151
|
+
file by its own path (`LICENSE`, `LICENSE.md`) with that reason (`# the copyright holder is authorship and travels with the source`); no other file of the
|
|
152
|
+
owner's is. A file `pack` refuses by its name cannot ship in a package: a public
|
|
128
153
|
certificate is renamed `*.crt`; a project `.npmrc` that holds no credential may be named in the ignore file, with
|
|
129
154
|
that reason, for the source check (the line then hides whatever is added to it later, so keep it credential-free),
|
|
130
155
|
and `pack` still refuses it, so a package is made from a copy without it (its
|
|
@@ -14,7 +14,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
14
14
|
compatibility: Python 3.9+ or Node.js 20+ for the kits (Node.js 22+ for a Linux service's instance lock); 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.
|
|
15
15
|
metadata:
|
|
16
16
|
author: PassionCode.ai
|
|
17
|
-
version: "0.
|
|
17
|
+
version: "0.59.0"
|
|
18
18
|
contract-version: "0.1.0"
|
|
19
19
|
extension: "fabric-service/0.1"
|
|
20
20
|
extension-commit: "3830a3353923e20f826d466610e1c479f120bec0"
|
|
@@ -63,6 +63,7 @@ Answer before writing code, and record the answers in the project README:
|
|
|
63
63
|
| Port | one number; run the claim check below before choosing it |
|
|
64
64
|
| Who calls it | the named agents or people, and through which surface (Step 1) |
|
|
65
65
|
| What it stores | the store, where it lives (Step 2, rule 5), and what survives uninstall |
|
|
66
|
+
| Data and uptime | kind U or O, kit folders, a durable store or `<id>-data`, uptime A or B; a new agent's `LICENSE` holder, transfer audit per release (creating-fabric-agents) |
|
|
66
67
|
| What it tells the operator | the events worth a notification (Step 5) |
|
|
67
68
|
|
|
68
69
|
## Step 1: choose the surfaces
|
|
@@ -353,9 +354,9 @@ first commit:
|
|
|
353
354
|
|
|
354
355
|
Whoever owns the repository, an agent with a page gets the dashboard rule block in its `AGENTS.md`
|
|
355
356
|
(below). org-index `scripts/check_format.py` reports 0 findings for it before it is called done. **An agent
|
|
356
|
-
someone builds for themselves is not a PassionCode.ai repository:** its licence is its owner's
|
|
357
|
-
|
|
358
|
-
|
|
357
|
+
someone builds for themselves is not a PassionCode.ai repository:** its licence is its owner's choice, the organization
|
|
358
|
+
publishes and lists nothing about it, of these files one built new needs only a `LICENSE` naming its copyright holder (copied kit files keep
|
|
359
|
+
theirs), and the verified MCP quick start teaches anyone to drive it.
|
|
359
360
|
|
|
360
361
|
## Online services: the remote placement
|
|
361
362
|
|
|
@@ -418,20 +419,16 @@ this estate needs.
|
|
|
418
419
|
## Gotchas
|
|
419
420
|
|
|
420
421
|
- `lsof` shows `*:<port>` or `0.0.0.0` → the bind is wrong even if the Host check works.
|
|
421
|
-
- A health probe that only checks HTTP 200 accepts any program on the port
|
|
422
|
-
`service.id` and `service.instance
|
|
423
|
-
|
|
424
|
-
- `launchctl bootstrap` right after `bootout` fails with I/O error 5 until the unload
|
|
425
|
-
finishes; wait, then retry.
|
|
422
|
+
- A health probe that only checks HTTP 200 accepts any program on the port: compare
|
|
423
|
+
`service.id` and `service.instance`.
|
|
424
|
+
- `launchctl bootstrap` right after `bootout` fails with I/O error 5: wait for the unload, then retry.
|
|
426
425
|
- Under launchd `PATH` is bare. Pin the interpreter by absolute path; set `PATH`
|
|
427
426
|
explicitly in the plist; never copy the whole shell environment into it.
|
|
428
|
-
- A plist pointing at a worktree or
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
- `logging.basicConfig` called twice: the second call is a no-op, so a server's own
|
|
434
|
-
log file stays empty. Configure logging once, in the entry point.
|
|
427
|
+
- A plist pointing at a worktree or checkout breaks when it moves: point it at a release.
|
|
428
|
+
- `http.server.HTTPServer` resolves its FQDN between `bind()` and `listen()`: with a slow
|
|
429
|
+
resolver (a macOS CI runner, a Mac offline) the port is bound but silent. Use `fs.LoopbackHTTPServer`.
|
|
430
|
+
- `logging.basicConfig` called twice: the second is a no-op, the server's log file
|
|
431
|
+
stays empty. Configure logging once, in the entry point.
|
|
435
432
|
- Hand-made `.plist.bak` files in `~/Library/LaunchAgents` are never cleaned up; keep
|
|
436
433
|
backups elsewhere.
|
|
437
434
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fabric-service-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
4
4
|
"about": "The service kit's modules in dependency order: a module imports only modules listed before it. Written by fabric_kit.py build; edit the order and layers by hand, never the digests.",
|
|
5
5
|
"python": [
|
|
6
6
|
{
|
|
@@ -4408,6 +4408,96 @@
|
|
|
4408
4408
|
"fabric-openrouter.mjs": "6041f3ab30f516658e1dbab4897a651cc8509b2136cfa8e769802c6b40ec2f35",
|
|
4409
4409
|
"fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
|
|
4410
4410
|
"share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
|
|
4411
|
+
},
|
|
4412
|
+
"0.59.0": {
|
|
4413
|
+
"fabric_jsvalue.py": "12888a2c934a885d35999ac9782eaedc8d04946d9775213344a235a8814d3d28",
|
|
4414
|
+
"fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
|
|
4415
|
+
"fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
|
|
4416
|
+
"fabric_secrets.py": "1d0191f0ec108fdc68345056b8c574b1f691509d1c353e41d98bfd58a59e8d3c",
|
|
4417
|
+
"fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
|
|
4418
|
+
"fabric_base.py": "f62bcc2ed9912660fa875d27a09f60867260cc4925f79873501fd9620be59611",
|
|
4419
|
+
"fabric_platform.py": "a9350dff55ef0fb3a23cdb4d0320a15868b15a8deb10d2eb74d72c58740c284b",
|
|
4420
|
+
"fabric_paths.py": "8a1ee742f80f436e9f28c61b4f049a9545de2a9e0d66bfc61faa6ee5d1ba3734",
|
|
4421
|
+
"fabric_estate_rules.py": "8b36a7f4108d9c2b1fb38c8bff344778c807bed631a99b4a563ecb0a49c10b1c",
|
|
4422
|
+
"fabric_estate.py": "b3cd56dcb86e04d252980322ac8054da1aaef24ac64690f7aa80e7c765ee6f60",
|
|
4423
|
+
"fabric_mandate.py": "050c43d0166a7dfba82e29c4e978f05c364cf6da06d0a781bd023a566777c17b",
|
|
4424
|
+
"fabric_delegation.py": "716f0ff7ac01095f54b24970beac1962128e8ff33026b243fc0467876142ab03",
|
|
4425
|
+
"fabric_share.py": "da36a466426fc29dd7dd40013167f3959a18375f8fedd228bf64f298cec1040c",
|
|
4426
|
+
"fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
|
|
4427
|
+
"fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
|
|
4428
|
+
"fabric_package.py": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c",
|
|
4429
|
+
"fabric_protocols.py": "42529a7df4d753544d2e37a18ec81266d6e1e80477cb8558a3ab521416d45791",
|
|
4430
|
+
"fabric_actions.py": "ae21d1199614c4f74d1dcd1e0a87107a9d52434cd9e2d64aa24a7b1e196fb723",
|
|
4431
|
+
"fabric_connections.py": "7de55cb7d808f756d650effabfaa12027d40a5bd5d2f6d448c32969d47529ecb",
|
|
4432
|
+
"fabric_a2a.py": "8b01502131215bb4de1c01866187c56e99b791543923ed8577535573db33b919",
|
|
4433
|
+
"fabric_page_links.py": "1b57ea573c550e2f90d1ec3edcc655917ceaa0db9dd1635fccf422ec3024d25e",
|
|
4434
|
+
"fabric_lock.py": "ba2399d2137c7a7791b7133b9db9cca36693f4eb7e30955b25a75ade814e95ba",
|
|
4435
|
+
"fabric_usage.py": "5cc2e03ccc5b06e81987ed7bc3eead7a7e6cbf1a7cb8e05c6c64315eed9d91b6",
|
|
4436
|
+
"fabric_backups.py": "1f3f0d7ecf361b29e9101e07f1c53e5dc304d598bf26fd59ec89f16b9fed2420",
|
|
4437
|
+
"fabric_descriptor.py": "a6d7a4a38186f7ef527d16218bbf96e39e255f9547be668adcfbec063dabb7ed",
|
|
4438
|
+
"fabric_context.py": "6ae311ddc7217a4aff915e7ce2646486931acd128462b7bebe4a52bbb5fbb6c7",
|
|
4439
|
+
"fabric_auth.py": "71115d18c67b7b806cb57b64b77e01ad97fc0e63e6f49ee850f778123617d905",
|
|
4440
|
+
"fabric_events.py": "cd94b186e2a8f8cb4ad2b6bd44d83ec5021933075e28c5d655f387f16dff42b8",
|
|
4441
|
+
"fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
|
|
4442
|
+
"fabric_supervisors.py": "3c5b2e8c310738720b1c1b779be4710e90251013d9be4c68f9952edc0bf55d5f",
|
|
4443
|
+
"fabric_service.py": "a2e813469a47d4d3eea996628635c8903007498bdb6a1ae032a7a5ce6f49fe2f",
|
|
4444
|
+
"fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
|
|
4445
|
+
"fabric_interop_rules.py": "82c079a4d9421ea2cd10c1dfa8e1c447b80d5e0dcc8d52d52415bf028e34c91e",
|
|
4446
|
+
"fabric_interop.py": "8f7e43bf01fa5e969d7d819f4b0188b9acfd846f6f85a37ea139e550d61e4e6c",
|
|
4447
|
+
"fabric_hub.py": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a",
|
|
4448
|
+
"fabric_board_shapes.py": "0a0e8d3d40e33dfd8c457aedb85330b2ff25f8c49a33eb6cbd5a5cc8a5007f7e",
|
|
4449
|
+
"fabric_board_link.py": "e8d2310e5f53c75e4bf642c3d980b2faba692731eaf56ec245cea05446e38bef",
|
|
4450
|
+
"fabric_board_slots.py": "a3c705cded822103703a6c2d734bcd505fcd1d6c0293150c77dfa266fd416d53",
|
|
4451
|
+
"fabric_board_session.py": "9032c04fbafb63fd93809b494518aaa039215abef973ad181d960350beb56a9f",
|
|
4452
|
+
"fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
|
|
4453
|
+
"fabric_board.py": "34c1200860040aa61cdd35f911f70d34d64b4a5cd91f892328d1169e4a89d8cd",
|
|
4454
|
+
"fabric_http.py": "80e22ae0bba91de13a94d64b595108b39c58f16f7b4137f3a48bdd9503f424fe",
|
|
4455
|
+
"fabric_openrouter.py": "d06a40f83f2fb8bd441ab3485ae882f1fbdd9cd7a9c1ec175eb47cb8ae2cce81",
|
|
4456
|
+
"fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
|
|
4457
|
+
"fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
|
|
4458
|
+
"fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
|
|
4459
|
+
"fabric-secrets.mjs": "6ad8ab18ac899ecc2384e8ec6a3fb689b92be3b9a5ce3a59b92a37d52da5d766",
|
|
4460
|
+
"fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
|
|
4461
|
+
"fabric-base.mjs": "7804b2df7715dbbf9702a9b61b6b8cef2110f9a52b04cabd8fb0a66458d87512",
|
|
4462
|
+
"fabric-platform.mjs": "a8119d95ebba4d589a9e401f5d6fc8dda62d59d44e4c1ff811d97fac3771ac0c",
|
|
4463
|
+
"fabric-paths.mjs": "aa630d611e748a899e7043480f4a4e46b444f2e15ff945f30c2fbef21c1ceea5",
|
|
4464
|
+
"fabric-estate-rules.mjs": "7476be71174aa5b1026134f2b335abf647feaa55584e2f9de8618e3054aa8e1e",
|
|
4465
|
+
"fabric-estate.mjs": "e8a2e62d2313121e6cb502f6e6abad94d1d546a44b4d9b3ce2be29e7808e8cf3",
|
|
4466
|
+
"fabric-mandate.mjs": "deaab2bfb929d1bd35ae1bad71e7b9ad9902cc23b8eb51819ed592fd80eddf95",
|
|
4467
|
+
"fabric-delegation.mjs": "04eaf6cd1786d4309a253a27dbdb05e27b408cb511aa41b1633a96634b775e65",
|
|
4468
|
+
"fabric-share.mjs": "bfb26581c21ad984c2a337da02429f9f3a165cc582f8ba48de4d3dfb7d163a59",
|
|
4469
|
+
"fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
|
|
4470
|
+
"fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
|
|
4471
|
+
"fabric-package.mjs": "13913ea6d12056c3a31b8222b6c4aab8395941fe519913692e1a06d8672e1c88",
|
|
4472
|
+
"fabric-protocols.mjs": "5fd8765fdd3e507cc85c108492682bf5cbb4ae08873245c50374fb01d33c75e4",
|
|
4473
|
+
"fabric-actions.mjs": "06e42f5e24c96311d5417d0d1effa93479ef7128a7ab139903b2bcf59253f6be",
|
|
4474
|
+
"fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
|
|
4475
|
+
"fabric-a2a.mjs": "51b72fe1d80649d659fcad3a8f96370db3476c4a7b30cbabd8522c138be69346",
|
|
4476
|
+
"fabric-page-links.mjs": "a8834926e9d4bbf7c4857f551451d2ebf6ac8873bbccaaf89c5e30cf45b17ee6",
|
|
4477
|
+
"fabric-lock.mjs": "ac219ab0a326d5c43c7c4c255e0c3843d4794de795a60e3af661e7d5350ea052",
|
|
4478
|
+
"fabric-usage.mjs": "1c4d18004639409624ac3516a02f2b60bbf55abdb612e9a96c37e83666eb87a7",
|
|
4479
|
+
"fabric-backups.mjs": "cfd8c9085e3d597a783099c2bd2ffe2f3faa0daaadab46dedd30523894cfeb06",
|
|
4480
|
+
"fabric-descriptor.mjs": "243bbce42989f67c4c5ec6b7659e201b3f9a1c08c71d429d88ec934d870f5104",
|
|
4481
|
+
"fabric-context.mjs": "1112d695e872f9825cbc94f08484974bff3880087bc29b8be59f885f03e8f7be",
|
|
4482
|
+
"fabric-auth.mjs": "782c2aa732f8320f604194660117640a7ea145e12b8155c04e88cef7c516a5b3",
|
|
4483
|
+
"fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
|
|
4484
|
+
"fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
|
|
4485
|
+
"fabric-supervisors.mjs": "d45c38de0cb3ed85e083496c2d3c51dab004454accdd87f4762a512a6d442573",
|
|
4486
|
+
"fabric-service.mjs": "6aa673657427211b491a9b63f94b9847a7e6aa3ee1b7353e1af11f46469803a3",
|
|
4487
|
+
"fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
|
|
4488
|
+
"fabric-interop-rules.mjs": "e4f8b133138e27353a7976c0360bd1653c90daed43b3f843f85a19f14f5e9221",
|
|
4489
|
+
"fabric-interop.mjs": "ee7e6d32be1f42e6d21a943b8886652352408c49c6404d9749b8a02dc3901e92",
|
|
4490
|
+
"fabric-hub.mjs": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070",
|
|
4491
|
+
"fabric-board-shapes.mjs": "c1db7b7bd0d58d82bb6d8dfbc3cd1547a256a333052d367e82ff1b3edf2804d7",
|
|
4492
|
+
"fabric-board-link.mjs": "b1ac329b65b679193b94b81fe735922e14427ed540ba910b1a815ce3447e3220",
|
|
4493
|
+
"fabric-board-slots.mjs": "43eb7ceb6c62989a4eb4b2089d1808e2c3cf8f873fcf9216fcb4c285e5b39eb4",
|
|
4494
|
+
"fabric-board-session.mjs": "04aa920b24a379157c55ebe3de516eb8b46bd0b0db50e4b883528d4ede7ed978",
|
|
4495
|
+
"fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
|
|
4496
|
+
"fabric-board.mjs": "0d75c3e27a0b791bdbc35b2e93b3299e5831d3ab3003ce441e6268397e32b448",
|
|
4497
|
+
"fabric-http.mjs": "9f899829073470b9c2b449605a9371b773848eec4e3a0122ed4ccde5eddcdb4b",
|
|
4498
|
+
"fabric-openrouter.mjs": "6041f3ab30f516658e1dbab4897a651cc8509b2136cfa8e769802c6b40ec2f35",
|
|
4499
|
+
"fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
|
|
4500
|
+
"share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
|
|
4411
4501
|
}
|
|
4412
4502
|
},
|
|
4413
4503
|
"data": {
|
|
@@ -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.
|
|
8
|
+
version: "0.59.0"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "3830a3353923e20f826d466610e1c479f120bec0"
|
|
11
11
|
---
|
|
@@ -57,6 +57,9 @@ No file is created until every row has an answer. An answer of "later" fails the
|
|
|
57
57
|
| **Which profile?** | `mcp` when Fabric owns planning and retries and the capability has a schema; `a2a` when the provider owns its task lifecycle end to end; `local-runner` when it is a terminal agent Fabric drives. When unsure, the sibling skill's profile-selection reference is the decision record |
|
|
58
58
|
| **What effects?** | declare anything money-, deletion-, or publication-adjacent now; the host's floor and grants are designed against these declarations, and one discovered late invalidates the admission |
|
|
59
59
|
| **Where does it run, for whom?** | this machine, the person's cloud or an organization's, and in which contexts (`personal`, `org:<id>`): one instance per context, its secrets, spend and journal never crossing into another. Record which capabilities need the person's machine and what they answer when it is off (references/where-agents-run.md) |
|
|
60
|
+
| **Does it run around the clock?** | the uptime category, decided now: **A** when a capability must answer while the owner's machine is off or asleep (a schedule, a chat, callers outside the machine): the agent gets a cloud host from its first release, Heroku unless a reason names another (the person's or an organization's cloud, or PassionCode's for a paid agent), built as an online service (building-fabric-services, the remote placement) and started from the cloud Fabric-server template once that template's repository exists; **B** when nothing needs it then: a local service only, no cloud, reading an A agent's data through that agent's MCP or API. The README names the category (references/where-agents-run.md) |
|
|
61
|
+
| **Whose data does it keep?** | the kind of its data, named in the README: **U** when it keeps data of people outside the owner's team (messages, support requests, reviews, customers' answers), which never enters the source, a copy of it or its tests: the source holds the schema and synthetic fixtures, and a copy starts with an empty store of its own; **O** when it keeps none (a tool or service for other agents, the owner's reports, runs and media). In doubt, U. Either way the data lives in `<agent>-data` (a kit service: the kit's folders; on a cloud host: a durable store), apart from the source, from the first commit (references/source-and-instance.md) |
|
|
62
|
+
| **Who holds the copyright?** | the holder the agent's `LICENSE` names: a new private agent (built for its owner or for a client) gets a `LICENSE` naming that holder in its first commit, all rights reserved unless the owner gives other terms; a public product keeps its own licence (a PassionCode.ai repository: the organization's, step 2) |
|
|
60
63
|
| **Which models?** | per lane (planning, replies, volume work, media): a primary, a fallback of another vendor, an open-vendor model where it reads what users send, the input kinds each reads, declared as classes in the profile (references/models-and-providers.md) |
|
|
61
64
|
| **Who pays?** | one key per agent and context with its own ceiling, from the estate's key manager, read from the environment; checked before every call; a personal key never pays for an organization |
|
|
62
65
|
| **How does it learn?** | decisions recorded with reasons, one trace per turn, every failure a planted fixture first, history replayed, learnings proposed and never self-approved (references/orchestration-and-learning.md) |
|
|
@@ -111,8 +114,11 @@ are its seed because a source project's recorded failures count as production.
|
|
|
111
114
|
repository standard (`knowledge/repository-standard.md`) from its first commit: the licence files,
|
|
112
115
|
the README quick start verified with a real client, `AGENTS.md` and `CLAUDE.md`, as
|
|
113
116
|
[the operator channel and the repository standard](references/operator-channel-and-repository.md)
|
|
114
|
-
lists them. An agent someone builds for themselves is not a PassionCode.ai repository: its licence
|
|
115
|
-
is its owner's choice and none of those files is required of it
|
|
117
|
+
lists them. An agent someone builds for themselves, or a private agent built for a client, is not a PassionCode.ai repository: its licence
|
|
118
|
+
is its owner's choice and none of those files is required of it, but its first commit carries a `LICENSE` naming
|
|
119
|
+
the copyright holder the grill recorded (all rights reserved unless the owner gives other terms); it covers the
|
|
120
|
+
holder's own files, and the kit files the adapter copies in keep their own licence (AGPL-3.0-only OR
|
|
121
|
+
LicenseRef-PassionCode-Commercial).
|
|
116
122
|
|
|
117
123
|
**Every credential the agent uses is read by name, never held as a value**, from its first commit:
|
|
118
124
|
the README's Configure section lists key NAMES. With Project Observatory installed, the agent finds
|
|
@@ -127,7 +133,9 @@ never their values.
|
|
|
127
133
|
**The source stays apart from the instance**, from the first commit: instance values (the
|
|
128
134
|
repository address of the owner's account, folders, the owner, accounts, hosts) live in a configuration outside the repository, read through a
|
|
129
135
|
named variable with a neutral default and a committed `*.example`; records, logs and state documents live in the
|
|
130
|
-
instance folder; fixtures use neutral ids.
|
|
136
|
+
instance folder; fixtures use neutral ids. Its data has a home of its own from the same commit, the one the grill recorded: `<agent>-data` (a folder beside the
|
|
137
|
+
checkout, or a private repository of that name; a kit service: the kit's folders; on a cloud host: a durable store), and the README names the data kind (U or O) and the uptime
|
|
138
|
+
category (A or B) from the grill. Load [the source and the instance](references/source-and-instance.md). The
|
|
131
139
|
sibling's `scripts/fabric_source_check.py check <project-root>` finds instance data in the tree without repeating it;
|
|
132
140
|
run it with the owner's list of their own strings, or record that none was given (the owner's own home name, when it is neutral, has one or two letters, or holds a space, `.`, `_`, `-` or `'`, is declared there with `home: <name>` first; a container's, a cloud image's or a CI runner's user that only the image uses, such as `node` or `vscode`, is never declared); the skeleton is done when it exits 0 and the owner has reviewed it (a floor, not a secret scanner; without the sibling or Python 3.9+, record the check as NOT_RUN, as in step 3). Handing the source over stays the owner's act.
|
|
133
141
|
|
|
@@ -172,7 +180,8 @@ reference). An agent that is not a service is announced with a provider entry
|
|
|
172
180
|
If the agent keeps running on the operator's computer (it answers other agents, runs
|
|
173
181
|
long jobs or shows a dashboard), build it as a service with the sibling skill
|
|
174
182
|
`building-fabric-services`: its instance lock, launchd plist, descriptor, well-known
|
|
175
|
-
document and events feed are part of this step, not a later retrofit.
|
|
183
|
+
document and events feed are part of this step, not a later retrofit. An uptime A agent is built with the same
|
|
184
|
+
skill as an online service (its remote placement: the https origin, keys as the platform's secrets). If that skill is
|
|
176
185
|
absent, apply the `fabric-service/0.1` rules from the pinned contract's
|
|
177
186
|
`docs/specification/service.md` by hand and mark its probe `NOT_RUN`.
|
|
178
187
|
|
|
@@ -190,8 +199,11 @@ lets the output decide what counts as success.
|
|
|
190
199
|
|
|
191
200
|
Run the sibling skill's `check` (structural, then exact when the contract checkout is
|
|
192
201
|
available) and complete `fabric/FABRIC-CONFORMANCE.md` with dated receipts, exactly as
|
|
193
|
-
its workflow steps 5–7 prescribe, and run its `fabric_source_check.py check` again (exit 0)
|
|
194
|
-
|
|
202
|
+
its workflow steps 5–7 prescribe, and run its `fabric_source_check.py check` again (exit 0). Every release of the
|
|
203
|
+
agent runs it too, in Git mode on the checkout and with `--every-file` on the clean copy a transfer would carry (what
|
|
204
|
+
Git would commit, as building-fabric-services' `references/package.md` makes it), as the transfer audit (each exit 0, with the owner's list or
|
|
205
|
+
its absence recorded) until the contract's export (CT-194) replaces it; this skill adds no second verification path
|
|
206
|
+
on purpose. Then record one expectation the report must carry:
|
|
195
207
|
|
|
196
208
|
> When a Fabric host admits this provider, it enters under a **canary binding** (a
|
|
197
209
|
> checker on its output and a budget cap), regardless of who wrote it. Unsupervised
|
|
@@ -63,4 +63,7 @@ the project).
|
|
|
63
63
|
org-index `scripts/check_format.py` reports 0 findings for it before it is called done. An agent
|
|
64
64
|
someone builds for themselves is not a PassionCode.ai repository: its licence is its owner's
|
|
65
65
|
choice, nothing about it is published or listed by the organization, and none of these files is
|
|
66
|
-
required of it,
|
|
66
|
+
required of it, except that an agent built new carries a `LICENSE` naming the copyright holder (all rights reserved
|
|
67
|
+
unless the owner gives other terms), as does a new private agent built for a client; files the adapter copies in (the service kit, the dashboard kit) keep their own
|
|
68
|
+
licence, `AGPL-3.0-only OR LicenseRef-PassionCode-Commercial` ([COMMERCIAL-LICENSE.md](https://github.com/passioncode-ai/fabric-agent-adapter/blob/main/COMMERCIAL-LICENSE.md)).
|
|
69
|
+
The verified MCP quick start is still how anyone learns to drive it.
|
package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/source-and-instance.md
CHANGED
|
@@ -13,6 +13,7 @@ on it.
|
|
|
13
13
|
## Contents
|
|
14
14
|
|
|
15
15
|
- [The layout](#the-layout)
|
|
16
|
+
- [The data home and its kind](#the-data-home-and-its-kind)
|
|
16
17
|
- [The check](#the-check)
|
|
17
18
|
|
|
18
19
|
## The layout
|
|
@@ -31,7 +32,7 @@ on it.
|
|
|
31
32
|
(an organization's) is a sibling instance, `<id>.<instance>`, never a folder inside the personal one
|
|
32
33
|
(`references/estate-record.md` of that skill).
|
|
33
34
|
- **Ignore the instance in the source**: `.gitignore` names the real configuration (`config/*.json` with
|
|
34
|
-
`!config/*.example.json`), an instance folder
|
|
35
|
+
`!config/*.example.json`), an instance folder an existing project still keeps inside the checkout, and what running
|
|
35
36
|
the agent leaves (`__pycache__/`, `*.pyc`), which the check would otherwise report as binary in Git mode.
|
|
36
37
|
- **State documents are instance data.** A handoff, a decision log or a backlog about this codebase is source
|
|
37
38
|
documentation; a record of what this installation did (runs, conversations, the owner's notes, a journal) lives in
|
|
@@ -47,6 +48,27 @@ on it.
|
|
|
47
48
|
keeps the scaffold's sentinel, and a person's name or account is never written there. The adapter moves both when the
|
|
48
49
|
contract decides how an instance renames them (FAA-188 part 2).
|
|
49
50
|
|
|
51
|
+
## The data home and its kind
|
|
52
|
+
|
|
53
|
+
- **The data has a home of its own from the first commit: `<agent>-data`.** For an agent that is not a kit service it
|
|
54
|
+
is a folder beside the checkout, never inside it, and `<AGENT>_DATA_DIR` names it (its default is
|
|
55
|
+
`../<agent>-data`); a kit service keeps the kit's folders above. When the owner keeps the data in Git, it goes to a
|
|
56
|
+
separate private repository named `<agent>-data`, never to the source's repository. On a cloud host that does not
|
|
57
|
+
keep its disk across a restart (Heroku and the like, an uptime A agent's default), the data home is a durable store
|
|
58
|
+
the same variable names (a database, an object store, that private repository); the folder and the kit's folders
|
|
59
|
+
serve a machine whose disk persists. A copy of the agent starts with an empty home of its own and never connects
|
|
60
|
+
to the original's.
|
|
61
|
+
- **The README names the kind of the data.** **U**: the agent keeps data of people outside the owner's team
|
|
62
|
+
(messages, support requests, reviews, customers' answers); it never enters the source, a copy or its tests, and the
|
|
63
|
+
source holds only the schema and synthetic fixtures (its real-trace corpus and replay samples live in the data
|
|
64
|
+
home). **O**: it keeps none (a tool or service for other agents, the
|
|
65
|
+
owner's reports, runs and media); its working data still goes to the data home. When in doubt, the kind is U.
|
|
66
|
+
- **Every release runs the transfer audit.** `fabric_source_check.py check <project-root>` in Git mode, and
|
|
67
|
+
`check <clean-copy> --every-file` on a clean copy of what Git would commit (`git ls-files --cached --others
|
|
68
|
+
--exclude-standard`, as building-fabric-services' `references/package.md` makes it; never the checkout itself, whose ignored
|
|
69
|
+
configuration and dependency folders `--every-file` reads too), each exit 0, with the owner's list or its absence recorded, until the contract's export (CT-194)
|
|
70
|
+
replaces it.
|
|
71
|
+
|
|
50
72
|
## The check
|
|
51
73
|
|
|
52
74
|
`fabric_source_check.py check` reads the files the source would carry (what Git would commit: tracked files and
|
|
@@ -124,7 +146,10 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/fabric_source_ch
|
|
|
124
146
|
repository is not read; `--every-file` and a folder outside Git read its files, its `.git` left out. An exception line (`!`) is refused, since what it would
|
|
125
147
|
bring back would go unread. Name the files, or a folder that holds
|
|
126
148
|
only synthetic vectors, never a whole source folder (a nested repository checked in its own tree is the one
|
|
127
|
-
exception), and say why on the line above.
|
|
149
|
+
exception), and say why on the line above. The `LICENSE` is the other: its copyright line names the holder, which is
|
|
150
|
+
authorship and travels with the source, so when the holder is on the owner's list the licence file is named in the ignore
|
|
151
|
+
file by its own path (`LICENSE`, `LICENSE.md`) with that reason (`# the copyright holder is authorship and travels with the source`); no other file of the
|
|
152
|
+
owner's is. A file `pack` refuses by its name cannot ship in a package: a public
|
|
128
153
|
certificate is renamed `*.crt`; a project `.npmrc` that holds no credential may be named in the ignore file, with
|
|
129
154
|
that reason, for the source check (the line then hides whatever is added to it later, so keep it credential-free),
|
|
130
155
|
and `pack` still refuses it, so a package is made from a copy without it (its
|
package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/where-agents-run.md
CHANGED
|
@@ -16,6 +16,7 @@ The normative rules are the Fabric Agent Contract's, at the commit this plugin p
|
|
|
16
16
|
- [Connecting a machine or a cloud to the estate](#connecting-a-machine-or-a-cloud-to-the-estate)
|
|
17
17
|
- [Sharing an agent into an organization](#sharing-an-agent-into-an-organization)
|
|
18
18
|
- [Running while the laptop is closed](#running-while-the-laptop-is-closed)
|
|
19
|
+
- [Uptime: A or B](#uptime-a-or-b)
|
|
19
20
|
- [Selling an agent](#selling-an-agent)
|
|
20
21
|
- [The checklist](#the-checklist)
|
|
21
22
|
|
|
@@ -85,13 +86,33 @@ checked, and removes the instance from the next revision.
|
|
|
85
86
|
## Running while the laptop is closed
|
|
86
87
|
|
|
87
88
|
A cloud agent keeps working with the laptop closed only if everything it needs is in the cloud: its worker, its
|
|
88
|
-
secrets, its data, and a hub that can admit
|
|
89
|
+
secrets, its data, and, for the calls Fabric admits, a hub that can admit them. The local Fabric hub is not a cloud hub. Design for it:
|
|
89
90
|
|
|
90
91
|
- Declare what each capability needs and where it is; a capability that needs the person's machine reports
|
|
91
92
|
`pending` or `unavailable` instead of pretending, and queues within a deadline or declines.
|
|
92
93
|
- Never charge for work it cannot deliver on the promised terms.
|
|
93
94
|
- A test that passed on fixtures says nothing about uptime; measure the installed agent in its cloud.
|
|
94
95
|
|
|
96
|
+
## Uptime: A or B
|
|
97
|
+
|
|
98
|
+
Every new agent is given an uptime category on its first day, and the README names it:
|
|
99
|
+
|
|
100
|
+
- **A, around the clock.** A capability must answer while the owner's machine is off or asleep: a schedule, a chat,
|
|
101
|
+
callers outside the machine. A cloud host is required from the first release; Heroku is the default, another host
|
|
102
|
+
only when a reason names it: an instance in the person's PassionCode cloud or an organization's cloud runs there
|
|
103
|
+
(the places above), and a paid agent stays in PassionCode's cloud (selling an agent, below). On a host with no
|
|
104
|
+
Fabric hub it answers what reaches its own origin (its schedule, its chat, its API); a call Fabric admits needs a
|
|
105
|
+
cloud hub, as running while the laptop is closed says. The agent is an online service (building-fabric-services, the remote placement), often
|
|
106
|
+
alongside its local instance, and starts from the cloud Fabric-server template once that template's repository
|
|
107
|
+
exists. Its data lives where the cloud reaches it, in a durable store (a database, an object store, the private
|
|
108
|
+
`<agent>-data` repository), never the host's own folder, which a platform such as Heroku does not keep across a
|
|
109
|
+
restart.
|
|
110
|
+
- **B, local only.** Nothing needs it while the machine sleeps: a local service and no cloud. It reads an A agent's
|
|
111
|
+
data through that agent's MCP or API, never from its store.
|
|
112
|
+
|
|
113
|
+
A B agent that gains a capability that must answer around the clock becomes A for that capability; record the change
|
|
114
|
+
and move only that capability to the cloud.
|
|
115
|
+
|
|
95
116
|
## Selling an agent
|
|
96
117
|
|
|
97
118
|
- **A paid agent** runs in PassionCode's cloud inside its developer's organization (`org:<developer>`); each customer
|
|
@@ -108,6 +129,7 @@ secrets, its data, and a hub that can admit calls. The local Fabric hub is not a
|
|
|
108
129
|
- Where does each instance run, and in which context? Write it in the knowledge pack.
|
|
109
130
|
- Does any state, secret, log line or cache key cross contexts? It must not.
|
|
110
131
|
- Which capabilities need the person's machine, and what do they answer when it is off?
|
|
132
|
+
- Which uptime category is it, A (a cloud host from the first release) or B (local only)? The README names it.
|
|
111
133
|
- Who pays for each call (which grant, which key)? The person's personal key never pays for an organization.
|
|
112
134
|
- If it joins machines or applies the estate record: tokens from stdin or a 0600 file only, revisions verified with
|
|
113
135
|
their parent.
|