@passioncode-ai/passioncode 0.2.43 → 0.2.45
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 +17 -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 +5 -4
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/README.md +43 -8
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/support_agent.py +28 -7
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +2 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +22 -7
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +1 -1
- 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-actions.mjs +22 -9
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-delegation.mjs +6 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop-rules.mjs +14 -6
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_actions.py +23 -13
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_delegation.py +6 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py +9 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop_rules.py +16 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +184 -8
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +6 -3
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/agents-that-answer-people.md +139 -0
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +6 -4
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
- package/payload/plugins/passioncode/.claude-plugin/plugin.json +1 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Agents that answer people: what they carry from the first release
|
|
2
|
+
|
|
3
|
+
**Load this when the agent you are building answers people**: private chats, mail, store reviews, group chats, any
|
|
4
|
+
channel where a person asks and the agent writes back. Every item below is a part of the agent, built and tested in its
|
|
5
|
+
first release, not a later improvement. Each comes from the sources below: what the quality standard requires (A1,
|
|
6
|
+
A5), and what an audit of five production agents found working or failing (P1 to P8). The practices are field
|
|
7
|
+
evidence: one estate, five agents, no control; their numbers are that estate's, never a forecast.
|
|
8
|
+
|
|
9
|
+
Sources (public): the support quality standard,
|
|
10
|
+
[`support-quality.md`](https://github.com/ssheleg/agent-stack/blob/28a0303c42038778e2650fc51096e589f4035239/plugins/agent-stack/skills/agent-evals/references/support-quality.md)
|
|
11
|
+
(A1 the record, A5 `support.quality_daily`), and the practices from an audit of five such agents,
|
|
12
|
+
[`support-practices.md`](https://github.com/ssheleg/agent-stack/blob/f882358e3fb9627f6edb20db3981818912a9844c/plugins/agent-stack/skills/agent-evals/references/support-practices.md)
|
|
13
|
+
(P1 to P8), both in the `agent-evals` skill of [ssheleg/agent-stack](https://github.com/ssheleg/agent-stack); the
|
|
14
|
+
practices arrive with [PR #70](https://github.com/ssheleg/agent-stack/pull/70), linked here at its commit until it
|
|
15
|
+
merges. The standard says how such an agent is measured; the practices say what worked and what failed. This page
|
|
16
|
+
lists parts that have a check, and the check that proves each; it leaves to the sources the standard's A2 families and
|
|
17
|
+
per-channel targets, A3 (the rubric), A4 (the judge and its calibration), A6 (answer first, the queue's SLA, a safe
|
|
18
|
+
default) and the rest of its checks that caught real defects, and the practices' other items of P1, P3, P5, P6, P7 and
|
|
19
|
+
P8. Read both sources before you design the reply pipeline. The kit's support-agent recipe (building-fabric-services,
|
|
20
|
+
`recipes/support-agent/`) is one draft-and-check step of such an agent, not the agent: used alone it hands the message
|
|
21
|
+
to a person at the first refusal (the refused draft is not kept), where this page repairs, researches and holds.
|
|
22
|
+
|
|
23
|
+
## Contents
|
|
24
|
+
|
|
25
|
+
- [The record and the daily report](#the-record-and-the-daily-report)
|
|
26
|
+
- [Model lanes](#model-lanes)
|
|
27
|
+
- [Checks before a reply is sent](#checks-before-a-reply-is-sent)
|
|
28
|
+
- [When the check refuses](#when-the-check-refuses)
|
|
29
|
+
- [Hand-offs and promises](#hand-offs-and-promises)
|
|
30
|
+
- [Knowledge and gaps](#knowledge-and-gaps)
|
|
31
|
+
- [Reading the events feed](#reading-the-events-feed)
|
|
32
|
+
- [Checklist](#checklist)
|
|
33
|
+
|
|
34
|
+
## The record and the daily report
|
|
35
|
+
|
|
36
|
+
- **Every inbound message is a turn with a trace id** (A1): the id is on the turn row, on each model call of that turn,
|
|
37
|
+
on its log line and on any copy a person reads. The turn stores its outcome (answered, general guidance, not covered,
|
|
38
|
+
handed off, small talk, limit, error), the hand-off reason and category, the latency, the knowledge revision the
|
|
39
|
+
answer used, and whether the channel accepted the reply. Conversation text stays inside the agent, redacted, for at
|
|
40
|
+
most 30 days. Check: a test that a turn without a trace id, or with an outcome outside the list, is refused.
|
|
41
|
+
- **The agent publishes one `support.quality_daily` per closed UTC day and channel** (A5) on its events feed
|
|
42
|
+
(`/fabric/v1/events`; building-fabric-services, `references/events-and-notifications.md`): counts and codes only, the
|
|
43
|
+
judge model and rubric version, and `notMeasured` naming every family not computed that day. A metric not measured is
|
|
44
|
+
null and named, never 0. The day goes in the event's `data` (`{schema, value}`, as `fabric_events.py` writes it), at
|
|
45
|
+
level `info` and without a notification. Until the contract carries the schema (A7), the producer names and pins its
|
|
46
|
+
own: `data.schema` is the absolute URI of the payload schema the agent publishes, and `data.value` stays within
|
|
47
|
+
DEC-0070's bounds (at most 32 members, each a scalar, a list of scalars or a flat object; per-lane counts as objects
|
|
48
|
+
such as `laneFailures` and `laneRecovered`; building-fabric-services, `references/protocol.md`). Check: the producer's
|
|
49
|
+
day passes `make_event`; a planted day that writes 0 for a family not computed fails; and a test runs every
|
|
50
|
+
`notMeasured` name the producer can emit through the published name pattern, iterating the producer's own list.
|
|
51
|
+
|
|
52
|
+
## Model lanes
|
|
53
|
+
|
|
54
|
+
- **A table of lanes** (P4): classifier, writer, fallback writer, checker, research, judge. The checker is another
|
|
55
|
+
vendor than the writer; the judge is another vendor than both, at temperature 0, on an open-vendor model where it
|
|
56
|
+
reads what people wrote. Declare them as classes in the profile, where each lane's fallback is another vendor than its
|
|
57
|
+
primary ([models and providers](models-and-providers.md)); per turn the router picks the checker against the model
|
|
58
|
+
that actually drafted, a fallback writer included ([resilience and
|
|
59
|
+
autonomy](resilience-and-autonomy.md#model-answers-are-untrusted-until-accepted), item 3). A lane that reads what
|
|
60
|
+
people wrote has an open-vendor route (DEC-0083). Check: the config loader refuses a fallback that shares its own
|
|
61
|
+
lane's primary vendor, a profile where some writer route has no checker route of another vendor, and a judge with no
|
|
62
|
+
route outside the vendors of the writers and the checkers (the vendor is the prefix before `/`).
|
|
63
|
+
- **Count what the fallback recovered** (P4), not only what the first attempt lost: a day's report says how many calls
|
|
64
|
+
failed and how many of those the fallback answered. Check: a test that a recovered call counts once as a failure of
|
|
65
|
+
the primary and once as a recovery, and is never counted as an error of the turn.
|
|
66
|
+
- **A writer model or reasoning budget changes only after an offline replay** (P4) of last week's judged sample, judged
|
|
67
|
+
blind, on the current model and the candidates. Check: the config loader refuses a change of the writer lane's model
|
|
68
|
+
or reasoning budget that names no replay report.
|
|
69
|
+
|
|
70
|
+
## Checks before a reply is sent
|
|
71
|
+
|
|
72
|
+
- **Deterministic false-state gates come first** (P2): the reply may not say that money arrived, that something is live,
|
|
73
|
+
enabled or fixed, or that a person did something, unless the system backs it. Check: planted drafts with each false
|
|
74
|
+
claim are refused before any model checker runs.
|
|
75
|
+
- **The checker sees the material, and sees it before the instructions** (P2): the knowledge items and account state the
|
|
76
|
+
writer used come first in its context, the operator's instructions after. A checker that receives the material cut
|
|
77
|
+
short after long instructions refuses correct answers as invented. Check: a planted correct answer whose material is
|
|
78
|
+
longer than the instructions passes the checker.
|
|
79
|
+
- **Numbers and account state come from tools**, never from the model (P1): prices from a calculator, the person's
|
|
80
|
+
account state and order from the system, injected per turn. Check: a planted draft with a price or an account state
|
|
81
|
+
that no tool result of the turn carries is refused.
|
|
82
|
+
- **Before sending, re-read the conversation's live tail** (P1): if a person or the agent already answered, skip the
|
|
83
|
+
turn. Check: a reply that lands in the conversation while the draft is checked makes the agent send nothing.
|
|
84
|
+
|
|
85
|
+
## When the check refuses
|
|
86
|
+
|
|
87
|
+
- **Repair, then research, then hold** (P2): one repair with the checker's reason; then one research turn on a stronger
|
|
88
|
+
model that sees both refused drafts and approved past answers, under a hard time cap; only then an honest holding
|
|
89
|
+
line. A refusal for a money reason is never researched. Check: a planted refusal walks all three steps in order.
|
|
90
|
+
- **A hold comes back by itself** (P2): when a person or the knowledge base answers the held question, the conversation
|
|
91
|
+
is run again and the person gets the answer without asking twice. Check: closing the gap behind a held turn produces
|
|
92
|
+
one reply in that conversation, and only one.
|
|
93
|
+
|
|
94
|
+
## Hand-offs and promises
|
|
95
|
+
|
|
96
|
+
- **A hand-off is never an answer** (P3): it is not counted as answered, and hand-off and fallback templates stay out of
|
|
97
|
+
the judge's sample. Check: the daily report counts a hand-off under hand-offs, and the judge's sample builder leaves
|
|
98
|
+
templated replies out.
|
|
99
|
+
- **Hand-offs are counted by cause** (P3): `policy`, `inability` and `infrastructure` apart, so the largest number names
|
|
100
|
+
what to fix. A hold after a checker or model outage, or at the research time cap, is `infrastructure`; only a hold
|
|
101
|
+
after a refusal on the material is `inability`. Check: a checker outage produces `infrastructure` hand-offs and holds,
|
|
102
|
+
never `inability`.
|
|
103
|
+
- **A commitments ledger** (P3): every "I will pass this on and come back" is a row with an owner and a due date; the
|
|
104
|
+
week's report counts promises made and closed. Check: a reply that promises to come back without a ledger row is
|
|
105
|
+
refused.
|
|
106
|
+
|
|
107
|
+
## Knowledge and gaps
|
|
108
|
+
|
|
109
|
+
- **The knowledge client keeps no threshold of its own** (P1, P8): the knowledge service decides whether an item may be
|
|
110
|
+
given as an answer and returns an `answer` flag per item; the client reads the flag and nothing else. Small closed
|
|
111
|
+
rule sets (prices, payment terms, refunds, sign-in) go into the prompt whole, dated and ordered by owner. Check: a
|
|
112
|
+
test that changing the client's configuration cannot make an item with `answer: false` an answer.
|
|
113
|
+
- **Every abstention and every inability, a hold on the material included, becomes a gap in a queue** (P7), restated
|
|
114
|
+
without personal data and grouped by meaning. When a gap closes, the client asks again and rewrites the held answer
|
|
115
|
+
only once the new answer is confident. Check: a closed gap whose new answer comes back with `answer: false` leaves the
|
|
116
|
+
hold in place, and a hold after a checker outage opens no gap.
|
|
117
|
+
|
|
118
|
+
## Reading the events feed
|
|
119
|
+
|
|
120
|
+
- **A reader that starts accepting a new event kind re-reads its feed once** (P6), from before its cursor: a reader that
|
|
121
|
+
only moves forward has already passed the first events of that kind. The re-read reaches back only as far as the
|
|
122
|
+
producer's feed keeps (at least 7 days or 1000 events, building-fabric-services
|
|
123
|
+
`references/events-and-notifications.md`); an older day is read from the producer's own store or not at all. Check: a
|
|
124
|
+
test adds a kind to the reader and sees the earlier events of that kind delivered once.
|
|
125
|
+
|
|
126
|
+
## Checklist
|
|
127
|
+
|
|
128
|
+
- [ ] Turn record with a trace id and an outcome from the fixed list (A1)
|
|
129
|
+
- [ ] `support.quality_daily` per closed UTC day and channel; `notMeasured` names tested against the pattern (A5)
|
|
130
|
+
- [ ] Lane table: fallback, checker and judge of other vendors; fallback recoveries counted
|
|
131
|
+
- [ ] A writer model or reasoning budget changed only after an offline replay
|
|
132
|
+
- [ ] False-state gates before the model checker; the checker sees the material before the instructions
|
|
133
|
+
- [ ] Numbers and account state from tools; the live tail re-read before sending
|
|
134
|
+
- [ ] Repair, research, hold; a hold that comes back by itself
|
|
135
|
+
- [ ] Hand-offs by cause, never counted or judged as answers
|
|
136
|
+
- [ ] A commitments ledger: promises made and closed per week
|
|
137
|
+
- [ ] A knowledge client that reads the service's `answer` flag and keeps no threshold
|
|
138
|
+
- [ ] A gap queue that asks again after a gap closes
|
|
139
|
+
- [ ] A reader that adds an event kind re-reads its feed once
|
|
@@ -18,7 +18,7 @@ compatibility: >-
|
|
|
18
18
|
this plugin; Codex/Kimi use command hooks; Hermes/OpenCode/OpenClaw/Pi use native context plugins after opt-in.
|
|
19
19
|
metadata:
|
|
20
20
|
author: PassionCode.ai
|
|
21
|
-
version: "0.
|
|
21
|
+
version: "0.55.0"
|
|
22
22
|
---
|
|
23
23
|
|
|
24
24
|
# Working with Fabric
|
|
@@ -238,7 +238,9 @@ already approved.
|
|
|
238
238
|
`{kind: "mandate/1", by: "operator", task, instruction, at, source?, expiresAt, scope, chain}`, `instruction` his
|
|
239
239
|
words verbatim (at most 500 characters), `at` when he said them, `source` where he said them when they reached you
|
|
240
240
|
relayed, `expiresAt` at most seven days on, `scope` no wider than his words (`capabilities` or `actions`, `effects`,
|
|
241
|
-
`perCallMaxUsd`, `projects`), `chain` starting with you.
|
|
241
|
+
`perCallMaxUsd`, `projects`), `chain` starting with you. For a job asking the operator at a step, name the job's capability in
|
|
242
|
+
`capabilities` without `actions`: the step is read with its request key as the action, unknown ahead
|
|
243
|
+
(DEC-0141 MJ-1). Each hand-over appends the agent you call to `chain`, with a
|
|
242
244
|
narrower `scope` when you hand on less, never wider; at most four agents; `source` never changes down the chain. It
|
|
243
245
|
travels in the call's `_meta.mandate` or as `call.mandate` of Fabric's `agent.call` once Fabric's hub forwards it
|
|
244
246
|
(CT-125), never in a tool's arguments; the service kits state and hand it on (`operator_mandate(source=)`,
|
|
@@ -259,7 +261,7 @@ already approved.
|
|
|
259
261
|
covers the part, else pass the refusal to the agent that called you; only the agent leading the task asks him, once,
|
|
260
262
|
about that part alone (MD-4). A
|
|
261
263
|
caller outside the machine's trust (T2) gets nothing from a mandate.
|
|
262
|
-
- The contract's decision for request `519d7b21` is DEC-0126 (OA-1 to OA-7),
|
|
264
|
+
- The contract's decision for request `519d7b21` is DEC-0126 (OA-1 to OA-7), with
|
|
263
265
|
`mandate/1` (DEC-0125) its machine form and `source` the place it names.
|
|
264
266
|
|
|
265
267
|
### A lane stopped on a limit: restart it at once
|
|
@@ -311,7 +313,7 @@ stuck work to the operator.
|
|
|
311
313
|
| denied | the operator said no | stop; it stands until cleared in Agent access |
|
|
312
314
|
| failed in the client before its answer arrived; outcome unknown | the call may have run | check its effect first (`fabric_work_list`, `fabric_tasks_list`); repeat only with the same idempotency key |
|
|
313
315
|
| Fabric restarted or closed this session; nothing was done | refused before the call ran | call it again once `fabric_whoami` answers |
|
|
314
|
-
| `operator-decision-required` | a service's action needs the operator's decision and none travelled; with `data.detail` `outside-mandate: <part>`, the mandate does not cover that part | ask the operator about this action, then relay their answer by the first route of Step 5 that carries it, the page only when none does; under a mandate, call again within your own mandate if it covers the part, else pass the refusal to the agent that called you, and only the lead asks him, once, about that part alone |
|
|
316
|
+
| `operator-decision-required` | a service's action needs the operator's decision and none travelled; with `data.detail` `outside-mandate: <part>`, the mandate does not cover that part | ask the operator about this action, then relay their answer by the first route of Step 5 that carries it, the page only when none does; under a mandate, call again within your own mandate if it covers the part, else pass the refusal to the agent that called you, and only the lead asks him, once, about that part alone; `mandate-capability-missing`: no mandate covers that step, only his decision |
|
|
315
317
|
| `decision-invalid` | the decision names another action or object, is older than 24 hours, lies over 60 s ahead of the service's clock, or is malformed; or the mandate is (`data.detail` `mandate-malformed`, `-widened`, `-expired`, `-early`, `-not-for-this-call`) | never edit, widen or re-date it; ask the operator again when their words do not cover this call |
|
|
316
318
|
| `approval-required` with `data.actionDigest` | a caller outside the machine's trust (T2): a chat decision changes nothing | an `approval/1` for that digest through the hub |
|
|
317
319
|
| `human-step-required` with `data.humanStep` and `data.url` | a sign-in, a one-time code, consent, payment or top-up, typed secret, spend above a limit or passkey stays the person's | hand the person `data.url`: a path on the service's origin as Fabric Dashboards' `open_link` (`fallback=never`), an https URL as it is; never take the step or ask for the secret; continue other work |
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "passioncode",
|
|
4
4
|
"displayName": "PassionCode.ai",
|
|
5
|
-
"version": "0.2.
|
|
5
|
+
"version": "0.2.45",
|
|
6
6
|
"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 at session start that keeps the PassionCode.ai skill set current.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|