@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.
Files changed (28) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/family.json +1 -1
  3. package/package.json +1 -1
  4. package/payload/.claude-plugin/marketplace.json +2 -2
  5. package/payload/manifest.json +8 -8
  6. package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
  7. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +3 -3
  8. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
  9. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +5 -4
  10. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/README.md +43 -8
  11. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/support_agent.py +28 -7
  12. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +2 -1
  13. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +22 -7
  14. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +1 -1
  15. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +2 -2
  16. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-actions.mjs +22 -9
  17. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-delegation.mjs +6 -1
  18. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop-rules.mjs +14 -6
  19. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_actions.py +23 -13
  20. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_delegation.py +6 -1
  21. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py +9 -5
  22. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop_rules.py +16 -5
  23. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +184 -8
  24. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +6 -3
  25. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/agents-that-answer-people.md +139 -0
  26. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +6 -4
  27. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
  28. package/payload/plugins/passioncode/.claude-plugin/plugin.json +1 -1
@@ -3,7 +3,10 @@ extensions/actions/0.1 (DEC-0121, FAC-SEM-142). Part of the service kit (layer L
3
3
 
4
4
  - ``action_decision(inputs)``: whether a service takes a call of one declared action and as whose act it records it,
5
5
  exactly as the contract's ``actionDecision`` answers (AP-2, AP-4; DL-17, DL-18, DL-25). A ``fault`` is the
6
- service's own and is never sent to a caller.
6
+ service's own and is never sent to a caller as such; ``action_gate`` answers ``mandate-capability-missing`` as
7
+ operator-decision-required (DEC-0141 MJ-1).
8
+ - ``JOB_STEP_TOOL`` and ``job_capability(value)``: the tool a job's answer comes through, and whether a job's
9
+ capability can read its step under a mandate (a capability name other than ``fabric.job.get``).
7
10
  - ``decision_shape(value)``: a decision as ``decision.schema.json`` reads it, ``at`` read strictly (the contract's
8
11
  ``strictTime``).
9
12
  - ``actions_view(well_known)``: the host reader of the declaration, as the contract's ``actionsView``.
@@ -166,14 +169,12 @@ def action_decision(inputs: Any) -> Dict[str, Any]:
166
169
  the service authenticated), `effect` (the action's effect class, the service's own knowledge), `spendUsd` (its
167
170
  own estimate) and `project`: covered, `{by: operator, via: mandate, task, chain, source?, caller}`; otherwise
168
171
  `operator-decision-required` or `decision-invalid` with `data.detail`.
172
+ - DEC-0141 MJ-1: a job's input request (tool `fabric.job.get`) under a mandate is read under `mandateCapability`,
173
+ the job's own capability (the tool its start call named), its action the request key; any other action reads
174
+ its own tool.
169
175
  - `{"fault": ...}` (action-invalid, caller-missing, now-unreadable, digest-missing, url-missing, effect-missing,
170
- self-missing) is the service's
171
- own: an input it owes is missing or unreadable. It is never sent to a caller.
172
-
173
-
174
- Kit input beside the contract's: `mandateCapability`, a job's kept step's capability, read by the mandate in
175
- place of the action's tool (the contract's actionDecision does not take it; the service's own input, never a
176
- caller's)."""
176
+ self-missing, mandate-capability-missing) is the service's own: an input it owes is missing or unreadable. It is
177
+ never sent to a caller (action_gate answers mandate-capability-missing as operator-decision-required)."""
177
178
  action = get(inputs, "action")
178
179
  if not readable_action(action):
179
180
  return {"fault": "action-invalid"}
@@ -219,6 +220,15 @@ def action_decision(inputs: Any) -> Dict[str, Any]:
219
220
  return {"ok": True, "recordAs": record}
220
221
 
221
222
 
223
+ #: The tool of a job's input request (interop C3.3, AP-2): the call that answers it is fabric.job.get (DEC-0141 MJ-1).
224
+ JOB_STEP_TOOL = "fabric.job.get"
225
+
226
+
227
+ def job_capability(value: Any) -> bool:
228
+ """A job's capability a mandate can read a step under (MJ-1): a capability name, never fabric.job.get itself."""
229
+ return isinstance(value, str) and _CAPABILITY.fullmatch(value) is not None and value != JOB_STEP_TOOL
230
+
231
+
222
232
  def _by_mandate(inputs: Any, action: Dict[str, Any], caller: str) -> Dict[str, Any]:
223
233
  """A relayed action's call that carries a mandate and no decision (DEC-0125 MD-3): the mandate decides, as the
224
234
  contract's byMandate reads it: the service's own `effect` and agent id `self` are required (else a fault), its
@@ -228,11 +238,11 @@ def _by_mandate(inputs: Any, action: Dict[str, Any], caller: str) -> Dict[str, A
228
238
  return {"fault": "effect-missing"}
229
239
  if not isinstance(me, str):
230
240
  return {"fault": "self-missing"}
231
- # A job's kept step is read under the job's own capability, as job_step read it at the start (`mandateCapability`,
232
- # the kit's input; the action itself stays fabric.job.get).
233
- capability = get(inputs, "mandateCapability")
234
- call: Dict[str, Any] = {"capability": capability if isinstance(capability, str) else action["tool"],
235
- "action": action["id"], "effect": effect}
241
+ # MJ-1: a job's step is read under the job's capability, never under the transport fabric.job.get itself.
242
+ capability = get(inputs, "mandateCapability") if action["tool"] == JOB_STEP_TOOL else action["tool"]
243
+ if not job_capability(capability):
244
+ return {"fault": "mandate-capability-missing"}
245
+ call: Dict[str, Any] = {"capability": capability, "action": action["id"], "effect": effect}
236
246
  spend, project = get(inputs, "spendUsd"), get(inputs, "project")
237
247
  if is_number(spend):
238
248
  call["spendUsd"] = spend
@@ -818,9 +818,14 @@ def refusal_from_action(answer: Any) -> Optional[Dict[str, Any]]:
818
818
  """DL-19 (DEC-0121): the refusal a service answers for an action call that fabric_actions.action_decision refused,
819
819
  or None when it took the call. operator-decision-required, decision-invalid and approval-required carry their
820
820
  detail; human-step-required carries `humanStep` and `url` (AP-4). A `fault` is the service's own and is never
821
- sent: the caller reads unknown-state with the detail `service-fault`, as for anything else that is not an answer."""
821
+ sent: the caller reads unknown-state with the detail `service-fault`, as for anything else that is not an answer;
822
+ but `mandate-capability-missing` (DEC-0141 MJ-1), a job's step no mandate can be read for, is answered as
823
+ operator-decision-required with that detail, so the job stays input_required."""
822
824
  if isinstance(answer, dict) and answer.get("ok") is True:
823
825
  return None
826
+ if isinstance(answer, dict) and answer.get("fault") == "mandate-capability-missing":
827
+ return _refuse("operator-decision-required", _ACTION_DETAILS["operator-decision-required"],
828
+ {"detail": "mandate-capability-missing"})
824
829
  code = answer.get("code") if isinstance(answer, dict) and answer.get("ok") is False else None
825
830
  if not isinstance(code, str) or code not in _ACTION_DETAILS:
826
831
  return _refuse("unknown-state", "service-fault")
@@ -510,7 +510,8 @@ class CallContext:
510
510
  carried (`_meta.mandate`) is read for it (job_step). Covered: answers the record (`via: mandate`, `source` when
511
511
  the mandate carries one) and asks nothing; the job goes on as the operator's decision. Otherwise the job waits
512
512
  input_required on `request`, its message naming the part not covered (or `message`), and answers None; the step
513
- is kept so an answer's `_meta.mandate` that covers it is read when input_actions is on."""
513
+ is kept so an answer's `_meta.mandate` that covers it is read when input_actions is on. Any fault job_step answers
514
+ (mandate-capability-missing, MJ-1, or the server clock's now-unreadable) goes to on_fault under the job's tool."""
514
515
  if self.server.jobs is None:
515
516
  raise InteropError("This server has no job store.")
516
517
  step: Dict[str, Any] = {"message": None}
@@ -521,6 +522,7 @@ class CallContext:
521
522
  spend_usd=spend_usd, project=project)
522
523
  if step["covered"]:
523
524
  return step["record"]
525
+ self.server._fault(self.tool, step) # the start hears it as the answer does (MJ-1)
524
526
  kept = {"effect": effect, **({"spendUsd": spend_usd} if spend_usd is not None else {}),
525
527
  **({"project": project} if project is not None else {})}
526
528
  self.server.jobs.request_input(job_id, {key: request}, step["message"] or message, steps={key: kept})
@@ -644,7 +646,8 @@ class McpToolServer:
644
646
  # approval the call presented, or None; elicited(tool, arguments, caller) is True only on the service's own
645
647
  # record of an accepted elicitation. input_actions=True gates each answered input request as an action (D8).
646
648
  # on_fault(tool, fault) hears a service fault the caller only sees as unknown-state (e.g. caller-missing: an
647
- # action-gated server needs a tier, identify or authorize that names who calls).
649
+ # action-gated server needs a tier, identify or authorize that names who calls), but for mandate-capability-missing
650
+ # (MJ-1), which the caller reads as operator-decision-required naming it in data.detail.
648
651
  # DEC-0125: agent_id is this service's own agent id; with it the server reads a call's _meta.mandate for a
649
652
  # relayed action added with its effect (the chain must end in agent_id, and in the delegation's caller before
650
653
  # it when authorize accepted a token); without it a mandate is not read, as before.
@@ -796,8 +799,8 @@ class McpToolServer:
796
799
  action = {"id": key, "title": "Answer %s" % key, "tool": "fabric.job.get", "gate": "relayed"}
797
800
  step, mandate = steps.get(key), {}
798
801
  if self.agent_id is not None and isinstance(step, dict):
799
- # A kept step's mandate is read as approval_step read it, under the job's own capability; the action
800
- # itself stays fabric.job.get, so it is readable whatever the tool is named.
802
+ # A kept step's mandate is read as approval_step read it, under the job's own capability, which must
803
+ # be a capability name (MJ-1); the action itself stays fabric.job.get, so it is a readable action.
801
804
  capability = self.jobs.private(job_id).get("capability")
802
805
  agent = (verdict or {}).get("caller")
803
806
  mandate = {"self_id": self.agent_id, "effect": step.get("effect"), "spend_usd": step.get("spendUsd"),
@@ -811,7 +814,8 @@ class McpToolServer:
811
814
  return {"ok": True, "records": records}
812
815
 
813
816
  def _fault(self, tool: str, gated: Dict[str, Any]) -> None:
814
- """Hand a service fault to on_fault; the caller saw only unknown-state. A hook that raises is the service's."""
817
+ """Hand a service fault to on_fault; the caller saw unknown-state (operator-decision-required naming it for
818
+ mandate-capability-missing, MJ-1). A hook that raises is the service's."""
815
819
  if gated.get("fault") and self._on_fault is not None:
816
820
  try:
817
821
  self._on_fault(tool, str(gated["fault"]))
@@ -17,7 +17,7 @@ if str(_Path(__file__).resolve().parent) not in _sys.path: # the kit loads from
17
17
  _sys.path.insert(0, str(_Path(__file__).resolve().parent))
18
18
 
19
19
  from fabric_base import ServiceError # noqa: E402
20
- from fabric_actions import action_decision, decision_shape # noqa: E402 - DEC-0121
20
+ from fabric_actions import action_decision, decision_shape, job_capability # noqa: E402 - DEC-0121
21
21
  from fabric_mandate import ( # noqa: E402 - DEC-0125, DEC-0126
22
22
  EFFECT_CLASSES, OPERATOR_SOURCE_PROTOCOL, mandate_covers, mandate_problem, without_source)
23
23
 
@@ -319,6 +319,10 @@ def request_meta(traceparent: Optional[str] = None, decision: Any = None, mandat
319
319
  return meta
320
320
 
321
321
 
322
+ _UNREADABLE_JOB_CAPABILITY = ("The operator's mandate cannot be read for this step (mandate-capability-missing): answer it, "
323
+ "or call fabric.job.get with a decision in _meta.decision.")
324
+
325
+
322
326
  def job_step(mandate: Any, *, tier: Any, now: Any, self_id: Any, capability: Any, key: Any, effect: Any,
323
327
  caller_agent: Any = None, spend_usd: Any = None, project: Any = None) -> Dict[str, Any]:
324
328
  """A job's own approval step under the mandate its start call carried (interop C3.3, DEC-0125 MD-3, MD-4;
@@ -330,6 +334,7 @@ def job_step(mandate: Any, *, tier: Any, now: Any, self_id: Any, capability: Any
330
334
  mandate_covers' recordAs (`via: mandate`, the task, the chain and `source` when the mandate carries one).
331
335
  - {"covered": False, "message", "detail"}: the step waits input_required, `message` its statusMessage naming the
332
336
  part not covered, or saying the mandate expired or cannot be read; never the operator's words or `source`.
337
+ With `fault` mandate-capability-missing beside it when the job's capability cannot read the step (MJ-1).
333
338
  - {"covered": False, "message": None}: no mandate, or a T2 caller's (MD-5): ask as before; with `fault` when the
334
339
  service's own clock does not read."""
335
340
  if mandate is None:
@@ -345,10 +350,13 @@ def job_step(mandate: Any, *, tier: Any, now: Any, self_id: Any, capability: Any
345
350
  if isinstance(caller_agent, str) and caller_agent:
346
351
  covers["callerAgent"] = caller_agent
347
352
  answer = mandate_covers(covers)
353
+ if "ignored" in answer or "fault" in answer: # a T2 caller's mandate changes nothing (MD-5), first
354
+ return dict({"covered": False, "message": None}, **({"fault": answer["fault"]} if "fault" in answer else {}))
355
+ if not job_capability(capability): # MJ-1: read alike at the start and at the answer (action_gate)
356
+ return {"covered": False, "detail": "mandate-capability-missing", "fault": "mandate-capability-missing",
357
+ "message": _UNREADABLE_JOB_CAPABILITY}
348
358
  if answer.get("ok") is True:
349
359
  return {"covered": True, "record": answer["recordAs"]}
350
- if "ignored" in answer or "fault" in answer:
351
- return dict({"covered": False, "message": None}, **({"fault": answer["fault"]} if "fault" in answer else {}))
352
360
  detail = answer["data"]["detail"]
353
361
  if detail == "mandate-expired":
354
362
  said = "The operator's mandate for this task expired before this step"
@@ -371,13 +379,14 @@ def action_gate(action: Any, *, tier: Any, caller: Any, meta: Any = None, target
371
379
  record of an accepted elicitation), `approval` (verify_approval's accepted outcome), `action_digest`,
372
380
  `human_step_url` and `now` (RFC 3339). Answers {ok: True, record, decision}, `decision` being the one taken as the
373
381
  operator's (None otherwise), or {ok: False, refusal} in the DL-19 form (fabric_delegation.refusal_tool_result
374
- sends it); a service's own fault is the refusal unknown-state with `fault` beside it for the service's log.
382
+ sends it); a service's own fault is the refusal unknown-state with `fault` beside it for the service's log, but for
383
+ mandate-capability-missing (MJ-1): operator-decision-required naming it in data.detail, `fault` still beside it.
375
384
 
376
385
  DEC-0125: a service that names its own agent id (`self_id`) reads the call's `_meta.mandate` when it carries no
377
386
  decision, given `effect` (the action's effect class, required: without it the call is the service's fault
378
387
  effect-missing), `caller_agent` (only an agent id the service authenticated: a delegation's caller, its own
379
388
  per-agent credential; never a name the call carries), `spend_usd` (its own estimate), `project`, and `mandate_capability` (a job's kept step: the job's capability
380
- the mandate is read under, not the action's tool). A covered call
389
+ the mandate is read under, DEC-0141 MJ-1; unusable, the refusal is operator-decision-required). A covered call
381
390
  answers {ok: True, record: {by: operator, via: mandate, task, chain, caller}, decision: None, mandate}; without
382
391
  `self_id` the mandate is not read and the call is answered as before it existed."""
383
392
  import fabric_delegation as _fd # noqa: E402 - beside this file: DL-19
@@ -401,6 +410,8 @@ def action_gate(action: Any, *, tier: Any, caller: Any, meta: Any = None, target
401
410
  if isinstance(record, dict) and record.get("via") == "mandate":
402
411
  out["mandate"] = inputs["mandate"]
403
412
  return out
413
+ # MJ-1 (DEC-0141): refusal_from_action answers mandate-capability-missing as operator-decision-required; nothing is
414
+ # applied, so the job stays input_required.
404
415
  out: Dict[str, Any] = {"ok": False, "refusal": _fd.refusal_from_action(answer)}
405
416
  if "fault" in answer:
406
417
  out["fault"] = answer["fault"]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fabric-service-kit",
3
- "version": "0.53.1",
3
+ "version": "0.55.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
  {
@@ -113,7 +113,7 @@
113
113
  "fabric_mandate",
114
114
  "fabric_paths"
115
115
  ],
116
- "sha256": "650b8bb0827f2e56c7f6dc98bd975acff19627491fd713d6897e14f59f107eaa"
116
+ "sha256": "212ab88df02d52c433793acb0cd7a24527a87d770b831d542f467c176b49b4c5"
117
117
  },
118
118
  {
119
119
  "module": "fabric_share",
@@ -186,7 +186,7 @@
186
186
  "fabric_mandate",
187
187
  "fabric_time"
188
188
  ],
189
- "sha256": "6f7c4110b755e31f948645fba8d15823f350b7e7a3a973b01606702d0f0a0d94"
189
+ "sha256": "0efe81c7b73c63963348fb4936a3816a961d3424416abd5823fbeb1aa2cb0bbf"
190
190
  },
191
191
  {
192
192
  "module": "fabric_connections",
@@ -380,7 +380,7 @@
380
380
  "fabric_mandate",
381
381
  "fabric_time"
382
382
  ],
383
- "sha256": "adbc61f490f142092cd27847aa7e2560fc81e5dc892f5cec423c802eca0e99d5"
383
+ "sha256": "42e88f4b3f22890022baa8cb999ee953978ab2a9a029e89e951767a4eabfd090"
384
384
  },
385
385
  {
386
386
  "module": "fabric_interop",
@@ -396,7 +396,7 @@
396
396
  "fabric_service",
397
397
  "fabric_time"
398
398
  ],
399
- "sha256": "e467cee268c1202f86214149004b58718cb587d32650861e456414002493b9e6"
399
+ "sha256": "42e3f73a673f13775fbbdf476bfd5a96e4553fa3d0141e8ad223c8f88b0dd0b3"
400
400
  },
401
401
  {
402
402
  "module": "fabric_hub",
@@ -592,7 +592,7 @@
592
592
  "fabric-mandate",
593
593
  "fabric-paths"
594
594
  ],
595
- "sha256": "ddef0956002a3ce7eded792d6aebb1c6515f1a70e88efd603f9dfb6c4db92adb"
595
+ "sha256": "04eaf6cd1786d4309a253a27dbdb05e27b408cb511aa41b1633a96634b775e65"
596
596
  },
597
597
  {
598
598
  "module": "fabric-share",
@@ -663,7 +663,7 @@
663
663
  "fabric-mandate",
664
664
  "fabric-time"
665
665
  ],
666
- "sha256": "42e7b6261a886444b74a3cd5694ab5d5cf46c54d8c9540b090e617e7a93ebd21"
666
+ "sha256": "35f34dccb6c4feb482b0b169f53682f9690b32012481bef3869e487e9637af09"
667
667
  },
668
668
  {
669
669
  "module": "fabric-connections",
@@ -855,7 +855,7 @@
855
855
  "fabric-jsvalue",
856
856
  "fabric-mandate"
857
857
  ],
858
- "sha256": "8a55a794c9055e381c761c6f5b4df9fa93d705526fa0bce5dba978aed1b4a804"
858
+ "sha256": "0933a8cd9567cd39f05575167d92dfef0745aaa591779419e84f94be18b01177"
859
859
  },
860
860
  {
861
861
  "module": "fabric-interop",
@@ -3942,6 +3942,182 @@
3942
3942
  "fabric-openrouter.mjs": "ab6c4c7251d563980d895061ee19976bde2f364c21b6354efdd9a9027b1ea139",
3943
3943
  "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
3944
3944
  "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
3945
+ },
3946
+ "0.54.0": {
3947
+ "fabric_jsvalue.py": "12888a2c934a885d35999ac9782eaedc8d04946d9775213344a235a8814d3d28",
3948
+ "fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
3949
+ "fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
3950
+ "fabric_secrets.py": "68a0b5e9e90c468ec9ac67b2f0fd1848e08813d6ec1ec14a2a47337eb1a98911",
3951
+ "fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
3952
+ "fabric_base.py": "f62bcc2ed9912660fa875d27a09f60867260cc4925f79873501fd9620be59611",
3953
+ "fabric_platform.py": "a9350dff55ef0fb3a23cdb4d0320a15868b15a8deb10d2eb74d72c58740c284b",
3954
+ "fabric_paths.py": "8a1ee742f80f436e9f28c61b4f049a9545de2a9e0d66bfc61faa6ee5d1ba3734",
3955
+ "fabric_estate_rules.py": "8b36a7f4108d9c2b1fb38c8bff344778c807bed631a99b4a563ecb0a49c10b1c",
3956
+ "fabric_estate.py": "b3cd56dcb86e04d252980322ac8054da1aaef24ac64690f7aa80e7c765ee6f60",
3957
+ "fabric_mandate.py": "050c43d0166a7dfba82e29c4e978f05c364cf6da06d0a781bd023a566777c17b",
3958
+ "fabric_delegation.py": "212ab88df02d52c433793acb0cd7a24527a87d770b831d542f467c176b49b4c5",
3959
+ "fabric_share.py": "da36a466426fc29dd7dd40013167f3959a18375f8fedd228bf64f298cec1040c",
3960
+ "fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
3961
+ "fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
3962
+ "fabric_package.py": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c",
3963
+ "fabric_protocols.py": "54ff0f26a8bda640c7edd826cf59151b6ff0483fe72e9c0626c0ba1b79738cd4",
3964
+ "fabric_actions.py": "0efe81c7b73c63963348fb4936a3816a961d3424416abd5823fbeb1aa2cb0bbf",
3965
+ "fabric_connections.py": "77d3ccf863c70e9209d21ef45c46a6db9c06237019bc20d54f8d3946873f3f11",
3966
+ "fabric_a2a.py": "8b01502131215bb4de1c01866187c56e99b791543923ed8577535573db33b919",
3967
+ "fabric_page_links.py": "1b57ea573c550e2f90d1ec3edcc655917ceaa0db9dd1635fccf422ec3024d25e",
3968
+ "fabric_lock.py": "ba2399d2137c7a7791b7133b9db9cca36693f4eb7e30955b25a75ade814e95ba",
3969
+ "fabric_usage.py": "b1f335cab4625171a616cf68cf3fd892b18bdadcf4baec3a3a0fdcf12785c170",
3970
+ "fabric_backups.py": "1f3f0d7ecf361b29e9101e07f1c53e5dc304d598bf26fd59ec89f16b9fed2420",
3971
+ "fabric_descriptor.py": "c973def06b68dce7ef369da77186542ce3afe357d4579a7d409604f06e4bf131",
3972
+ "fabric_context.py": "6ae311ddc7217a4aff915e7ce2646486931acd128462b7bebe4a52bbb5fbb6c7",
3973
+ "fabric_auth.py": "71115d18c67b7b806cb57b64b77e01ad97fc0e63e6f49ee850f778123617d905",
3974
+ "fabric_events.py": "0086886c2c29dbd5c9d152be9d375c5bdf4a29f89b8095baff8490c2bcd64e47",
3975
+ "fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
3976
+ "fabric_supervisors.py": "3c5b2e8c310738720b1c1b779be4710e90251013d9be4c68f9952edc0bf55d5f",
3977
+ "fabric_service.py": "a2e813469a47d4d3eea996628635c8903007498bdb6a1ae032a7a5ce6f49fe2f",
3978
+ "fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
3979
+ "fabric_interop_rules.py": "42e88f4b3f22890022baa8cb999ee953978ab2a9a029e89e951767a4eabfd090",
3980
+ "fabric_interop.py": "42e3f73a673f13775fbbdf476bfd5a96e4553fa3d0141e8ad223c8f88b0dd0b3",
3981
+ "fabric_hub.py": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a",
3982
+ "fabric_board_shapes.py": "0a0e8d3d40e33dfd8c457aedb85330b2ff25f8c49a33eb6cbd5a5cc8a5007f7e",
3983
+ "fabric_board_link.py": "55b552354deb60e50268c672912647bca57951fd6a3a27fb5d6dae11ec5a4fd7",
3984
+ "fabric_board_session.py": "e2b45c274e6eadcb020ec075950750a4f88d6293149b19b6b78a8d41ab669918",
3985
+ "fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
3986
+ "fabric_board.py": "0f075894b3e352194fcaf3fc7d08dee4e9f1c215e859769ed85fa5010e4a1599",
3987
+ "fabric_http.py": "5d7f72af3a73fdbe8c1f487ecf60cef23a7c46289eba542b03aff4706b8218d4",
3988
+ "fabric_openrouter.py": "309f588f9c976b1061323f3161e35d86248afd5b59b16391afbfc4e1099ecd65",
3989
+ "fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
3990
+ "fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
3991
+ "fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
3992
+ "fabric-secrets.mjs": "6ad8ab18ac899ecc2384e8ec6a3fb689b92be3b9a5ce3a59b92a37d52da5d766",
3993
+ "fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
3994
+ "fabric-base.mjs": "7804b2df7715dbbf9702a9b61b6b8cef2110f9a52b04cabd8fb0a66458d87512",
3995
+ "fabric-platform.mjs": "a8119d95ebba4d589a9e401f5d6fc8dda62d59d44e4c1ff811d97fac3771ac0c",
3996
+ "fabric-paths.mjs": "aa630d611e748a899e7043480f4a4e46b444f2e15ff945f30c2fbef21c1ceea5",
3997
+ "fabric-estate-rules.mjs": "7476be71174aa5b1026134f2b335abf647feaa55584e2f9de8618e3054aa8e1e",
3998
+ "fabric-estate.mjs": "e8a2e62d2313121e6cb502f6e6abad94d1d546a44b4d9b3ce2be29e7808e8cf3",
3999
+ "fabric-mandate.mjs": "deaab2bfb929d1bd35ae1bad71e7b9ad9902cc23b8eb51819ed592fd80eddf95",
4000
+ "fabric-delegation.mjs": "04eaf6cd1786d4309a253a27dbdb05e27b408cb511aa41b1633a96634b775e65",
4001
+ "fabric-share.mjs": "bfb26581c21ad984c2a337da02429f9f3a165cc582f8ba48de4d3dfb7d163a59",
4002
+ "fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
4003
+ "fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
4004
+ "fabric-package.mjs": "13913ea6d12056c3a31b8222b6c4aab8395941fe519913692e1a06d8672e1c88",
4005
+ "fabric-protocols.mjs": "7da65440a7a08bf27d90a06e9158b1c4ee6d7f9204eecb712d452406bfe59962",
4006
+ "fabric-actions.mjs": "35f34dccb6c4feb482b0b169f53682f9690b32012481bef3869e487e9637af09",
4007
+ "fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
4008
+ "fabric-a2a.mjs": "51b72fe1d80649d659fcad3a8f96370db3476c4a7b30cbabd8522c138be69346",
4009
+ "fabric-page-links.mjs": "a8834926e9d4bbf7c4857f551451d2ebf6ac8873bbccaaf89c5e30cf45b17ee6",
4010
+ "fabric-lock.mjs": "ac219ab0a326d5c43c7c4c255e0c3843d4794de795a60e3af661e7d5350ea052",
4011
+ "fabric-usage.mjs": "1c4d18004639409624ac3516a02f2b60bbf55abdb612e9a96c37e83666eb87a7",
4012
+ "fabric-backups.mjs": "cfd8c9085e3d597a783099c2bd2ffe2f3faa0daaadab46dedd30523894cfeb06",
4013
+ "fabric-descriptor.mjs": "84c35c7ba0ae09fde1dc3f6ab796cd578d008707e77815a0f7b7a80306fa4cce",
4014
+ "fabric-context.mjs": "1112d695e872f9825cbc94f08484974bff3880087bc29b8be59f885f03e8f7be",
4015
+ "fabric-auth.mjs": "782c2aa732f8320f604194660117640a7ea145e12b8155c04e88cef7c516a5b3",
4016
+ "fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
4017
+ "fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
4018
+ "fabric-supervisors.mjs": "d45c38de0cb3ed85e083496c2d3c51dab004454accdd87f4762a512a6d442573",
4019
+ "fabric-service.mjs": "6aa673657427211b491a9b63f94b9847a7e6aa3ee1b7353e1af11f46469803a3",
4020
+ "fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
4021
+ "fabric-interop-rules.mjs": "0933a8cd9567cd39f05575167d92dfef0745aaa591779419e84f94be18b01177",
4022
+ "fabric-interop.mjs": "b66fccf4edc1448b3cda31cf036a789574cf07b5044d8433e4a5bf12a9c9aa7a",
4023
+ "fabric-hub.mjs": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070",
4024
+ "fabric-board-shapes.mjs": "c1db7b7bd0d58d82bb6d8dfbc3cd1547a256a333052d367e82ff1b3edf2804d7",
4025
+ "fabric-board-link.mjs": "ed93ad15e0f48627e545b561c4a562007d1b256c55f650126333aa6566876b12",
4026
+ "fabric-board-session.mjs": "9a70016543dded33bbbfe9dc7705e684387abd1d889598b579f1ca26927023cb",
4027
+ "fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
4028
+ "fabric-board.mjs": "9e7bfe4d412521982224ef12bebfc2ff255eeeaf8d96cf40234ac18de68e7a59",
4029
+ "fabric-http.mjs": "f886bcb49c4353d039387ac9568738dda26697a94dd07fc6a6204500f0bc27bf",
4030
+ "fabric-openrouter.mjs": "ab6c4c7251d563980d895061ee19976bde2f364c21b6354efdd9a9027b1ea139",
4031
+ "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
4032
+ "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
4033
+ },
4034
+ "0.55.0": {
4035
+ "fabric_jsvalue.py": "12888a2c934a885d35999ac9782eaedc8d04946d9775213344a235a8814d3d28",
4036
+ "fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
4037
+ "fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
4038
+ "fabric_secrets.py": "68a0b5e9e90c468ec9ac67b2f0fd1848e08813d6ec1ec14a2a47337eb1a98911",
4039
+ "fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
4040
+ "fabric_base.py": "f62bcc2ed9912660fa875d27a09f60867260cc4925f79873501fd9620be59611",
4041
+ "fabric_platform.py": "a9350dff55ef0fb3a23cdb4d0320a15868b15a8deb10d2eb74d72c58740c284b",
4042
+ "fabric_paths.py": "8a1ee742f80f436e9f28c61b4f049a9545de2a9e0d66bfc61faa6ee5d1ba3734",
4043
+ "fabric_estate_rules.py": "8b36a7f4108d9c2b1fb38c8bff344778c807bed631a99b4a563ecb0a49c10b1c",
4044
+ "fabric_estate.py": "b3cd56dcb86e04d252980322ac8054da1aaef24ac64690f7aa80e7c765ee6f60",
4045
+ "fabric_mandate.py": "050c43d0166a7dfba82e29c4e978f05c364cf6da06d0a781bd023a566777c17b",
4046
+ "fabric_delegation.py": "212ab88df02d52c433793acb0cd7a24527a87d770b831d542f467c176b49b4c5",
4047
+ "fabric_share.py": "da36a466426fc29dd7dd40013167f3959a18375f8fedd228bf64f298cec1040c",
4048
+ "fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
4049
+ "fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
4050
+ "fabric_package.py": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c",
4051
+ "fabric_protocols.py": "54ff0f26a8bda640c7edd826cf59151b6ff0483fe72e9c0626c0ba1b79738cd4",
4052
+ "fabric_actions.py": "0efe81c7b73c63963348fb4936a3816a961d3424416abd5823fbeb1aa2cb0bbf",
4053
+ "fabric_connections.py": "77d3ccf863c70e9209d21ef45c46a6db9c06237019bc20d54f8d3946873f3f11",
4054
+ "fabric_a2a.py": "8b01502131215bb4de1c01866187c56e99b791543923ed8577535573db33b919",
4055
+ "fabric_page_links.py": "1b57ea573c550e2f90d1ec3edcc655917ceaa0db9dd1635fccf422ec3024d25e",
4056
+ "fabric_lock.py": "ba2399d2137c7a7791b7133b9db9cca36693f4eb7e30955b25a75ade814e95ba",
4057
+ "fabric_usage.py": "b1f335cab4625171a616cf68cf3fd892b18bdadcf4baec3a3a0fdcf12785c170",
4058
+ "fabric_backups.py": "1f3f0d7ecf361b29e9101e07f1c53e5dc304d598bf26fd59ec89f16b9fed2420",
4059
+ "fabric_descriptor.py": "c973def06b68dce7ef369da77186542ce3afe357d4579a7d409604f06e4bf131",
4060
+ "fabric_context.py": "6ae311ddc7217a4aff915e7ce2646486931acd128462b7bebe4a52bbb5fbb6c7",
4061
+ "fabric_auth.py": "71115d18c67b7b806cb57b64b77e01ad97fc0e63e6f49ee850f778123617d905",
4062
+ "fabric_events.py": "0086886c2c29dbd5c9d152be9d375c5bdf4a29f89b8095baff8490c2bcd64e47",
4063
+ "fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
4064
+ "fabric_supervisors.py": "3c5b2e8c310738720b1c1b779be4710e90251013d9be4c68f9952edc0bf55d5f",
4065
+ "fabric_service.py": "a2e813469a47d4d3eea996628635c8903007498bdb6a1ae032a7a5ce6f49fe2f",
4066
+ "fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
4067
+ "fabric_interop_rules.py": "42e88f4b3f22890022baa8cb999ee953978ab2a9a029e89e951767a4eabfd090",
4068
+ "fabric_interop.py": "42e3f73a673f13775fbbdf476bfd5a96e4553fa3d0141e8ad223c8f88b0dd0b3",
4069
+ "fabric_hub.py": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a",
4070
+ "fabric_board_shapes.py": "0a0e8d3d40e33dfd8c457aedb85330b2ff25f8c49a33eb6cbd5a5cc8a5007f7e",
4071
+ "fabric_board_link.py": "55b552354deb60e50268c672912647bca57951fd6a3a27fb5d6dae11ec5a4fd7",
4072
+ "fabric_board_session.py": "e2b45c274e6eadcb020ec075950750a4f88d6293149b19b6b78a8d41ab669918",
4073
+ "fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
4074
+ "fabric_board.py": "0f075894b3e352194fcaf3fc7d08dee4e9f1c215e859769ed85fa5010e4a1599",
4075
+ "fabric_http.py": "5d7f72af3a73fdbe8c1f487ecf60cef23a7c46289eba542b03aff4706b8218d4",
4076
+ "fabric_openrouter.py": "309f588f9c976b1061323f3161e35d86248afd5b59b16391afbfc4e1099ecd65",
4077
+ "fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
4078
+ "fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
4079
+ "fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
4080
+ "fabric-secrets.mjs": "6ad8ab18ac899ecc2384e8ec6a3fb689b92be3b9a5ce3a59b92a37d52da5d766",
4081
+ "fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
4082
+ "fabric-base.mjs": "7804b2df7715dbbf9702a9b61b6b8cef2110f9a52b04cabd8fb0a66458d87512",
4083
+ "fabric-platform.mjs": "a8119d95ebba4d589a9e401f5d6fc8dda62d59d44e4c1ff811d97fac3771ac0c",
4084
+ "fabric-paths.mjs": "aa630d611e748a899e7043480f4a4e46b444f2e15ff945f30c2fbef21c1ceea5",
4085
+ "fabric-estate-rules.mjs": "7476be71174aa5b1026134f2b335abf647feaa55584e2f9de8618e3054aa8e1e",
4086
+ "fabric-estate.mjs": "e8a2e62d2313121e6cb502f6e6abad94d1d546a44b4d9b3ce2be29e7808e8cf3",
4087
+ "fabric-mandate.mjs": "deaab2bfb929d1bd35ae1bad71e7b9ad9902cc23b8eb51819ed592fd80eddf95",
4088
+ "fabric-delegation.mjs": "04eaf6cd1786d4309a253a27dbdb05e27b408cb511aa41b1633a96634b775e65",
4089
+ "fabric-share.mjs": "bfb26581c21ad984c2a337da02429f9f3a165cc582f8ba48de4d3dfb7d163a59",
4090
+ "fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
4091
+ "fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
4092
+ "fabric-package.mjs": "13913ea6d12056c3a31b8222b6c4aab8395941fe519913692e1a06d8672e1c88",
4093
+ "fabric-protocols.mjs": "7da65440a7a08bf27d90a06e9158b1c4ee6d7f9204eecb712d452406bfe59962",
4094
+ "fabric-actions.mjs": "35f34dccb6c4feb482b0b169f53682f9690b32012481bef3869e487e9637af09",
4095
+ "fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
4096
+ "fabric-a2a.mjs": "51b72fe1d80649d659fcad3a8f96370db3476c4a7b30cbabd8522c138be69346",
4097
+ "fabric-page-links.mjs": "a8834926e9d4bbf7c4857f551451d2ebf6ac8873bbccaaf89c5e30cf45b17ee6",
4098
+ "fabric-lock.mjs": "ac219ab0a326d5c43c7c4c255e0c3843d4794de795a60e3af661e7d5350ea052",
4099
+ "fabric-usage.mjs": "1c4d18004639409624ac3516a02f2b60bbf55abdb612e9a96c37e83666eb87a7",
4100
+ "fabric-backups.mjs": "cfd8c9085e3d597a783099c2bd2ffe2f3faa0daaadab46dedd30523894cfeb06",
4101
+ "fabric-descriptor.mjs": "84c35c7ba0ae09fde1dc3f6ab796cd578d008707e77815a0f7b7a80306fa4cce",
4102
+ "fabric-context.mjs": "1112d695e872f9825cbc94f08484974bff3880087bc29b8be59f885f03e8f7be",
4103
+ "fabric-auth.mjs": "782c2aa732f8320f604194660117640a7ea145e12b8155c04e88cef7c516a5b3",
4104
+ "fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
4105
+ "fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
4106
+ "fabric-supervisors.mjs": "d45c38de0cb3ed85e083496c2d3c51dab004454accdd87f4762a512a6d442573",
4107
+ "fabric-service.mjs": "6aa673657427211b491a9b63f94b9847a7e6aa3ee1b7353e1af11f46469803a3",
4108
+ "fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
4109
+ "fabric-interop-rules.mjs": "0933a8cd9567cd39f05575167d92dfef0745aaa591779419e84f94be18b01177",
4110
+ "fabric-interop.mjs": "b66fccf4edc1448b3cda31cf036a789574cf07b5044d8433e4a5bf12a9c9aa7a",
4111
+ "fabric-hub.mjs": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070",
4112
+ "fabric-board-shapes.mjs": "c1db7b7bd0d58d82bb6d8dfbc3cd1547a256a333052d367e82ff1b3edf2804d7",
4113
+ "fabric-board-link.mjs": "ed93ad15e0f48627e545b561c4a562007d1b256c55f650126333aa6566876b12",
4114
+ "fabric-board-session.mjs": "9a70016543dded33bbbfe9dc7705e684387abd1d889598b579f1ca26927023cb",
4115
+ "fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
4116
+ "fabric-board.mjs": "9e7bfe4d412521982224ef12bebfc2ff255eeeaf8d96cf40234ac18de68e7a59",
4117
+ "fabric-http.mjs": "f886bcb49c4353d039387ac9568738dda26697a94dd07fc6a6204500f0bc27bf",
4118
+ "fabric-openrouter.mjs": "ab6c4c7251d563980d895061ee19976bde2f364c21b6354efdd9a9027b1ea139",
4119
+ "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
4120
+ "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
3945
4121
  }
3946
4122
  },
3947
4123
  "data": {
@@ -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. Ships in one plugin with adapting-projects-to-fabric, whose scripts it reuses.
6
6
  metadata:
7
7
  author: PassionCode.ai
8
- version: "0.53.1"
8
+ version: "0.55.0"
9
9
  contract-version: "0.1.0"
10
- contract-commit: "1197a90dc4b57152cabcc71ad17db7559f35a27f"
10
+ contract-commit: "00e050ba7429c0c60261cec871779e0fd6aeeb28"
11
11
  ---
12
12
 
13
13
  # Creating Fabric-compatible agents
@@ -61,6 +61,7 @@ No file is created until every row has an answer. An answer of "later" fails the
61
61
  | **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
62
  | **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) |
63
63
  | **Text for people?** | if it writes anything a person reads (a reply, a message, a post, a report, a UI string), its prompt forbids the em dash (U+2014) and any substitute for it, and a test fails on U+2014 in new output, from the first commit (the resilience reference, *Text for people*) |
64
+ | **Does it answer people?** | if it answers people in a chat, by mail, in store reviews or in a group, it carries from its first release the turn record and the daily `support.quality_daily` report, the lane table with vendor exclusion and fallback recoveries counted, a writer change only after an offline replay, false-state gates and a checker that sees the material first, numbers and account state from tools, the live tail re-read before sending, repair then research then a hold that comes back, hand-offs by cause and never counted or judged as answers, a commitments ledger, a knowledge client that reads the service's `answer` flag, a gap queue and a feed re-read on a new event kind (references/agents-that-answer-people.md) |
64
65
 
65
66
  ## Step 1: the knowledge intake
66
67
 
@@ -93,6 +94,8 @@ prior art of its own:
93
94
  choice, several kinds of input and output, budgets, OpenRouter keys.
94
95
  - [orchestration-and-learning.md](references/orchestration-and-learning.md): the work graph,
95
96
  calling other agents, stops for a person, learning loops, the loop guard.
97
+ - [agents-that-answer-people.md](references/agents-that-answer-people.md): what an agent that
98
+ answers people carries from its first release, each part with the check that proves it.
96
99
 
97
100
  ## Step 2: the project skeleton
98
101
 
@@ -136,7 +139,7 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/adapt_project.py
136
139
  The effect class is declared, never defaulted: ask the author what the agent does outside itself when the request
137
140
  does not say. Cost presets are only for a run whose cost varies; their amounts come from the author or measured runs.
138
141
 
139
- Pin exactly contract `0.1.0` at commit `1197a90dc4b57152cabcc71ad17db7559f35a27f` and
142
+ Pin exactly contract `0.1.0` at commit `00e050ba7429c0c60261cec871779e0fd6aeeb28` and
140
143
  read the pinned guide before implementing protocol details. If this skill is installed
141
144
  without its sibling, the scaffolder is absent: create the bundle by hand from the pinned
142
145
  contract's `docs/guides/connecting-compatible-agents.md` and mark the structural check