From b7014cc4f1e31449f847739063cfa9e6218eb008 Mon Sep 17 00:00:00 2001 From: "andrew.buchkovich@lphq.org" Date: Mon, 6 Jul 2026 15:27:26 -0400 Subject: [PATCH 1/2] golang style inheritance --- README.md | 40 +-- dist/ard/ai-catalog.json | 81 +++---- .../.typeference/bundle.json | 33 +-- .../.typeference/bundle.json | 33 +-- .../.typeference/bundle.json | 33 +-- .../.typeference/bundle.json | 33 +-- .../.typeference/bundle.json | 33 +-- .../.typeference/bundle.json | 33 +-- dist/neutral/executive-assistant/bundle.json | 33 +-- .../executive-assistant/provenance.json | 22 +- dist/neutral/payments-repo-agent/bundle.json | 33 +-- .../payments-repo-agent/provenance.json | 22 +- docs/assets/type-hierarchy.svg | 18 +- docs/specification.md | 34 ++- docs/whitepaper.md | 26 +- .../helio/agents/enterprise-agent.agent.yaml | 5 +- .../agents/executive-assistant.agent.yaml | 5 +- .../agents/payments-repo-agent.agent.yaml | 7 +- examples/helio/agents/person-agent.agent.yaml | 9 +- examples/helio/agents/repo-agent.agent.yaml | 9 +- .../helio/agents/system-object.agent.yaml | 6 - .../interfaces/correspondent.interface.yaml | 2 +- .../repository-observer.interface.yaml | 2 +- .../payments-repository-status.skill.yaml | 2 +- .../helio/skills/prepare-brief.skill.yaml | 2 +- .../helio/skills/repository-status.skill.yaml | 2 +- .../helio/skills/triage-message.skill.yaml | 2 +- output/pdf/typeference-whitepaper.pdf | Bin 106875 -> 106845 bytes src/TypeFerence.Cli/Program.cs | 4 +- src/TypeFerence.Core/Compiler.cs | 2 +- src/TypeFerence.Core/Models.cs | 13 +- src/TypeFerence.Core/ResourceLoader.cs | 7 +- src/TypeFerence.Core/TypeResolver.cs | 229 ++++++++++++------ tests/TypeFerence.Tests/CompilerTests.cs | 200 +++++++++++---- tools/render_whitepaper.py | 12 +- 35 files changed, 611 insertions(+), 416 deletions(-) delete mode 100644 examples/helio/agents/system-object.agent.yaml diff --git a/README.md b/README.md index 9b9c50d..f5df3d6 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,16 @@ **Define organizational agents once. Validate their composition. Compile them into the native shapes your teams already use.** -TypeFerence is an experimental reference implementation of a typed definition and compilation layer for AI agents. It replaces sprawling, duplicated instruction files with a small object model: single inheritance, contract-only interfaces, versioned skills, deterministic compilation, provenance, and artifact diffing. +TypeFerence is an experimental reference implementation of a typed definition and compilation layer for AI agents. It replaces sprawling, duplicated instruction files with Go-like composition: agent embedding, structurally satisfied interfaces, versioned skill contracts, deterministic compilation, provenance, and artifact diffing. -Read the [whitepaper](docs/whitepaper.md), the [rendered PDF](output/pdf/typeference-whitepaper.pdf), or the [draft v1 specification](docs/specification.md). +Read the [whitepaper](docs/whitepaper.md), the [rendered PDF](output/pdf/typeference-whitepaper.pdf), or the [draft v2 specification](docs/specification.md). ```text -system/object -└── helio/enterprise-agent - ├── helio/person-agent - │ └── helio/executive-assistant - └── helio/repo-agent - └── helio/payments-repo-agent +helio/enterprise-agent ──embedded by──> helio/person-agent ──embedded by──> helio/executive-assistant + └─embedded by──> helio/repo-agent ──embedded by──> helio/payments-repo-agent ``` -`system/object` owns mechanics and emits no instructions. Organizations own their enterprise base, policies, voice, and domain knowledge. +There is no universal root and no nominal `implements` declaration. Agents embed reusable agents, promoted behavior is checked for ambiguity, and interfaces are discovered from the resulting slot and skill set. ## Where it fits @@ -29,7 +25,22 @@ TypeFerence source [Agentic Resource Discovery](https://agenticresourcediscovery.org/) helps clients find and verify deployed capabilities. TypeFerence addresses the earlier authoring problem: producing compatible native artifacts from one governed definition. Discovery portability does not itself provide definition portability. -The long-term objective is behavioral equivalence: preserving declared organizational intent across supported hosts closely enough to be measured and governed. V1 provides the common typed source, deterministic adapters, and provenance needed to test that objective; it does not claim that different models or runtimes already behave identically. +The long-term objective is behavioral equivalence: preserving declared organizational intent across supported hosts closely enough to be measured and governed. V2 provides the common typed source, deterministic adapters, and provenance needed to test that objective; it does not claim that different models or runtimes already behave identically. + +The v2 source shape is deliberately small: + +```yaml +schemaVersion: 2 +kind: agent +id: helio/payments-repo-agent@1.0.0 +embeds: + - helio/repo-agent@1.0.0 +skills: + - ref: helio/skills/payments-repository-status@1.0.0 + contract: helio/skills/repository-status@1.0.0 +``` + +Use `emit: false` for reusable agents that should participate in composition without producing their own target bundle. ## Quick start @@ -88,18 +99,19 @@ TypeFerence does not hold signing keys. An external signer can produce detached - `src/` - compiler, target adapters, CLI, and MCP runtime. - `examples/helio/` - fictional cross-domain organization. -- `docs/specification.md` - normative v1 behavior. +- `docs/specification.md` - normative v2 behavior. - `docs/whitepaper.md` and `output/pdf/typeference-whitepaper.pdf` - design paper. - `tests/` - type-system, target, determinism, and MCP integration tests. ## Design boundaries -- One implementation parent; multiple contract-only interfaces. -- Interface and skill contracts are explicit and versioned. +- Agents may embed multiple agents; local slots and skills resolve promoted-name ambiguity. +- Interfaces may embed interfaces and are satisfied structurally, without declarations on agents. +- Skill contracts are explicit and versioned; a local implementation may name the contract it fulfills. - Context is referenced and loaded only with the skill that needs it. - Target adapters emit platform-native shapes while retaining the portable fields each target supports. - Build output is deterministic and carries provenance. -- No deployment state, hosted runtime, or model credentials in v1. +- No deployment state, hosted runtime, or model credentials in v2. - Structural validation does not guarantee identical LLM behavior across models or hosts. - ARD publication wraps selected target outputs; it is not itself a compilation target or execution runtime. diff --git a/dist/ard/ai-catalog.json b/dist/ard/ai-catalog.json index 8e920bd..d85817e 100644 --- a/dist/ard/ai-catalog.json +++ b/dist/ard/ai-catalog.json @@ -13,37 +13,32 @@ "version": "1.0.0", "data": { "schemaVersion": 1, - "digest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "digest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "files": [ { "path": "agents/enterprise-agent.agent.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: agent\nid: helio/enterprise-agent@1.0.0\ndisplayName: Helio Enterprise Agent\ndescription: Shared organizational identity and governance for every Helio agent.\nabstract: true\nextends: system/object@1.0.0\nslots:\n organization: context/organization.md\n safetyPolicy: context/safety-policy.md\nworkingNorms:\n - Preserve a clear audit trail for material decisions.\n - State uncertainty and route work to an accountable owner when authority is unclear.\ncontextFiles:\n - context/organization.md\n - context/safety-policy.md\n" + "content": "schemaVersion: 2\nkind: agent\nid: helio/enterprise-agent@1.0.0\ndisplayName: Helio Enterprise Agent\ndescription: Shared organizational identity and governance for every Helio agent.\nemit: false\nslots:\n organization: context/organization.md\n safetyPolicy: context/safety-policy.md\nworkingNorms:\n - Preserve a clear audit trail for material decisions.\n - State uncertainty and route work to an accountable owner when authority is unclear.\ncontextFiles:\n - context/organization.md\n - context/safety-policy.md\n" }, { "path": "agents/executive-assistant.agent.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: agent\nid: helio/executive-assistant@1.0.0\ndisplayName: Helio Executive Assistant\ndescription: Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.\nextends: helio/person-agent@1.0.0\ncontextFiles:\n - context/executive-rhythm.md\nskills:\n - ref: helio/skills/prepare-brief@1.0.0\n" + "content": "schemaVersion: 2\nkind: agent\nid: helio/executive-assistant@1.0.0\ndisplayName: Helio Executive Assistant\ndescription: Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.\nembeds:\n - helio/person-agent@1.0.0\ncontextFiles:\n - context/executive-rhythm.md\nskills:\n - ref: helio/skills/prepare-brief@1.0.0\n" }, { "path": "agents/payments-repo-agent.agent.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: agent\nid: helio/payments-repo-agent@1.0.0\ndisplayName: Helio Payments Repository Agent\ndescription: Specializes repository assistance for the fictional payments service.\nextends: helio/repo-agent@1.0.0\ncontextFiles:\n - context/payments-service.md\nskills:\n - ref: helio/skills/payments-repository-status@1.0.0\n overrides: helio/skills/repository-status@1.0.0\n" + "content": "schemaVersion: 2\nkind: agent\nid: helio/payments-repo-agent@1.0.0\ndisplayName: Helio Payments Repository Agent\ndescription: Specializes repository assistance for the fictional payments service.\nembeds:\n - helio/repo-agent@1.0.0\ncontextFiles:\n - context/payments-service.md\nskills:\n - ref: helio/skills/payments-repository-status@1.0.0\n contract: helio/skills/repository-status@1.0.0\n" }, { "path": "agents/person-agent.agent.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: agent\nid: helio/person-agent@1.0.0\ndisplayName: Helio Person Agent\ndescription: Handles respectful inbound and outbound assistance for a person.\nabstract: true\nextends: helio/enterprise-agent@1.0.0\nimplements:\n - helio/interfaces/correspondent@1.0.0\nslots:\n principal: context/principal.md\nworkingNorms:\n - Distinguish drafts from messages approved for delivery.\ncontextFiles:\n - context/principal.md\nskills:\n - ref: helio/skills/triage-message@1.0.0\n" + "content": "schemaVersion: 2\nkind: agent\nid: helio/person-agent@1.0.0\ndisplayName: Helio Person Agent\ndescription: Handles respectful inbound and outbound assistance for a person.\nemit: false\nembeds:\n - helio/enterprise-agent@1.0.0\nslots:\n principal: context/principal.md\nworkingNorms:\n - Distinguish drafts from messages approved for delivery.\ncontextFiles:\n - context/principal.md\nskills:\n - ref: helio/skills/triage-message@1.0.0\n" }, { "path": "agents/repo-agent.agent.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: agent\nid: helio/repo-agent@1.0.0\ndisplayName: Helio Repository Agent\ndescription: Applies Helio delivery practices within a software repository.\nabstract: true\nextends: helio/enterprise-agent@1.0.0\nimplements:\n - helio/interfaces/repository-observer@1.0.0\nslots:\n repository: context/repository.md\nworkingNorms:\n - Prefer evidence from tests, diffs, and version control over recollection.\ncontextFiles:\n - context/repository.md\nskills:\n - ref: helio/skills/repository-status@1.0.0\n" - }, - { - "path": "agents/system-object.agent.yaml", - "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: agent\nid: system/object@1.0.0\ndisplayName: System Object\ndescription: Compiler intrinsic root with no behavioral content.\nabstract: true\n" + "content": "schemaVersion: 2\nkind: agent\nid: helio/repo-agent@1.0.0\ndisplayName: Helio Repository Agent\ndescription: Applies Helio delivery practices within a software repository.\nemit: false\nembeds:\n - helio/enterprise-agent@1.0.0\nslots:\n repository: context/repository.md\nworkingNorms:\n - Prefer evidence from tests, diffs, and version control over recollection.\ncontextFiles:\n - context/repository.md\nskills:\n - ref: helio/skills/repository-status@1.0.0\n" }, { "path": "context/executive-rhythm.md", @@ -78,32 +73,32 @@ { "path": "interfaces/correspondent.interface.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: interface\nid: helio/interfaces/correspondent@1.0.0\ndisplayName: Correspondent\ndescription: Contract for agents that assess and route communications.\nrequiresSlots:\n - principal\nrequiresSkills:\n - helio/skills/triage-message@1.0.0\n" + "content": "schemaVersion: 2\nkind: interface\nid: helio/interfaces/correspondent@1.0.0\ndisplayName: Correspondent\ndescription: Contract for agents that assess and route communications.\nrequiresSlots:\n - principal\nrequiresSkills:\n - helio/skills/triage-message@1.0.0\n" }, { "path": "interfaces/repository-observer.interface.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: interface\nid: helio/interfaces/repository-observer@1.0.0\ndisplayName: Repository Observer\ndescription: Contract for agents that can report evidence-backed repository status.\nrequiresSlots:\n - repository\nrequiresSkills:\n - helio/skills/repository-status@1.0.0\n" + "content": "schemaVersion: 2\nkind: interface\nid: helio/interfaces/repository-observer@1.0.0\ndisplayName: Repository Observer\ndescription: Contract for agents that can report evidence-backed repository status.\nrequiresSlots:\n - repository\nrequiresSkills:\n - helio/skills/repository-status@1.0.0\n" }, { "path": "skills/payments-repository-status.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: skill\nid: helio/skills/payments-repository-status@1.0.0\ndisplayName: Payments Repository Status\ndescription: Report payments-service health with contract and reconciliation evidence.\ncontextFiles:\n - context/payments-service.md\ninstructions: |\n Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\n Do not report the service healthy when any required financial-control signal is unavailable.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" + "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/payments-repository-status@1.0.0\ndisplayName: Payments Repository Status\ndescription: Report payments-service health with contract and reconciliation evidence.\ncontextFiles:\n - context/payments-service.md\ninstructions: |\n Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\n Do not report the service healthy when any required financial-control signal is unavailable.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" }, { "path": "skills/prepare-brief.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: skill\nid: helio/skills/prepare-brief@1.0.0\ndisplayName: Prepare Brief\ndescription: Assemble an executive brief, requesting repository evidence when needed.\ncontextFiles:\n - context/executive-rhythm.md\ninstructions: |\n Build a decision-oriented brief from the supplied topic and evidence.\n When repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022topic\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022topic\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022brief\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022openQuestions\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022brief\u0022,\u0022openQuestions\u0022]}\u0027\n" + "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/prepare-brief@1.0.0\ndisplayName: Prepare Brief\ndescription: Assemble an executive brief, requesting repository evidence when needed.\ncontextFiles:\n - context/executive-rhythm.md\ninstructions: |\n Build a decision-oriented brief from the supplied topic and evidence.\n When repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022topic\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022topic\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022brief\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022openQuestions\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022brief\u0022,\u0022openQuestions\u0022]}\u0027\n" }, { "path": "skills/repository-status.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: skill\nid: helio/skills/repository-status@1.0.0\ndisplayName: Repository Status\ndescription: Summarize repository health using current version-control and test evidence.\ninstructions: |\n Inspect the requested repository signals. Report branch state, recent material changes, test evidence, risks, and the next accountable action.\n Mark any unavailable signal explicitly instead of inferring success.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" + "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/repository-status@1.0.0\ndisplayName: Repository Status\ndescription: Summarize repository health using current version-control and test evidence.\ninstructions: |\n Inspect the requested repository signals. Report branch state, recent material changes, test evidence, risks, and the next accountable action.\n Mark any unavailable signal explicitly instead of inferring success.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" }, { "path": "skills/triage-message.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 1\nkind: skill\nid: helio/skills/triage-message@1.0.0\ndisplayName: Triage Message\ndescription: Classify an inbound message and recommend an accountable next action.\ninstructions: |\n Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\n Separate facts from assumptions. Return a concise recommendation; do not send a reply.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022message\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022message\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022summary\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022urgency\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022owner\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022nextAction\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022summary\u0022,\u0022urgency\u0022,\u0022owner\u0022,\u0022nextAction\u0022]}\u0027\n" + "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/triage-message@1.0.0\ndisplayName: Triage Message\ndescription: Classify an inbound message and recommend an accountable next action.\ninstructions: |\n Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\n Separate facts from assumptions. Return a concise recommendation; do not send a reply.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022message\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022message\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022summary\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022urgency\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022owner\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022nextAction\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022summary\u0022,\u0022urgency\u0022,\u0022owner\u0022,\u0022nextAction\u0022]}\u0027\n" } ] }, @@ -135,12 +130,12 @@ { "path": "bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/person-agent@1.0.0\u0022,\n \u0022helio/executive-assistant@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "provenance.json", "mediaType": "application/json", - "content": "[\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n]\n" + "content": "[\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n]\n" }, { "path": "skills/prepare-brief/SKILL.md", @@ -156,7 +151,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "neutral" }, @@ -167,7 +162,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } @@ -194,12 +189,12 @@ { "path": "bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/repo-agent@1.0.0\u0022,\n \u0022helio/payments-repo-agent@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "provenance.json", "mediaType": "application/json", - "content": "[\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n]\n" + "content": "[\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n]\n" }, { "path": "skills/repository-status/SKILL.md", @@ -210,7 +205,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "neutral" }, @@ -221,7 +216,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } @@ -259,7 +254,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/person-agent@1.0.0\u0022,\n \u0022helio/executive-assistant@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -270,7 +265,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "codex" }, @@ -281,7 +276,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } @@ -313,7 +308,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/repo-agent@1.0.0\u0022,\n \u0022helio/payments-repo-agent@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -324,7 +319,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "codex" }, @@ -335,7 +330,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } @@ -368,13 +363,13 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/person-agent@1.0.0\u0022,\n \u0022helio/executive-assistant@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" } ] }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "copilot" }, @@ -385,7 +380,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } @@ -417,13 +412,13 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/repo-agent@1.0.0\u0022,\n \u0022helio/payments-repo-agent@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" } ] }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "copilot" }, @@ -434,7 +429,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } @@ -462,7 +457,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/person-agent@1.0.0\u0022,\n \u0022helio/executive-assistant@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -473,7 +468,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "cursor" }, @@ -484,7 +479,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } @@ -511,7 +506,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022abstract\u0022: false,\n \u0022lineage\u0022: [\n \u0022system/object@1.0.0\u0022,\n \u0022helio/enterprise-agent@1.0.0\u0022,\n \u0022helio/repo-agent@1.0.0\u0022,\n \u0022helio/payments-repo-agent@1.0.0\u0022\n ],\n \u0022interfaces\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022system/object@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022interfaces.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -522,7 +517,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787", + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "cursor" }, @@ -533,7 +528,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:86ecbb754ebf69cabec2631e07b96329739fb23c7b1bf32b90c83ddcec8e6787" + "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" } ] } diff --git a/dist/codex/executive-assistant/.typeference/bundle.json b/dist/codex/executive-assistant/.typeference/bundle.json index c0fffd0..154da1d 100644 --- a/dist/codex/executive-assistant/.typeference/bundle.json +++ b/dist/codex/executive-assistant/.typeference/bundle.json @@ -2,14 +2,11 @@ "id": "helio/executive-assistant@1.0.0", "displayName": "Helio Executive Assistant", "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/person-agent@1.0.0", - "helio/executive-assistant@1.0.0" + "emit": true, + "embeds": [ + "helio/person-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/correspondent@1.0.0" ], "slots": { @@ -80,14 +77,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -120,6 +109,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/person-agent@1.0.0" + }, { "field": "displayName", "source": "helio/person-agent@1.0.0" @@ -141,9 +134,13 @@ "source": "helio/person-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/correspondent@1.0.0", + "field": "satisfies.helio/interfaces/correspondent@1.0.0", "source": "helio/person-agent@1.0.0" }, + { + "field": "embeds.helio/person-agent@1.0.0", + "source": "helio/executive-assistant@1.0.0" + }, { "field": "displayName", "source": "helio/executive-assistant@1.0.0" @@ -155,6 +152,10 @@ { "field": "contextFiles", "source": "helio/executive-assistant@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/correspondent@1.0.0", + "source": "helio/executive-assistant@1.0.0" } ] } diff --git a/dist/codex/payments-repo-agent/.typeference/bundle.json b/dist/codex/payments-repo-agent/.typeference/bundle.json index 7728d17..84012ec 100644 --- a/dist/codex/payments-repo-agent/.typeference/bundle.json +++ b/dist/codex/payments-repo-agent/.typeference/bundle.json @@ -2,14 +2,11 @@ "id": "helio/payments-repo-agent@1.0.0", "displayName": "Helio Payments Repository Agent", "description": "Specializes repository assistance for the fictional payments service.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/repo-agent@1.0.0", - "helio/payments-repo-agent@1.0.0" + "emit": true, + "embeds": [ + "helio/repo-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/repository-observer@1.0.0" ], "slots": { @@ -56,14 +53,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -96,6 +85,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/repo-agent@1.0.0" @@ -117,9 +110,13 @@ "source": "helio/repo-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/repository-observer@1.0.0", + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", "source": "helio/repo-agent@1.0.0" }, + { + "field": "embeds.helio/repo-agent@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/payments-repo-agent@1.0.0" @@ -131,6 +128,10 @@ { "field": "contextFiles", "source": "helio/payments-repo-agent@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" } ] } diff --git a/dist/copilot/executive-assistant/.typeference/bundle.json b/dist/copilot/executive-assistant/.typeference/bundle.json index c0fffd0..154da1d 100644 --- a/dist/copilot/executive-assistant/.typeference/bundle.json +++ b/dist/copilot/executive-assistant/.typeference/bundle.json @@ -2,14 +2,11 @@ "id": "helio/executive-assistant@1.0.0", "displayName": "Helio Executive Assistant", "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/person-agent@1.0.0", - "helio/executive-assistant@1.0.0" + "emit": true, + "embeds": [ + "helio/person-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/correspondent@1.0.0" ], "slots": { @@ -80,14 +77,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -120,6 +109,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/person-agent@1.0.0" + }, { "field": "displayName", "source": "helio/person-agent@1.0.0" @@ -141,9 +134,13 @@ "source": "helio/person-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/correspondent@1.0.0", + "field": "satisfies.helio/interfaces/correspondent@1.0.0", "source": "helio/person-agent@1.0.0" }, + { + "field": "embeds.helio/person-agent@1.0.0", + "source": "helio/executive-assistant@1.0.0" + }, { "field": "displayName", "source": "helio/executive-assistant@1.0.0" @@ -155,6 +152,10 @@ { "field": "contextFiles", "source": "helio/executive-assistant@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/correspondent@1.0.0", + "source": "helio/executive-assistant@1.0.0" } ] } diff --git a/dist/copilot/payments-repo-agent/.typeference/bundle.json b/dist/copilot/payments-repo-agent/.typeference/bundle.json index 7728d17..84012ec 100644 --- a/dist/copilot/payments-repo-agent/.typeference/bundle.json +++ b/dist/copilot/payments-repo-agent/.typeference/bundle.json @@ -2,14 +2,11 @@ "id": "helio/payments-repo-agent@1.0.0", "displayName": "Helio Payments Repository Agent", "description": "Specializes repository assistance for the fictional payments service.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/repo-agent@1.0.0", - "helio/payments-repo-agent@1.0.0" + "emit": true, + "embeds": [ + "helio/repo-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/repository-observer@1.0.0" ], "slots": { @@ -56,14 +53,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -96,6 +85,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/repo-agent@1.0.0" @@ -117,9 +110,13 @@ "source": "helio/repo-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/repository-observer@1.0.0", + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", "source": "helio/repo-agent@1.0.0" }, + { + "field": "embeds.helio/repo-agent@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/payments-repo-agent@1.0.0" @@ -131,6 +128,10 @@ { "field": "contextFiles", "source": "helio/payments-repo-agent@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" } ] } diff --git a/dist/cursor/executive-assistant/.typeference/bundle.json b/dist/cursor/executive-assistant/.typeference/bundle.json index c0fffd0..154da1d 100644 --- a/dist/cursor/executive-assistant/.typeference/bundle.json +++ b/dist/cursor/executive-assistant/.typeference/bundle.json @@ -2,14 +2,11 @@ "id": "helio/executive-assistant@1.0.0", "displayName": "Helio Executive Assistant", "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/person-agent@1.0.0", - "helio/executive-assistant@1.0.0" + "emit": true, + "embeds": [ + "helio/person-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/correspondent@1.0.0" ], "slots": { @@ -80,14 +77,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -120,6 +109,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/person-agent@1.0.0" + }, { "field": "displayName", "source": "helio/person-agent@1.0.0" @@ -141,9 +134,13 @@ "source": "helio/person-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/correspondent@1.0.0", + "field": "satisfies.helio/interfaces/correspondent@1.0.0", "source": "helio/person-agent@1.0.0" }, + { + "field": "embeds.helio/person-agent@1.0.0", + "source": "helio/executive-assistant@1.0.0" + }, { "field": "displayName", "source": "helio/executive-assistant@1.0.0" @@ -155,6 +152,10 @@ { "field": "contextFiles", "source": "helio/executive-assistant@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/correspondent@1.0.0", + "source": "helio/executive-assistant@1.0.0" } ] } diff --git a/dist/cursor/payments-repo-agent/.typeference/bundle.json b/dist/cursor/payments-repo-agent/.typeference/bundle.json index 7728d17..84012ec 100644 --- a/dist/cursor/payments-repo-agent/.typeference/bundle.json +++ b/dist/cursor/payments-repo-agent/.typeference/bundle.json @@ -2,14 +2,11 @@ "id": "helio/payments-repo-agent@1.0.0", "displayName": "Helio Payments Repository Agent", "description": "Specializes repository assistance for the fictional payments service.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/repo-agent@1.0.0", - "helio/payments-repo-agent@1.0.0" + "emit": true, + "embeds": [ + "helio/repo-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/repository-observer@1.0.0" ], "slots": { @@ -56,14 +53,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -96,6 +85,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/repo-agent@1.0.0" @@ -117,9 +110,13 @@ "source": "helio/repo-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/repository-observer@1.0.0", + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", "source": "helio/repo-agent@1.0.0" }, + { + "field": "embeds.helio/repo-agent@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/payments-repo-agent@1.0.0" @@ -131,6 +128,10 @@ { "field": "contextFiles", "source": "helio/payments-repo-agent@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" } ] } diff --git a/dist/neutral/executive-assistant/bundle.json b/dist/neutral/executive-assistant/bundle.json index c0fffd0..154da1d 100644 --- a/dist/neutral/executive-assistant/bundle.json +++ b/dist/neutral/executive-assistant/bundle.json @@ -2,14 +2,11 @@ "id": "helio/executive-assistant@1.0.0", "displayName": "Helio Executive Assistant", "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/person-agent@1.0.0", - "helio/executive-assistant@1.0.0" + "emit": true, + "embeds": [ + "helio/person-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/correspondent@1.0.0" ], "slots": { @@ -80,14 +77,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -120,6 +109,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/person-agent@1.0.0" + }, { "field": "displayName", "source": "helio/person-agent@1.0.0" @@ -141,9 +134,13 @@ "source": "helio/person-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/correspondent@1.0.0", + "field": "satisfies.helio/interfaces/correspondent@1.0.0", "source": "helio/person-agent@1.0.0" }, + { + "field": "embeds.helio/person-agent@1.0.0", + "source": "helio/executive-assistant@1.0.0" + }, { "field": "displayName", "source": "helio/executive-assistant@1.0.0" @@ -155,6 +152,10 @@ { "field": "contextFiles", "source": "helio/executive-assistant@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/correspondent@1.0.0", + "source": "helio/executive-assistant@1.0.0" } ] } diff --git a/dist/neutral/executive-assistant/provenance.json b/dist/neutral/executive-assistant/provenance.json index 0f1123b..012f14c 100644 --- a/dist/neutral/executive-assistant/provenance.json +++ b/dist/neutral/executive-assistant/provenance.json @@ -1,12 +1,4 @@ [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -39,6 +31,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/person-agent@1.0.0" + }, { "field": "displayName", "source": "helio/person-agent@1.0.0" @@ -60,9 +56,13 @@ "source": "helio/person-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/correspondent@1.0.0", + "field": "satisfies.helio/interfaces/correspondent@1.0.0", "source": "helio/person-agent@1.0.0" }, + { + "field": "embeds.helio/person-agent@1.0.0", + "source": "helio/executive-assistant@1.0.0" + }, { "field": "displayName", "source": "helio/executive-assistant@1.0.0" @@ -74,5 +74,9 @@ { "field": "contextFiles", "source": "helio/executive-assistant@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/correspondent@1.0.0", + "source": "helio/executive-assistant@1.0.0" } ] diff --git a/dist/neutral/payments-repo-agent/bundle.json b/dist/neutral/payments-repo-agent/bundle.json index 7728d17..84012ec 100644 --- a/dist/neutral/payments-repo-agent/bundle.json +++ b/dist/neutral/payments-repo-agent/bundle.json @@ -2,14 +2,11 @@ "id": "helio/payments-repo-agent@1.0.0", "displayName": "Helio Payments Repository Agent", "description": "Specializes repository assistance for the fictional payments service.", - "abstract": false, - "lineage": [ - "system/object@1.0.0", - "helio/enterprise-agent@1.0.0", - "helio/repo-agent@1.0.0", - "helio/payments-repo-agent@1.0.0" + "emit": true, + "embeds": [ + "helio/repo-agent@1.0.0" ], - "interfaces": [ + "satisfies": [ "helio/interfaces/repository-observer@1.0.0" ], "slots": { @@ -56,14 +53,6 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -96,6 +85,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/repo-agent@1.0.0" @@ -117,9 +110,13 @@ "source": "helio/repo-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/repository-observer@1.0.0", + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", "source": "helio/repo-agent@1.0.0" }, + { + "field": "embeds.helio/repo-agent@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/payments-repo-agent@1.0.0" @@ -131,6 +128,10 @@ { "field": "contextFiles", "source": "helio/payments-repo-agent@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" } ] } diff --git a/dist/neutral/payments-repo-agent/provenance.json b/dist/neutral/payments-repo-agent/provenance.json index 0956a8b..4b865a5 100644 --- a/dist/neutral/payments-repo-agent/provenance.json +++ b/dist/neutral/payments-repo-agent/provenance.json @@ -1,12 +1,4 @@ [ - { - "field": "displayName", - "source": "system/object@1.0.0" - }, - { - "field": "description", - "source": "system/object@1.0.0" - }, { "field": "displayName", "source": "helio/enterprise-agent@1.0.0" @@ -39,6 +31,10 @@ "field": "contextFiles", "source": "helio/enterprise-agent@1.0.0" }, + { + "field": "embeds.helio/enterprise-agent@1.0.0", + "source": "helio/repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/repo-agent@1.0.0" @@ -60,9 +56,13 @@ "source": "helio/repo-agent@1.0.0" }, { - "field": "interfaces.helio/interfaces/repository-observer@1.0.0", + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", "source": "helio/repo-agent@1.0.0" }, + { + "field": "embeds.helio/repo-agent@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" + }, { "field": "displayName", "source": "helio/payments-repo-agent@1.0.0" @@ -74,5 +74,9 @@ { "field": "contextFiles", "source": "helio/payments-repo-agent@1.0.0" + }, + { + "field": "satisfies.helio/interfaces/repository-observer@1.0.0", + "source": "helio/payments-repo-agent@1.0.0" } ] diff --git a/docs/assets/type-hierarchy.svg b/docs/assets/type-hierarchy.svg index 8ce247b..0c0c833 100644 --- a/docs/assets/type-hierarchy.svg +++ b/docs/assets/type-hierarchy.svg @@ -1,11 +1,11 @@ - TypeFerence type hierarchySystem object leads to a Helio enterprise base, then person and repository lineages. - - - system/objectmechanics only - no behavior - helio/enterprise-agentidentity, governance, shared norms - helio/person-agentinbound and outbound assistance - helio/repo-agentevidence-backed repository work - executive-assistantbriefings and coordination - payments-repo-agentcompatible skill override + TypeFerence agent embeddingA reusable Helio enterprise agent is embedded by person and repository agents, which are embedded by concrete agents. + + + embedded by + helio/enterprise-agentgovernance and shared norms + helio/person-agentpromotes enterprise behavior + helio/repo-agentpromotes enterprise behavior + executive-assistantstructurally a correspondent + payments-repo-agentbinds a compatible skill contract diff --git a/docs/specification.md b/docs/specification.md index 48af596..374673c 100644 --- a/docs/specification.md +++ b/docs/specification.md @@ -1,6 +1,6 @@ # TypeFerence Draft Specification -Status: experimental reference draft, July 2026. The manifest `schemaVersion` is 1; this document is not a claim of ecosystem-standard or production-stable status. +Status: experimental reference draft, July 2026. Typed resources use `schemaVersion: 2`; this document is not a claim of ecosystem-standard or production-stable status. ## Scope and non-goals @@ -10,35 +10,33 @@ Agentic Resource Discovery (ARD) can advertise compiled TypeFerence outputs. ARD ## Resource identity -A source tree contains YAML documents with `schemaVersion: 1`, a `kind`, and an `id`. IDs use `namespace/name@semantic-version`. Supported kinds are `agent`, `interface`, and `skill`. - -## Root object - -`system/object@1.0.0` is the universal abstract root. It MUST be behavior-free: no parent, interfaces, skills, slots, norms, context files, or instructions. A non-system enterprise agent MUST directly extend it. TypeFerence owns root semantics; each organization owns its behavioral base. +A source tree contains YAML documents with `schemaVersion: 2`, a `kind`, and an `id`. IDs use `namespace/name@semantic-version`. Supported kinds are `agent`, `interface`, and `skill`. ## Agents -An agent MAY extend exactly one agent and MAY implement multiple interfaces. Except for `system/object`, every agent MUST have a parent. A lineage may be arbitrarily deep but MUST NOT contain a cycle. +An agent MAY embed zero or more agents. Embedding promotes the embedded agents' slots, norms, contexts, and skills into the embedding agent. An embedding graph MUST NOT contain a cycle. No universal root is required. + +An agent with `emit: false` participates in composition and validation but does not produce a target bundle. This is useful for reusable organizational or domain components without introducing abstract base types. -Resolution proceeds from the root toward the concrete agent: +Resolution proceeds from embedded agents toward the embedding agent: -1. Scalars use the nearest non-empty derived value. -2. Slots are keyed; a derived value replaces the same key. -3. Norms and context paths append and deduplicate in first-seen order. -4. Skills are keyed by contract ID. -5. Implemented interfaces accumulate through the lineage. +1. Display name and description belong to the declaring agent and are not promoted. +2. Slots are promoted by name. The shallowest declaration wins; conflicting declarations at the same depth are ambiguous unless the embedding agent declares that slot locally. +3. Norms and context paths append in embedding order and deduplicate in first-seen order. +4. Skills are promoted by contract ID. The shallowest implementation wins; conflicting implementations at the same depth are ambiguous unless the embedding agent declares that contract locally. +5. Interfaces are computed structurally from the final promoted member set. Every resolved contribution records its source resource in provenance. ## Interfaces -Interfaces are contracts only. They MAY require slot names and skill contract IDs. They MUST NOT extend another resource or provide implementation. Resolution fails when a concrete or abstract implementing agent does not satisfy every accumulated requirement. +Interfaces are contracts only. They MAY require slot names and skill contract IDs, and MAY embed other interfaces. They MUST NOT provide implementation. Every agent whose resolved slots and skill contracts contain all requirements satisfies the interface implicitly; agents do not declare `implements`. Interface embedding MUST NOT contain a cycle. -## Skills and overrides +## Skills and contract implementations -A skill defines instructions, conditional context references, and JSON input/output schemas. Adding a skill establishes its own ID as the contract ID. An override names both a replacement implementation and the inherited contract it replaces. +A skill defines instructions, conditional context references, and JSON input/output schemas. Adding a skill establishes its own ID as the contract ID. A binding MAY name a different `contract`; its `ref` is then the local implementation of that contract. -An override MUST preserve canonical input and output schemas. It MAY change instructions, description, and conditional context. The derived dispatch name resolves to the nearest implementation while the base agent retains its own namespace. +A contract implementation MUST preserve canonical input and output schemas. It MAY change instructions, description, and conditional context. The outer dispatch name resolves to the local implementation while the embedded agent retains its own namespace. ## Dispatch @@ -83,7 +81,7 @@ The v1 package media types are experimental `application/vnd.typeference.source- TypeFerence targets the draft AI Catalog Trust Manifest as published at . Draft evolution MAY require corresponding changes in a future TypeFerence schema version. -A source root MAY contain `typeference.trust.yaml`. The file is part of the canonical source package and its digest, but it is not a typed agent resource and does not participate in inheritance or behavioral resolution. A different trust configuration beneath the source root MAY be selected explicitly. Trust metadata is publication configuration: native target bundles remain usable without ARD. +A source root MAY contain `typeference.trust.yaml`. The file is part of the canonical source package and its digest, but it is not a typed agent resource and does not participate in embedding or behavioral resolution. A different trust configuration beneath the source root MAY be selected explicitly. Trust metadata is publication configuration: native target bundles remain usable without ARD. The trust configuration has `schemaVersion: 1` and MAY contain `source` and `bundles` profiles. At least one profile is required. A source profile requires a literal `identity`. A bundles profile requires an `identityTemplate` containing both `{agent}` and `{target}`; `{publisher}` and `{version}` are also supported. Each profile MAY contain: diff --git a/docs/whitepaper.md b/docs/whitepaper.md index 6292db7..200e5f0 100644 --- a/docs/whitepaper.md +++ b/docs/whitepaper.md @@ -8,37 +8,37 @@ TypeFerence contributors - July 2026 Organizations are teaching AI assistants the same business rules repeatedly: once for a coding agent, again for an executive assistant, again for each repository, and again for every vendor-specific Markdown format. The result is semantic drift hidden inside apparently simple files. -TypeFerence treats agent definitions as typed source code. Organizations define an instruction-free root, an enterprise-owned base, domain agents, contract-only interfaces, and versioned skills. A deterministic compiler resolves those definitions and emits native artifacts for Codex, GitHub Copilot, Cursor, neutral Agent Markdown, and MCP. The central result is not merely portability. It is coherent reuse of domain decisions across people, repositories, tools, and time. Behavioral equivalence across hosts is the long-term objective; v1 supplies a typed baseline from which equivalence can be evaluated rather than claiming it has already been achieved. +TypeFerence treats agent definitions as typed source code. Organizations define reusable agents, structurally satisfied interfaces, and versioned skills, then combine behavior through Go-like embedding. A deterministic compiler resolves those definitions and emits native artifacts for Codex, GitHub Copilot, Cursor, neutral Agent Markdown, and MCP. The central result is not merely portability. It is coherent reuse of domain decisions across people, repositories, tools, and time. Behavioral equivalence across hosts is the long-term objective; v2 supplies a typed baseline from which equivalence can be evaluated rather than claiming it has already been achieved. ## 1. The coherence problem -Markdown is an excellent runtime format and a poor organization-wide type system. As agent adoption grows, similar instructions appear in many places. Security language diverges. Status-reporting methods acquire incompatible meanings. A policy correction must be rediscovered and edited in dozens of files. Reviewers can see textual differences but cannot reliably identify which behavior is inherited, overridden, or accidentally missing. +Markdown is an excellent runtime format and a poor organization-wide type system. As agent adoption grows, similar instructions appear in many places. Security language diverges. Status-reporting methods acquire incompatible meanings. A policy correction must be rediscovered and edited in dozens of files. Reviewers can see textual differences but cannot reliably identify which behavior was embedded, replaced, or accidentally omitted. The underlying problem is repeated domain modeling. Each local agent solves identity, capability, context selection, and governance again. Vendor portability is one visible symptom; duplicated organizational reasoning is the larger cost. TypeFerence introduces a canonical typed layer above runtime Markdown. Source definitions are small. Skills conditionally reference context. Compilation is deterministic. The generated artifacts remain ordinary files that existing tools understand. -## 2. Semantics belong below behavior +## 2. Composition over ancestry -TypeFerence defines `system/object@1.0.0` as an abstract and deliberately empty root. It supplies no voice, policies, permissions, or context. It exists to define identity, inheritance, validation, dispatch, and provenance. +TypeFerence has no universal root. Organizations can define a reusable enterprise agent as the home for organization-wide norms and governance, then embed it wherever those behaviors belong. Agents with unrelated responsibilities do not need to pretend they share an ancestor. -Every organization then creates a minimal enterprise base. That base is the first behavioral object and therefore the correct home for organization-wide norms and governance. Domain bases and concrete agents specialize it through a single implementation lineage. +An embedding agent promotes the slots, norms, context, and skill contracts of its embedded agents. It can embed more than one reusable component. Local declarations resolve promoted-name conflicts explicitly, so composition never depends on a hidden linearization order. -![Type hierarchy](assets/type-hierarchy.svg) +![Agent embedding](assets/type-hierarchy.svg) -This separation matters. If a framework ships an opinionated root prompt, every downstream organization inherits the framework author's culture. TypeFerence instead owns semantics while organizations own behavior. +This separation matters. The framework owns composition mechanics while organizations own behavior. Nothing is inherited merely because every resource is forced beneath the same root. ## 3. A sustainable object model -Agents have one implementation parent and may implement multiple contract-only interfaces. Single inheritance eliminates ambiguous diamond resolution. Interfaces state required slots and skill signatures but contribute no implementation. +Agents may embed multiple agents. Interfaces state required slots and skill contracts but contribute no implementation, and interfaces may themselves embed narrower interfaces. Agents satisfy them implicitly when their resolved member sets match—there is no nominal `implements` list to drift out of sync. -Skills behave like versioned methods. A base repository agent may provide `repository-status`. A payments repository agent can override its implementation while preserving the same JSON input and output contracts. Callers use the specialized namespace and receive the nearest compatible implementation. +Skills behave like versioned methods. A repository agent may provide `repository-status`. A payments repository agent can bind a specialized implementation to that promoted contract while preserving the same JSON input and output schemas. Callers use the outer namespace and receive its explicitly selected implementation. -This is structural substitutability at a declared contract boundary rather than text concatenation. An interface can require a status capability without knowing which concrete repository agent will satisfy it. Compilation rejects missing requirements and contract-breaking overrides before runtime. Whether two model executions behave equivalently remains an empirical question for evaluation, not a compiler guarantee. +This is structural substitutability rather than text concatenation. An interface can require a status capability without knowing which concrete repository agent will satisfy it. Compilation reports structural matches, rejects ambiguous promotion, and rejects contract-breaking implementations before runtime. Whether two model executions behave equivalently remains an empirical question for evaluation, not a compiler guarantee. ## 4. Compilation and native targets -The compiler parses resources, validates references, resolves a single lineage, checks interfaces, canonicalizes skill contracts, and creates a normalized intermediate representation. Target adapters then emit platform-native artifacts. +The compiler parses resources, validates references, resolves embedding graphs, computes structural interface satisfaction, canonicalizes skill contracts, and creates a normalized intermediate representation. Target adapters then emit platform-native artifacts. ![Compiler pipeline](assets/compiler-pipeline.svg) @@ -84,7 +84,7 @@ This arrangement preserves distinct responsibilities. The executive assistant ow Traditional infrastructure tools made declarative diffs operationally important. TypeFerence applies the useful portion of that idea without coupling compilation to deployment. Its lifecycle is author, validate, resolve, compile, diff, and publish. -A change to an enterprise norm can be compiled across every concrete agent. Reviewers can inspect exactly which target artifacts changed. Provenance answers why a line exists and which ancestor or skill supplied it. Contract validation prevents an apparently harmless specialization from silently changing what callers may send or expect. +A change to an enterprise norm can be compiled across every concrete agent. Reviewers can inspect exactly which target artifacts changed. Provenance answers why a line exists and which embedded agent or skill supplied it. Contract validation prevents an apparently harmless specialization from silently changing what callers may send or expect. This enables governance through normal software practices: pull requests, deterministic CI, golden artifacts, versioned contracts, and explicit ownership. @@ -100,7 +100,7 @@ The important boundary should remain: portable mechanics in TypeFerence, behavio Agent coherence is not achieved by finding one perfect prompt. It is achieved by giving organizational behavior a maintainable type system and compiling that system into the places where work happens. -TypeFerence offers a compact thesis: define agent configuration once, inherit intentionally, override compatibly, load context when needed, and emit native artifacts for each execution surface. The result is less duplicated Markdown, clearer ownership, and reviewable change. The route toward behavioral equivalence is then concrete: declare shared contracts, compile traceable target variants, and evaluate those variants against the same scenarios. +TypeFerence offers a compact thesis: define agent configuration once, embed intentionally, implement contracts compatibly, load context when needed, and emit native artifacts for each execution surface. The result is less duplicated Markdown, clearer ownership, and reviewable change. The route toward behavioral equivalence is then concrete: declare shared contracts, compile traceable target variants, and evaluate those variants against the same scenarios. ## References diff --git a/examples/helio/agents/enterprise-agent.agent.yaml b/examples/helio/agents/enterprise-agent.agent.yaml index 8beaaad..3925682 100644 --- a/examples/helio/agents/enterprise-agent.agent.yaml +++ b/examples/helio/agents/enterprise-agent.agent.yaml @@ -1,10 +1,9 @@ -schemaVersion: 1 +schemaVersion: 2 kind: agent id: helio/enterprise-agent@1.0.0 displayName: Helio Enterprise Agent description: Shared organizational identity and governance for every Helio agent. -abstract: true -extends: system/object@1.0.0 +emit: false slots: organization: context/organization.md safetyPolicy: context/safety-policy.md diff --git a/examples/helio/agents/executive-assistant.agent.yaml b/examples/helio/agents/executive-assistant.agent.yaml index 756c7dd..c65989c 100644 --- a/examples/helio/agents/executive-assistant.agent.yaml +++ b/examples/helio/agents/executive-assistant.agent.yaml @@ -1,9 +1,10 @@ -schemaVersion: 1 +schemaVersion: 2 kind: agent id: helio/executive-assistant@1.0.0 displayName: Helio Executive Assistant description: Coordinates an executive's correspondence, briefings, and cross-agent requests. -extends: helio/person-agent@1.0.0 +embeds: + - helio/person-agent@1.0.0 contextFiles: - context/executive-rhythm.md skills: diff --git a/examples/helio/agents/payments-repo-agent.agent.yaml b/examples/helio/agents/payments-repo-agent.agent.yaml index f66684d..7059023 100644 --- a/examples/helio/agents/payments-repo-agent.agent.yaml +++ b/examples/helio/agents/payments-repo-agent.agent.yaml @@ -1,11 +1,12 @@ -schemaVersion: 1 +schemaVersion: 2 kind: agent id: helio/payments-repo-agent@1.0.0 displayName: Helio Payments Repository Agent description: Specializes repository assistance for the fictional payments service. -extends: helio/repo-agent@1.0.0 +embeds: + - helio/repo-agent@1.0.0 contextFiles: - context/payments-service.md skills: - ref: helio/skills/payments-repository-status@1.0.0 - overrides: helio/skills/repository-status@1.0.0 + contract: helio/skills/repository-status@1.0.0 diff --git a/examples/helio/agents/person-agent.agent.yaml b/examples/helio/agents/person-agent.agent.yaml index f3cabee..d094525 100644 --- a/examples/helio/agents/person-agent.agent.yaml +++ b/examples/helio/agents/person-agent.agent.yaml @@ -1,12 +1,11 @@ -schemaVersion: 1 +schemaVersion: 2 kind: agent id: helio/person-agent@1.0.0 displayName: Helio Person Agent description: Handles respectful inbound and outbound assistance for a person. -abstract: true -extends: helio/enterprise-agent@1.0.0 -implements: - - helio/interfaces/correspondent@1.0.0 +emit: false +embeds: + - helio/enterprise-agent@1.0.0 slots: principal: context/principal.md workingNorms: diff --git a/examples/helio/agents/repo-agent.agent.yaml b/examples/helio/agents/repo-agent.agent.yaml index 2af0289..7d01d07 100644 --- a/examples/helio/agents/repo-agent.agent.yaml +++ b/examples/helio/agents/repo-agent.agent.yaml @@ -1,12 +1,11 @@ -schemaVersion: 1 +schemaVersion: 2 kind: agent id: helio/repo-agent@1.0.0 displayName: Helio Repository Agent description: Applies Helio delivery practices within a software repository. -abstract: true -extends: helio/enterprise-agent@1.0.0 -implements: - - helio/interfaces/repository-observer@1.0.0 +emit: false +embeds: + - helio/enterprise-agent@1.0.0 slots: repository: context/repository.md workingNorms: diff --git a/examples/helio/agents/system-object.agent.yaml b/examples/helio/agents/system-object.agent.yaml deleted file mode 100644 index 7761c45..0000000 --- a/examples/helio/agents/system-object.agent.yaml +++ /dev/null @@ -1,6 +0,0 @@ -schemaVersion: 1 -kind: agent -id: system/object@1.0.0 -displayName: System Object -description: Compiler intrinsic root with no behavioral content. -abstract: true diff --git a/examples/helio/interfaces/correspondent.interface.yaml b/examples/helio/interfaces/correspondent.interface.yaml index b163329..06ba11c 100644 --- a/examples/helio/interfaces/correspondent.interface.yaml +++ b/examples/helio/interfaces/correspondent.interface.yaml @@ -1,4 +1,4 @@ -schemaVersion: 1 +schemaVersion: 2 kind: interface id: helio/interfaces/correspondent@1.0.0 displayName: Correspondent diff --git a/examples/helio/interfaces/repository-observer.interface.yaml b/examples/helio/interfaces/repository-observer.interface.yaml index 0b1efff..3762244 100644 --- a/examples/helio/interfaces/repository-observer.interface.yaml +++ b/examples/helio/interfaces/repository-observer.interface.yaml @@ -1,4 +1,4 @@ -schemaVersion: 1 +schemaVersion: 2 kind: interface id: helio/interfaces/repository-observer@1.0.0 displayName: Repository Observer diff --git a/examples/helio/skills/payments-repository-status.skill.yaml b/examples/helio/skills/payments-repository-status.skill.yaml index ad47ec1..4251888 100644 --- a/examples/helio/skills/payments-repository-status.skill.yaml +++ b/examples/helio/skills/payments-repository-status.skill.yaml @@ -1,4 +1,4 @@ -schemaVersion: 1 +schemaVersion: 2 kind: skill id: helio/skills/payments-repository-status@1.0.0 displayName: Payments Repository Status diff --git a/examples/helio/skills/prepare-brief.skill.yaml b/examples/helio/skills/prepare-brief.skill.yaml index a98402d..0711c2c 100644 --- a/examples/helio/skills/prepare-brief.skill.yaml +++ b/examples/helio/skills/prepare-brief.skill.yaml @@ -1,4 +1,4 @@ -schemaVersion: 1 +schemaVersion: 2 kind: skill id: helio/skills/prepare-brief@1.0.0 displayName: Prepare Brief diff --git a/examples/helio/skills/repository-status.skill.yaml b/examples/helio/skills/repository-status.skill.yaml index 3f4394e..133cde6 100644 --- a/examples/helio/skills/repository-status.skill.yaml +++ b/examples/helio/skills/repository-status.skill.yaml @@ -1,4 +1,4 @@ -schemaVersion: 1 +schemaVersion: 2 kind: skill id: helio/skills/repository-status@1.0.0 displayName: Repository Status diff --git a/examples/helio/skills/triage-message.skill.yaml b/examples/helio/skills/triage-message.skill.yaml index f643e3c..b685fe4 100644 --- a/examples/helio/skills/triage-message.skill.yaml +++ b/examples/helio/skills/triage-message.skill.yaml @@ -1,4 +1,4 @@ -schemaVersion: 1 +schemaVersion: 2 kind: skill id: helio/skills/triage-message@1.0.0 displayName: Triage Message diff --git a/output/pdf/typeference-whitepaper.pdf b/output/pdf/typeference-whitepaper.pdf index f614886c6bb8b1a4ecfeee0d657683c220c49cc9..ea9220f791c3455f1d319a1c3f7ac2e9b669c855 100644 GIT binary patch delta 50506 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�FAb(I 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∈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 G`sp894;Zrm diff --git a/src/TypeFerence.Cli/Program.cs b/src/TypeFerence.Cli/Program.cs index 556df39..9f88d22 100644 --- a/src/TypeFerence.Cli/Program.cs +++ b/src/TypeFerence.Cli/Program.cs @@ -111,8 +111,8 @@ private static async Task ServeAsync(string[] args) { var source = Required(args, 1, "source or compiled directory"); var agents = Directory.EnumerateFiles(source, "*.yaml", SearchOption.AllDirectories).Any() - ? new TypeFerenceCompiler().Validate(source).Where(x => !x.Abstract).ToArray() - : TypeFerenceCompiler.LoadCompiled(source).Where(x => !x.Abstract).ToArray(); + ? new TypeFerenceCompiler().Validate(source).Where(x => x.Emit).ToArray() + : TypeFerenceCompiler.LoadCompiled(source).Where(x => x.Emit).ToArray(); var tools = agents.SelectMany(agent => agent.Skills.Select(skill => { Func handler = arguments => JsonSerializer.Serialize(TypeFerenceCompiler.Invoke(agent, skill, arguments)); diff --git a/src/TypeFerence.Core/Compiler.cs b/src/TypeFerence.Core/Compiler.cs index 347021b..e0c2f2b 100644 --- a/src/TypeFerence.Core/Compiler.cs +++ b/src/TypeFerence.Core/Compiler.cs @@ -31,7 +31,7 @@ public IReadOnlyList Build( { var trust = TrustConfigurationLoader.Load(source, ardPublication?.TrustConfigurationPath); var resources = new ResourceLoader().Load(source, trust?.Path); - var agents = new TypeResolver(resources).ResolveAll().Where(x => !x.Abstract).OrderBy(x => x.Id, StringComparer.Ordinal).ToArray(); + var agents = new TypeResolver(resources).ResolveAll().Where(x => x.Emit).OrderBy(x => x.Id, StringComparer.Ordinal).ToArray(); var requestedTargets = targets.Distinct().Order().ToArray(); if (requestedTargets.Length == 0) throw new TypeFerenceException("At least one compilation target is required"); var root = Path.GetFullPath(output); diff --git a/src/TypeFerence.Core/Models.cs b/src/TypeFerence.Core/Models.cs index f771299..49f9e28 100644 --- a/src/TypeFerence.Core/Models.cs +++ b/src/TypeFerence.Core/Models.cs @@ -9,9 +9,8 @@ public sealed class ResourceDocument public string Id { get; set; } = ""; public string DisplayName { get; set; } = ""; public string Description { get; set; } = ""; - public bool Abstract { get; set; } - public string? Extends { get; set; } - public List Implements { get; set; } = []; + public bool Emit { get; set; } = true; + public List Embeds { get; set; } = []; public List RequiresSlots { get; set; } = []; public List RequiresSkills { get; set; } = []; public SortedDictionary Slots { get; set; } = new(StringComparer.Ordinal); @@ -26,7 +25,7 @@ public sealed class ResourceDocument public sealed class SkillBinding { public string Ref { get; set; } = ""; - public string? Overrides { get; set; } + public string? Contract { get; set; } } public sealed record ProvenanceEntry(string Field, string Source); @@ -49,9 +48,9 @@ public sealed class ResolvedAgent public string Id { get; init; } = ""; public string DisplayName { get; init; } = ""; public string Description { get; init; } = ""; - public bool Abstract { get; init; } - public IReadOnlyList Lineage { get; init; } = []; - public IReadOnlyList Interfaces { get; init; } = []; + public bool Emit { get; init; } = true; + public IReadOnlyList Embeds { get; init; } = []; + public IReadOnlyList Satisfies { get; init; } = []; public IReadOnlyDictionary Slots { get; init; } = new SortedDictionary(); public IReadOnlyList WorkingNorms { get; init; } = []; public IReadOnlyList ContextFiles { get; init; } = []; diff --git a/src/TypeFerence.Core/ResourceLoader.cs b/src/TypeFerence.Core/ResourceLoader.cs index 5e6f772..ff23437 100644 --- a/src/TypeFerence.Core/ResourceLoader.cs +++ b/src/TypeFerence.Core/ResourceLoader.cs @@ -44,19 +44,16 @@ public IReadOnlyDictionary Load(string sourceDirectory if (!result.TryAdd(resource.Id, resource)) throw new TypeFerenceException($"Duplicate resource id: {resource.Id}"); } if (result.Count == 0) throw new TypeFerenceException($"No YAML resources found under {root}"); - if (!result.ContainsKey("system/object@1.0.0")) - throw new TypeFerenceException("Source must define system/object@1.0.0"); return result; } private static void ValidateShape(ResourceDocument resource, string file, string root) { - if (resource.SchemaVersion != 1) throw new TypeFerenceException($"{file}: schemaVersion must be 1"); + if (resource.SchemaVersion != 2) throw new TypeFerenceException($"{file}: schemaVersion must be 2"); if (resource.Kind is not ("agent" or "interface" or "skill")) throw new TypeFerenceException($"{file}: unknown kind '{resource.Kind}'"); if (!ResourceId.IsMatch(resource.Id)) throw new TypeFerenceException($"{file}: id must use lowercase namespace/name@semantic-version"); - if (resource.Kind == "interface" && resource.Extends is not null) throw new TypeFerenceException($"{file}: interfaces cannot extend resources"); - if (resource.Kind != "agent" && resource.Implements.Count != 0) throw new TypeFerenceException($"{file}: only agents implement interfaces"); + if (resource.Kind == "skill" && resource.Embeds.Count != 0) throw new TypeFerenceException($"{file}: skills cannot embed resources"); foreach (var relative in resource.ContextFiles.Concat(resource.Slots.Values)) { var full = Path.GetFullPath(Path.Combine(root, relative.Replace('/', Path.DirectorySeparatorChar))); diff --git a/src/TypeFerence.Core/TypeResolver.cs b/src/TypeFerence.Core/TypeResolver.cs index 9d0b7db..e4bf44c 100644 --- a/src/TypeFerence.Core/TypeResolver.cs +++ b/src/TypeFerence.Core/TypeResolver.cs @@ -4,61 +4,140 @@ namespace TypeFerence.Core; public sealed class TypeResolver(IReadOnlyDictionary resources) { - private readonly Dictionary _cache = new(StringComparer.Ordinal); + private readonly Dictionary _agentCache = new(StringComparer.Ordinal); + private readonly Dictionary _interfaceCache = new(StringComparer.Ordinal); + private readonly Dictionary> _slotDepths = new(StringComparer.Ordinal); + private readonly Dictionary> _skillDepths = new(StringComparer.Ordinal); - public IReadOnlyList ResolveAll() => resources.Values - .Where(x => x.Kind == "agent") - .OrderBy(x => x.Id, StringComparer.Ordinal) - .Select(x => Resolve(x.Id)) - .ToArray(); + public IReadOnlyList ResolveAll() + { + foreach (var item in resources.Values.Where(x => x.Kind == "interface").OrderBy(x => x.Id, StringComparer.Ordinal)) + ResolveInterface(item.Id, new HashSet(StringComparer.Ordinal)); + return resources.Values + .Where(x => x.Kind == "agent") + .OrderBy(x => x.Id, StringComparer.Ordinal) + .Select(x => Resolve(x.Id)) + .ToArray(); + } - public ResolvedAgent Resolve(string id) => Resolve(id, new HashSet(StringComparer.Ordinal)); + public ResolvedAgent Resolve(string id) => ResolveAgent(id, new HashSet(StringComparer.Ordinal)); - private ResolvedAgent Resolve(string id, HashSet visiting) + private ResolvedAgent ResolveAgent(string id, HashSet visiting) { - if (_cache.TryGetValue(id, out var cached)) return cached; - if (!resources.TryGetValue(id, out var current) || current.Kind != "agent") throw new TypeFerenceException($"Agent not found: {id}"); - if (!visiting.Add(id)) throw new TypeFerenceException($"Inheritance cycle detected at {id}"); - if (id == "system/object@1.0.0") ValidateSystemObject(current); - if (id != "system/object@1.0.0" && current.Extends is null) throw new TypeFerenceException($"Agent {id} must extend another agent"); - - var parent = current.Extends is null ? null : Resolve(current.Extends, visiting); - if (parent is not null && parent.Id == "system/object@1.0.0" && Namespace(id) == "system") - throw new TypeFerenceException("Only enterprise-owned agents may directly extend system/object"); - if (parent is not null && parent.Id == "system/object@1.0.0" && !current.Abstract) - throw new TypeFerenceException($"Enterprise root {id} must be abstract"); - - var lineage = parent?.Lineage.ToList() ?? []; - lineage.Add(id); - var slots = new SortedDictionary(StringComparer.Ordinal); - if (parent is not null) - foreach (var pair in parent.Slots) slots[pair.Key] = pair.Value; - foreach (var pair in current.Slots) slots[pair.Key] = NormalizePath(pair.Value); - var norms = Distinct((parent?.WorkingNorms ?? []).Concat(current.WorkingNorms)); - var contexts = Distinct((parent?.ContextFiles ?? []).Concat(current.ContextFiles).Select(NormalizePath)); - var interfaceIds = Distinct((parent?.Interfaces ?? []).Concat(current.Implements)); - var provenance = parent?.Provenance.ToList() ?? []; - if (!string.IsNullOrWhiteSpace(current.DisplayName)) provenance.Add(new("displayName", id)); - if (!string.IsNullOrWhiteSpace(current.Description)) provenance.Add(new("description", id)); - provenance.AddRange(current.Slots.Keys.Select(x => new ProvenanceEntry($"slots.{x}", id))); - provenance.AddRange(current.WorkingNorms.Select(_ => new ProvenanceEntry("workingNorms", id))); - provenance.AddRange(current.ContextFiles.Select(_ => new ProvenanceEntry("contextFiles", id))); - provenance.AddRange(current.Implements.Select(x => new ProvenanceEntry($"interfaces.{x}", id))); - - var skills = parent?.Skills.ToDictionary(x => x.ContractId, StringComparer.Ordinal) - ?? new Dictionary(StringComparer.Ordinal); + if (_agentCache.TryGetValue(id, out var cached)) return cached; + var current = Require(id, "agent"); + if (!visiting.Add(id)) throw new TypeFerenceException($"Embedding cycle detected at {id}"); + if (current.Embeds.Count != current.Embeds.Distinct(StringComparer.Ordinal).Count()) + throw new TypeFerenceException($"{id}: an agent cannot embed the same agent more than once"); + + try + { + var embedded = current.Embeds.Select(x => ResolveAgent(x, visiting)).ToArray(); + var (slots, slotDepths) = MergeSlots(id, current, embedded); + var norms = Distinct(embedded.SelectMany(x => x.WorkingNorms).Concat(current.WorkingNorms)); + var contexts = Distinct(embedded.SelectMany(x => x.ContextFiles).Concat(current.ContextFiles).Select(NormalizePath)); + var (skills, skillDepths) = MergeSkills(id, current, embedded, contexts); + var satisfies = resources.Values + .Where(x => x.Kind == "interface") + .OrderBy(x => x.Id, StringComparer.Ordinal) + .Where(x => Satisfies(ResolveInterface(x.Id, new HashSet(StringComparer.Ordinal)), slots, skills)) + .Select(x => x.Id) + .ToArray(); + + var provenance = embedded.SelectMany(x => x.Provenance).ToList(); + provenance.AddRange(current.Embeds.Select(x => new ProvenanceEntry($"embeds.{x}", id))); + if (!string.IsNullOrWhiteSpace(current.DisplayName)) provenance.Add(new("displayName", id)); + if (!string.IsNullOrWhiteSpace(current.Description)) provenance.Add(new("description", id)); + provenance.AddRange(current.Slots.Keys.Select(x => new ProvenanceEntry($"slots.{x}", id))); + provenance.AddRange(current.WorkingNorms.Select(_ => new ProvenanceEntry("workingNorms", id))); + provenance.AddRange(current.ContextFiles.Select(_ => new ProvenanceEntry("contextFiles", id))); + provenance.AddRange(satisfies.Select(x => new ProvenanceEntry($"satisfies.{x}", id))); + + var resolved = new ResolvedAgent + { + Id = id, + DisplayName = string.IsNullOrWhiteSpace(current.DisplayName) ? id : current.DisplayName, + Description = current.Description, + Emit = current.Emit, + Embeds = current.Embeds.ToArray(), + Satisfies = satisfies, + Slots = slots, + WorkingNorms = norms, + ContextFiles = contexts, + Skills = skills.Values.OrderBy(x => x.ContractId, StringComparer.Ordinal).Select(x => x.WithDispatch(id)).ToArray(), + Provenance = provenance + }; + _slotDepths[id] = slotDepths; + _skillDepths[id] = skillDepths; + return _agentCache[id] = resolved; + } + finally + { + visiting.Remove(id); + } + } + + private (SortedDictionary Values, IReadOnlyDictionary Depths) MergeSlots( + string id, + ResourceDocument current, + ResolvedAgent[] embedded) + { + var result = new SortedDictionary(StringComparer.Ordinal); + var depths = new Dictionary(StringComparer.Ordinal); + foreach (var group in embedded.SelectMany(x => x.Slots.Select(pair => + (Agent: x.Id, pair.Key, pair.Value, Depth: _slotDepths[x.Id][pair.Key] + 1))) + .GroupBy(x => x.Key, StringComparer.Ordinal)) + { + var depth = group.Min(x => x.Depth); + var nearest = group.Where(x => x.Depth == depth).ToArray(); + if (nearest.Length > 1 && !current.Slots.ContainsKey(group.Key)) + throw new TypeFerenceException($"{id}: embedded slot '{group.Key}' is ambiguous between {string.Join(", ", nearest.Select(x => x.Agent))}; declare it on {id} to resolve the conflict"); + result[group.Key] = nearest[0].Value; + depths[group.Key] = depth; + } + foreach (var pair in current.Slots) + { + result[pair.Key] = NormalizePath(pair.Value); + depths[pair.Key] = 0; + } + return (result, depths); + } + + private (Dictionary Values, IReadOnlyDictionary Depths) MergeSkills( + string id, + ResourceDocument current, + ResolvedAgent[] embedded, + IReadOnlyList contexts) + { + var result = new Dictionary(StringComparer.Ordinal); + var depths = new Dictionary(StringComparer.Ordinal); + var localContracts = current.Skills.Select(x => x.Contract ?? x.Ref).ToHashSet(StringComparer.Ordinal); + if (localContracts.Count != current.Skills.Count) + throw new TypeFerenceException($"{id}: a skill contract cannot be declared more than once"); + foreach (var group in embedded.SelectMany(x => x.Skills.Select(skill => + (Agent: x.Id, Skill: skill, Depth: _skillDepths[x.Id][skill.ContractId] + 1))) + .GroupBy(x => x.Skill.ContractId, StringComparer.Ordinal)) + { + var depth = group.Min(x => x.Depth); + var nearest = group.Where(x => x.Depth == depth).ToArray(); + if (nearest.Length > 1 && !localContracts.Contains(group.Key)) + throw new TypeFerenceException($"{id}: embedded skill contract '{group.Key}' is ambiguous between {string.Join(", ", nearest.Select(x => x.Agent))}; declare the contract on {id} to resolve the conflict"); + result[group.Key] = nearest[0].Skill; + depths[group.Key] = depth; + } + foreach (var binding in current.Skills) { var implementation = Require(binding.Ref, "skill"); - var contract = binding.Overrides ?? binding.Ref; - if (binding.Overrides is not null) + var contract = binding.Contract ?? binding.Ref; + if (binding.Contract is not null) { - if (!skills.TryGetValue(contract, out var inherited)) throw new TypeFerenceException($"{id}: cannot override missing skill {contract}"); - EnsureSameContract(inherited, implementation, id); + var contractResource = Require(contract, "skill"); + EnsureSameContract(contractResource, implementation, id); } - skills[contract] = new ResolvedSkill + if (result.TryGetValue(contract, out var promoted)) EnsureSameContract(promoted, implementation, id); + result[contract] = new ResolvedSkill { - DispatchName = $"{UnversionedLeaf(id)}.{UnversionedLeaf(contract)}", ContractId = contract, ImplementationId = implementation.Id, Description = implementation.Description, @@ -68,60 +147,56 @@ private ResolvedAgent Resolve(string id, HashSet visiting) ContextFiles = Distinct(contexts.Concat(implementation.ContextFiles.Select(NormalizePath))), Provenance = [new("skill.contract", contract), new("skill.implementation", implementation.Id)] }; + depths[contract] = 0; } + return (result, depths); + } - foreach (var interfaceId in interfaceIds) + private InterfaceContract ResolveInterface(string id, HashSet visiting) + { + if (_interfaceCache.TryGetValue(id, out var cached)) return cached; + var current = Require(id, "interface"); + if (!visiting.Add(id)) throw new TypeFerenceException($"Interface embedding cycle detected at {id}"); + try { - var contract = Require(interfaceId, "interface"); - foreach (var slot in contract.RequiresSlots) - if (!slots.ContainsKey(slot)) throw new TypeFerenceException($"{id}: interface {interfaceId} requires slot '{slot}'"); - foreach (var skill in contract.RequiresSkills) - if (!skills.ContainsKey(skill)) throw new TypeFerenceException($"{id}: interface {interfaceId} requires skill '{skill}'"); + var embedded = current.Embeds.Select(x => ResolveInterface(x, visiting)).ToArray(); + foreach (var skill in current.RequiresSkills) Require(skill, "skill"); + return _interfaceCache[id] = new( + Distinct(embedded.SelectMany(x => x.Slots).Concat(current.RequiresSlots)), + Distinct(embedded.SelectMany(x => x.Skills).Concat(current.RequiresSkills))); } - - var resolved = new ResolvedAgent + finally { - Id = id, - DisplayName = string.IsNullOrWhiteSpace(current.DisplayName) ? parent?.DisplayName ?? id : current.DisplayName, - Description = string.IsNullOrWhiteSpace(current.Description) ? parent?.Description ?? "" : current.Description, - Abstract = current.Abstract, - Lineage = lineage, - Interfaces = interfaceIds, - Slots = slots, - WorkingNorms = norms, - ContextFiles = contexts, - Skills = skills.Values.OrderBy(x => x.ContractId, StringComparer.Ordinal).Select(x => x.WithDispatch(id)).ToArray(), - Provenance = provenance - }; - visiting.Remove(id); - return _cache[id] = resolved; + visiting.Remove(id); + } } + private static bool Satisfies(InterfaceContract contract, IReadOnlyDictionary slots, IReadOnlyDictionary skills) => + contract.Slots.All(slots.ContainsKey) && contract.Skills.All(skills.ContainsKey); + private ResourceDocument Require(string id, string kind) { if (!resources.TryGetValue(id, out var resource) || resource.Kind != kind) throw new TypeFerenceException($"Missing {kind}: {id}"); return resource; } - private static void EnsureSameContract(ResolvedSkill inherited, ResourceDocument replacement, string agent) + private static void EnsureSameContract(ResolvedSkill contract, ResourceDocument implementation, string agent) { - if (CanonicalJson(inherited.InputSchema) != CanonicalJson(replacement.InputSchema) || - CanonicalJson(inherited.OutputSchema) != CanonicalJson(replacement.OutputSchema)) - throw new TypeFerenceException($"{agent}: override {replacement.Id} changes the public contract of {inherited.ContractId}"); + if (contract.InputSchema != CanonicalJson(implementation.InputSchema) || contract.OutputSchema != CanonicalJson(implementation.OutputSchema)) + throw new TypeFerenceException($"{agent}: implementation {implementation.Id} changes the public contract of {contract.ContractId}"); } - private static void ValidateSystemObject(ResourceDocument value) + private static void EnsureSameContract(ResourceDocument contract, ResourceDocument implementation, string agent) { - if (!value.Abstract || value.Extends is not null || value.Implements.Count != 0 || value.Skills.Count != 0 || - value.Slots.Count != 0 || value.WorkingNorms.Count != 0 || value.ContextFiles.Count != 0 || !string.IsNullOrWhiteSpace(value.Instructions)) - throw new TypeFerenceException("system/object must be abstract and behavior-free"); + if (CanonicalJson(contract.InputSchema) != CanonicalJson(implementation.InputSchema) || + CanonicalJson(contract.OutputSchema) != CanonicalJson(implementation.OutputSchema)) + throw new TypeFerenceException($"{agent}: implementation {implementation.Id} changes the public contract of {contract.Id}"); } - private static string Namespace(string id) => id.Split('/')[0]; - private static string UnversionedLeaf(string id) => id.Split('/').Last().Split('@')[0]; private static string NormalizePath(string value) => value.Replace('\\', '/').TrimStart('/'); private static IReadOnlyList Distinct(IEnumerable values) => values.Distinct(StringComparer.Ordinal).ToArray(); private static string CanonicalJson(string json) => JsonSerializer.Serialize(JsonDocument.Parse(json).RootElement); + private sealed record InterfaceContract(IReadOnlyList Slots, IReadOnlyList Skills); } internal static class ResolvedSkillExtensions diff --git a/tests/TypeFerence.Tests/CompilerTests.cs b/tests/TypeFerence.Tests/CompilerTests.cs index 4388787..bbc4604 100644 --- a/tests/TypeFerence.Tests/CompilerTests.cs +++ b/tests/TypeFerence.Tests/CompilerTests.cs @@ -14,21 +14,18 @@ public sealed class CompilerTests private static string Example => Path.Combine(Root, "examples", "helio"); [Fact] - public void SystemObject_IsBehaviorFree() + public void Agents_DoNotNeedAUniversalRoot() { - var root = new TypeFerenceCompiler().Validate(Example).Single(x => x.Id == "system/object@1.0.0"); - Assert.True(root.Abstract); - Assert.Empty(root.WorkingNorms); - Assert.Empty(root.ContextFiles); - Assert.Empty(root.Slots); - Assert.Empty(root.Skills); + var enterprise = new TypeFerenceCompiler().Validate(Example).Single(x => x.Id == "helio/enterprise-agent@1.0.0"); + Assert.False(enterprise.Emit); + Assert.Empty(enterprise.Embeds); } [Fact] - public void ConcreteAgents_InheritThroughEnterpriseBase() + public void ConcreteAgents_PromoteEmbeddedBehavior() { - var agents = new TypeFerenceCompiler().Validate(Example).Where(x => !x.Abstract); - Assert.All(agents, x => Assert.Equal("helio/enterprise-agent@1.0.0", x.Lineage[1])); + var agents = new TypeFerenceCompiler().Validate(Example).Where(x => x.Emit); + Assert.All(agents, x => Assert.Contains("organization", x.Slots.Keys)); } [Fact] @@ -60,7 +57,7 @@ public void Compilation_IsDeterministicAndProducesNativeShapes() var compiler = new TypeFerenceCompiler(); compiler.Build(Example, one.Path, Enum.GetValues(), new ArdPublicationOptions("helio.example")); compiler.Build(Example, two.Path, Enum.GetValues(), new ArdPublicationOptions("helio.example")); - Assert.Equal("80aad0f02eea35079fbab46cba445ab6adcd36f5a4f91b15cd514af4068355cc", TypeFerenceCompiler.HashDirectory(one.Path)); + Assert.Equal("3217c82010c4859535f76797d04b432d07531a7f02c3b1c2ef84adb655c6eae5", TypeFerenceCompiler.HashDirectory(one.Path)); Assert.Equal(TypeFerenceCompiler.HashDirectory(one.Path), TypeFerenceCompiler.HashDirectory(two.Path)); Assert.False(DiffResult.Compare(one.Path, two.Path).Different); Assert.True(File.Exists(Path.Combine(one.Path, "codex", "executive-assistant", ".agents", "skills", "prepare-brief", "SKILL.md"))); @@ -322,22 +319,99 @@ public async Task CliTrustOptions_RequireValues(string option) } [Fact] - public void InheritanceCycles_AreRejected() + public void EmbeddingCycles_AreRejected() { var resources = new Dictionary { - ["test/a@1.0.0"] = new() { SchemaVersion = 1, Kind = "agent", Id = "test/a@1.0.0", Extends = "test/b@1.0.0" }, - ["test/b@1.0.0"] = new() { SchemaVersion = 1, Kind = "agent", Id = "test/b@1.0.0", Extends = "test/a@1.0.0" } + ["test/a@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/a@1.0.0", Embeds = ["test/b@1.0.0"] }, + ["test/b@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/b@1.0.0", Embeds = ["test/a@1.0.0"] } }; Assert.Contains("cycle", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.OrdinalIgnoreCase); } [Fact] - public void Provenance_CoversEffectiveScalarsInterfacesAndSkills() + public void MultipleEmbedding_RequiresExplicitConflictResolution() + { + var resources = new Dictionary + { + ["test/left@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/left@1.0.0", Slots = { ["owner"] = "left.md" } }, + ["test/right@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/right@1.0.0", Slots = { ["owner"] = "right.md" } }, + ["test/ambiguous@1.0.0"] = new() + { + SchemaVersion = 2, + Kind = "agent", + Id = "test/ambiguous@1.0.0", + Embeds = ["test/left@1.0.0", "test/right@1.0.0"] + } + }; + Assert.Contains("ambiguous", Assert.Throws(() => new TypeResolver(resources).Resolve("test/ambiguous@1.0.0")).Message, StringComparison.OrdinalIgnoreCase); + + resources["test/ambiguous@1.0.0"].Slots["owner"] = "outer.md"; + Assert.Equal("outer.md", new TypeResolver(resources).Resolve("test/ambiguous@1.0.0").Slots["owner"]); + } + + [Fact] + public void MultipleEmbedding_PrefersTheShallowestPromotedMember() + { + var baseSkill = new ResourceDocument + { + SchemaVersion = 2, + Kind = "skill", + Id = "test/skills/status@1.0.0" + }; + var specializedSkill = new ResourceDocument + { + SchemaVersion = 2, + Kind = "skill", + Id = "test/skills/special-status@1.0.0" + }; + var resources = new Dictionary + { + [baseSkill.Id] = baseSkill, + [specializedSkill.Id] = specializedSkill, + ["test/deep@1.0.0"] = new() + { + SchemaVersion = 2, + Kind = "agent", + Id = "test/deep@1.0.0", + Slots = { ["owner"] = "deep.md" }, + Skills = [new SkillBinding { Ref = baseSkill.Id }] + }, + ["test/middle@1.0.0"] = new() + { + SchemaVersion = 2, + Kind = "agent", + Id = "test/middle@1.0.0", + Embeds = ["test/deep@1.0.0"] + }, + ["test/shallow@1.0.0"] = new() + { + SchemaVersion = 2, + Kind = "agent", + Id = "test/shallow@1.0.0", + Slots = { ["owner"] = "shallow.md" }, + Skills = [new SkillBinding { Ref = specializedSkill.Id, Contract = baseSkill.Id }] + }, + ["test/outer@1.0.0"] = new() + { + SchemaVersion = 2, + Kind = "agent", + Id = "test/outer@1.0.0", + Embeds = ["test/middle@1.0.0", "test/shallow@1.0.0"] + } + }; + + var resolved = new TypeResolver(resources).Resolve("test/outer@1.0.0"); + Assert.Equal("shallow.md", resolved.Slots["owner"]); + Assert.Equal(specializedSkill.Id, Assert.Single(resolved.Skills).ImplementationId); + } + + [Fact] + public void Provenance_CoversEffectiveScalarsStructuralContractsAndSkills() { var agent = new TypeFerenceCompiler().Validate(Example).Single(x => x.Id == "helio/executive-assistant@1.0.0"); Assert.Contains(agent.Provenance, x => x.Field == "displayName" && x.Source == agent.Id); - Assert.Contains(agent.Provenance, x => x.Field.StartsWith("interfaces.", StringComparison.Ordinal)); + Assert.Contains(agent.Provenance, x => x.Field.StartsWith("satisfies.", StringComparison.Ordinal)); Assert.All(agent.Skills, skill => { Assert.Contains(skill.Provenance, x => x.Field == "skill.contract"); @@ -346,34 +420,52 @@ public void Provenance_CoversEffectiveScalarsInterfacesAndSkills() } [Fact] - public void InterfaceRequirements_AreEnforced() + public void Interfaces_AreSatisfiedImplicitly() + { + var resources = new Dictionary + { + ["test/contract@1.0.0"] = new() { SchemaVersion = 2, Kind = "interface", Id = "test/contract@1.0.0", RequiresSlots = ["owner"] }, + ["test/plain@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/plain@1.0.0" }, + ["test/owned@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/owned@1.0.0", Slots = { ["owner"] = "owner.md" } } + }; + var agents = new TypeResolver(resources).ResolveAll(); + Assert.Empty(agents.Single(x => x.Id == "test/plain@1.0.0").Satisfies); + Assert.Contains("test/contract@1.0.0", agents.Single(x => x.Id == "test/owned@1.0.0").Satisfies); + } + + [Fact] + public void InterfaceSkillRequirements_MustReferenceSkills() { var resources = new Dictionary { - ["system/object@1.0.0"] = new() { SchemaVersion = 1, Kind = "agent", Id = "system/object@1.0.0", Abstract = true }, - ["test/contract@1.0.0"] = new() { SchemaVersion = 1, Kind = "interface", Id = "test/contract@1.0.0", RequiresSlots = ["owner"] }, - ["test/base@1.0.0"] = new() { SchemaVersion = 1, Kind = "agent", Id = "test/base@1.0.0", Abstract = true, Extends = "system/object@1.0.0", Implements = ["test/contract@1.0.0"] } + ["test/contract@1.0.0"] = new() + { + SchemaVersion = 2, + Kind = "interface", + Id = "test/contract@1.0.0", + RequiresSkills = ["test/skills/missing@1.0.0"] + } }; - Assert.Contains("requires slot", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.OrdinalIgnoreCase); + + Assert.Contains("Missing skill", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); } [Fact] - public void MissingParentReferences_AreRejected() + public void MissingEmbeddedAgents_AreRejected() { var resources = new Dictionary { - ["system/object@1.0.0"] = new() { SchemaVersion = 1, Kind = "agent", Id = "system/object@1.0.0", Abstract = true }, - ["test/base@1.0.0"] = new() { SchemaVersion = 1, Kind = "agent", Id = "test/base@1.0.0", Abstract = true, Extends = "test/missing@1.0.0" } + ["test/base@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/base@1.0.0", Embeds = ["test/missing@1.0.0"] } }; - Assert.Contains("Agent not found", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); + Assert.Contains("Missing agent", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); } [Fact] - public void SkillOverrides_MustPreserveSchemas() + public void SkillContractImplementations_MustPreserveSchemas() { var baseSkill = new ResourceDocument { - SchemaVersion = 1, + SchemaVersion = 2, Kind = "skill", Id = "test/skills/status@1.0.0", InputSchema = "{\"type\":\"object\",\"properties\":{\"focus\":{\"type\":\"string\"}}}", @@ -381,7 +473,7 @@ public void SkillOverrides_MustPreserveSchemas() }; var replacement = new ResourceDocument { - SchemaVersion = 1, + SchemaVersion = 2, Kind = "skill", Id = "test/skills/special-status@1.0.0", InputSchema = "{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"number\"}}}", @@ -389,23 +481,21 @@ public void SkillOverrides_MustPreserveSchemas() }; var resources = new Dictionary { - ["system/object@1.0.0"] = new() { SchemaVersion = 1, Kind = "agent", Id = "system/object@1.0.0", Abstract = true }, ["test/base@1.0.0"] = new() { - SchemaVersion = 1, + SchemaVersion = 2, Kind = "agent", Id = "test/base@1.0.0", - Abstract = true, - Extends = "system/object@1.0.0", + Emit = false, Skills = [new SkillBinding { Ref = baseSkill.Id }] }, ["test/concrete@1.0.0"] = new() { - SchemaVersion = 1, + SchemaVersion = 2, Kind = "agent", Id = "test/concrete@1.0.0", - Extends = "test/base@1.0.0", - Skills = [new SkillBinding { Ref = replacement.Id, Overrides = baseSkill.Id }] + Embeds = ["test/base@1.0.0"], + Skills = [new SkillBinding { Ref = replacement.Id, Contract = baseSkill.Id }] }, [baseSkill.Id] = baseSkill, [replacement.Id] = replacement @@ -414,12 +504,16 @@ public void SkillOverrides_MustPreserveSchemas() } [Fact] - public void Interfaces_CannotInherit() + public void Interfaces_CanEmbedInterfaces() { using var source = new TempDirectory(); - File.WriteAllText(Path.Combine(source.Path, "root.yaml"), "schemaVersion: 1\nkind: agent\nid: system/object@1.0.0\nabstract: true\n"); - File.WriteAllText(Path.Combine(source.Path, "interface.yaml"), "schemaVersion: 1\nkind: interface\nid: test/contract@1.0.0\nextends: test/other@1.0.0\n"); - Assert.Contains("interfaces cannot extend", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); + File.WriteAllText(Path.Combine(source.Path, "base.yaml"), "schemaVersion: 2\nkind: interface\nid: test/base@1.0.0\nrequiresSlots: [owner]\n"); + File.WriteAllText(Path.Combine(source.Path, "interface.yaml"), "schemaVersion: 2\nkind: interface\nid: test/contract@1.0.0\nembeds: [test/base@1.0.0]\nrequiresSlots: [repository]\n"); + File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), "schemaVersion: 2\nkind: agent\nid: test/agent@1.0.0\nslots: { owner: owner.md, repository: repository.md }\n"); + File.WriteAllText(Path.Combine(source.Path, "owner.md"), "owner"); + File.WriteAllText(Path.Combine(source.Path, "repository.md"), "repository"); + var agent = new TypeResolver(new ResourceLoader().Load(source.Path)).Resolve("test/agent@1.0.0"); + Assert.Contains("test/contract@1.0.0", agent.Satisfies); } [Theory] @@ -428,7 +522,7 @@ public void Interfaces_CannotInherit() public void ContextPaths_MustStayInsideSourceAndExist(string path, string expected) { using var source = new TempDirectory(); - File.WriteAllText(Path.Combine(source.Path, "root.yaml"), $"schemaVersion: 1\nkind: agent\nid: system/object@1.0.0\nabstract: true\ncontextFiles:\n - {path}\n"); + File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), $"schemaVersion: 2\nkind: agent\nid: test/agent@1.0.0\ncontextFiles:\n - {path}\n"); Assert.Contains(expected, Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); } @@ -437,24 +531,40 @@ public void UnknownYamlFields_AreRejected() { using var source = new TempDirectory(); File.WriteAllText(Path.Combine(source.Path, "root.yaml"), """ -schemaVersion: 1 +schemaVersion: 2 kind: agent -id: system/object@1.0.0 -abstract: true +id: test/agent@1.0.0 unknownField: rejected """); Assert.Contains("invalid YAML", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); } + [Theory] + [InlineData("extends: test/base@1.0.0")] + [InlineData("implements: [test/contract@1.0.0]")] + public void LegacyInheritanceFields_AreRejected(string field) + { + using var source = new TempDirectory(); + File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), $"schemaVersion: 2\nkind: agent\nid: test/agent@1.0.0\n{field}\n"); + Assert.Contains("invalid YAML", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void VersionOneResources_AreRejected() + { + using var source = new TempDirectory(); + File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), "schemaVersion: 1\nkind: agent\nid: test/agent@1.0.0\n"); + Assert.Contains("schemaVersion must be 2", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); + } + [Fact] public void ResourceIds_RequireSemanticVersions() { using var source = new TempDirectory(); File.WriteAllText(Path.Combine(source.Path, "root.yaml"), """ -schemaVersion: 1 +schemaVersion: 2 kind: agent id: system/object@latest -abstract: true """); Assert.Contains("semantic-version", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); } diff --git a/tools/render_whitepaper.py b/tools/render_whitepaper.py index aaeb6a2..6d614cf 100644 --- a/tools/render_whitepaper.py +++ b/tools/render_whitepaper.py @@ -103,14 +103,14 @@ def node(d, x, y, w, h, title, subtitle="", fill=colors.HexColor("#F7F8FC"), str def hierarchy(): d = Drawing(470, 238) - node(d, 165, 190, 140, 38, "system/object", "mechanics only", NAVY, NAVY, True) - node(d, 155, 125, 160, 42, "enterprise-agent", "organization-owned", colors.HexColor("#E9ECFF")) + node(d, 155, 185, 160, 42, "enterprise-agent", "reusable behavior", colors.HexColor("#E9ECFF")) node(d, 25, 60, 160, 42, "person-agent", "human-facing domain") node(d, 285, 60, 160, 42, "repo-agent", "repository domain") node(d, 25, 0, 160, 38, "executive-assistant", fill=PALE, stroke=PURPLE) node(d, 285, 0, 160, 38, "payments-repo-agent", fill=PALE, stroke=PURPLE) - for x1, y1, x2, y2 in [(235,190,235,167),(235,125,105,102),(235,125,365,102),(105,60,105,38),(365,60,365,38)]: + for x1, y1, x2, y2 in [(235,185,105,102),(235,185,365,102),(105,60,105,38),(365,60,365,38)]: d.add(Line(x1,y1,x2,y2,strokeColor=MUTED,strokeWidth=1.2)) + d.add(String(235, 145, "embedded by", textAnchor="middle", fontName=BODY, fontSize=7.2, fillColor=MUTED)) return d @@ -118,7 +118,7 @@ def pipeline(): d = Drawing(470, 165) node(d, 0, 60, 90, 48, "Typed YAML", "agents + skills") arrow(d, 90, 84, 120, 84) - node(d, 120, 60, 90, 48, "Validate", "contracts + paths") + node(d, 120, 60, 90, 48, "Compose", "embedding + contracts") arrow(d, 210, 84, 240, 84) node(d, 240, 55, 105, 58, "Resolved IR", "behavior + provenance", NAVY, NAVY, True) for y, label in [(125,"Codex"),(72,"Copilot"),(19,"Cursor + MCP")]: @@ -147,7 +147,7 @@ def dispatch(): d = Drawing(470, 150) node(d, 0, 48, 130, 55, "MCP call", "derived skill name") arrow(d, 130, 75, 165, 75) - node(d, 165, 40, 140, 70, "Resolve contract", "nearest compatible override", NAVY, NAVY, True) + node(d, 165, 40, 140, 70, "Resolve contract", "compatible local binding", NAVY, NAVY, True) arrow(d, 305, 75, 340, 75) node(d, 340, 20, 130, 110, "Invocation package", "args + context + provenance", PALE, PURPLE) return d @@ -252,7 +252,7 @@ def main(): reader = PdfReader(str(OUTPUT)) if len(reader.pages) < 6: raise RuntimeError("Whitepaper unexpectedly short") extracted = "".join(page.extract_text() or "" for page in reader.pages) - for phrase in ("TypeFerence", "system/object", "deterministic compiler", "Conclusion"): + for phrase in ("TypeFerence", "Composition over ancestry", "deterministic compiler", "Conclusion"): if phrase not in extracted: raise RuntimeError(f"Missing PDF text: {phrase}") print(f"Rendered {OUTPUT} ({len(reader.pages)} pages)") From d298e666099b46171a3dfa84075d46e00ac562aa Mon Sep 17 00:00:00 2001 From: "andrew.buchkovich@lphq.org" Date: Mon, 6 Jul 2026 21:51:28 -0400 Subject: [PATCH 2/2] Refactor type inference pipeline and related UI --- README.md | 30 ++-- dist/ard/ai-catalog.json | 105 +++++++----- .../.typeference/bundle.json | 58 +++---- .../.agents/skills/repository-status/SKILL.md | 2 +- .../.typeference/bundle.json | 54 ++---- .../.typeference/bundle.json | 58 +++---- .../.typeference/bundle.json | 54 ++---- .../.typeference/bundle.json | 58 +++---- .../.typeference/bundle.json | 54 ++---- dist/neutral/executive-assistant/bundle.json | 58 +++---- .../executive-assistant/provenance.json | 44 ++--- dist/neutral/payments-repo-agent/bundle.json | 54 ++---- .../payments-repo-agent/provenance.json | 44 ++--- .../skills/repository-status/SKILL.md | 2 +- docs/assets/compiler-pipeline.svg | 2 +- docs/assets/dispatch.svg | 4 +- docs/assets/type-hierarchy.svg | 8 +- docs/specification.md | 30 ++-- docs/whitepaper.md | 28 +-- .../agents/executive-assistant.agent.yaml | 4 +- .../agents/payments-repo-agent.agent.yaml | 6 +- examples/helio/agents/person-agent.agent.yaml | 16 -- .../prepare-brief.capability.yaml | 7 + .../repository-status.capability.yaml | 7 + .../triage-message.capability.yaml | 7 + .../interfaces/correspondent.interface.yaml | 6 +- .../repository-observer.interface.yaml | 6 +- .../enterprise-defaults.profile.yaml} | 11 +- .../profiles/person-defaults.profile.yaml | 15 ++ .../repository-defaults.profile.yaml} | 13 +- .../payments-repository-status.skill.yaml | 5 +- .../helio/skills/prepare-brief.skill.yaml | 3 +- .../helio/skills/repository-status.skill.yaml | 3 +- .../helio/skills/triage-message.skill.yaml | 3 +- output/pdf/typeference-whitepaper.pdf | Bin 106845 -> 106943 bytes src/TypeFerence.Core/Compiler.cs | 2 +- src/TypeFerence.Core/Models.cs | 7 +- src/TypeFerence.Core/ResourceLoader.cs | 9 +- src/TypeFerence.Core/TypeResolver.cs | 116 ++++++++----- tests/TypeFerence.Tests/CompilerTests.cs | 161 +++++++++++++----- tools/render_whitepaper.py | 10 +- 41 files changed, 557 insertions(+), 607 deletions(-) delete mode 100644 examples/helio/agents/person-agent.agent.yaml create mode 100644 examples/helio/capabilities/prepare-brief.capability.yaml create mode 100644 examples/helio/capabilities/repository-status.capability.yaml create mode 100644 examples/helio/capabilities/triage-message.capability.yaml rename examples/helio/{agents/enterprise-agent.agent.yaml => profiles/enterprise-defaults.profile.yaml} (62%) create mode 100644 examples/helio/profiles/person-defaults.profile.yaml rename examples/helio/{agents/repo-agent.agent.yaml => profiles/repository-defaults.profile.yaml} (50%) diff --git a/README.md b/README.md index f5df3d6..fd28aa5 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,16 @@ **Define organizational agents once. Validate their composition. Compile them into the native shapes your teams already use.** -TypeFerence is an experimental reference implementation of a typed definition and compilation layer for AI agents. It replaces sprawling, duplicated instruction files with Go-like composition: agent embedding, structurally satisfied interfaces, versioned skill contracts, deterministic compilation, provenance, and artifact diffing. +TypeFerence is an experimental reference implementation of a typed definition and compilation layer for AI agents. It replaces sprawling, duplicated instruction files with Go-like composition: reusable profiles, agent embedding, structurally satisfied interfaces, versioned capabilities, skill implementations, deterministic compilation, provenance, and artifact diffing. -Read the [whitepaper](docs/whitepaper.md), the [rendered PDF](output/pdf/typeference-whitepaper.pdf), or the [draft v2 specification](docs/specification.md). +Read the [whitepaper](docs/whitepaper.md), the [rendered PDF](output/pdf/typeference-whitepaper.pdf), or the [draft v3 specification](docs/specification.md). ```text -helio/enterprise-agent ──embedded by──> helio/person-agent ──embedded by──> helio/executive-assistant - └─embedded by──> helio/repo-agent ──embedded by──> helio/payments-repo-agent +helio/profiles/enterprise-defaults ──embedded by──> helio/profiles/person-defaults ──embedded by──> helio/executive-assistant + └─embedded by──> helio/profiles/repository-defaults ──embedded by──> helio/payments-repo-agent ``` -There is no universal root and no nominal `implements` declaration. Agents embed reusable agents, promoted behavior is checked for ambiguity, and interfaces are discovered from the resulting slot and skill set. +There is no universal root and no nominal `implements` declaration. Agents embed reusable profiles, promoted behavior is checked for ambiguity, and interfaces are discovered from the resulting slot and capability set. ## Where it fits @@ -25,22 +25,22 @@ TypeFerence source [Agentic Resource Discovery](https://agenticresourcediscovery.org/) helps clients find and verify deployed capabilities. TypeFerence addresses the earlier authoring problem: producing compatible native artifacts from one governed definition. Discovery portability does not itself provide definition portability. -The long-term objective is behavioral equivalence: preserving declared organizational intent across supported hosts closely enough to be measured and governed. V2 provides the common typed source, deterministic adapters, and provenance needed to test that objective; it does not claim that different models or runtimes already behave identically. +The long-term objective is behavioral equivalence: preserving declared organizational intent across supported hosts closely enough to be measured and governed. V3 provides the common typed source, deterministic adapters, and provenance needed to test that objective; it does not claim that different models or runtimes already behave identically. -The v2 source shape is deliberately small: +The v3 source shape is deliberately small: ```yaml -schemaVersion: 2 +schemaVersion: 3 kind: agent id: helio/payments-repo-agent@1.0.0 embeds: - - helio/repo-agent@1.0.0 + - helio/profiles/repository-defaults@1.0.0 skills: - ref: helio/skills/payments-repository-status@1.0.0 - contract: helio/skills/repository-status@1.0.0 + capability: helio/capabilities/repository-status@1.0.0 ``` -Use `emit: false` for reusable agents that should participate in composition without producing their own target bundle. +Use profiles for reusable organizational, domain, or team defaults that should participate in composition without producing their own target bundle. ## Quick start @@ -99,19 +99,19 @@ TypeFerence does not hold signing keys. An external signer can produce detached - `src/` - compiler, target adapters, CLI, and MCP runtime. - `examples/helio/` - fictional cross-domain organization. -- `docs/specification.md` - normative v2 behavior. +- `docs/specification.md` - normative v3 behavior. - `docs/whitepaper.md` and `output/pdf/typeference-whitepaper.pdf` - design paper. - `tests/` - type-system, target, determinism, and MCP integration tests. ## Design boundaries -- Agents may embed multiple agents; local slots and skills resolve promoted-name ambiguity. +- Agents may embed multiple profiles or agents; profiles may embed other profiles; local slots and capability bindings resolve promoted-name ambiguity. - Interfaces may embed interfaces and are satisfied structurally, without declarations on agents. -- Skill contracts are explicit and versioned; a local implementation may name the contract it fulfills. +- Capabilities are explicit, versioned method slots; skills are concrete implementations that bind those capabilities. - Context is referenced and loaded only with the skill that needs it. - Target adapters emit platform-native shapes while retaining the portable fields each target supports. - Build output is deterministic and carries provenance. -- No deployment state, hosted runtime, or model credentials in v2. +- No deployment state, hosted runtime, or model credentials in v3. - Structural validation does not guarantee identical LLM behavior across models or hosts. - ARD publication wraps selected target outputs; it is not itself a compilation target or execution runtime. diff --git a/dist/ard/ai-catalog.json b/dist/ard/ai-catalog.json index d85817e..c2812d9 100644 --- a/dist/ard/ai-catalog.json +++ b/dist/ard/ai-catalog.json @@ -13,32 +13,32 @@ "version": "1.0.0", "data": { "schemaVersion": 1, - "digest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "digest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "files": [ { - "path": "agents/enterprise-agent.agent.yaml", + "path": "agents/executive-assistant.agent.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: agent\nid: helio/enterprise-agent@1.0.0\ndisplayName: Helio Enterprise Agent\ndescription: Shared organizational identity and governance for every Helio agent.\nemit: false\nslots:\n organization: context/organization.md\n safetyPolicy: context/safety-policy.md\nworkingNorms:\n - Preserve a clear audit trail for material decisions.\n - State uncertainty and route work to an accountable owner when authority is unclear.\ncontextFiles:\n - context/organization.md\n - context/safety-policy.md\n" + "content": "schemaVersion: 3\nkind: agent\nid: helio/executive-assistant@1.0.0\ndisplayName: Helio Executive Assistant\ndescription: Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.\nembeds:\n - helio/profiles/person-defaults@1.0.0\ncontextFiles:\n - context/executive-rhythm.md\nskills:\n - ref: helio/skills/prepare-brief@1.0.0\n" }, { - "path": "agents/executive-assistant.agent.yaml", + "path": "agents/payments-repo-agent.agent.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: agent\nid: helio/executive-assistant@1.0.0\ndisplayName: Helio Executive Assistant\ndescription: Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.\nembeds:\n - helio/person-agent@1.0.0\ncontextFiles:\n - context/executive-rhythm.md\nskills:\n - ref: helio/skills/prepare-brief@1.0.0\n" + "content": "schemaVersion: 3\nkind: agent\nid: helio/payments-repo-agent@1.0.0\ndisplayName: Helio Payments Repository Agent\ndescription: Specializes repository assistance for the fictional payments service.\nembeds:\n - helio/profiles/repository-defaults@1.0.0\ncontextFiles:\n - context/payments-service.md\nskills:\n - ref: helio/skills/payments-repository-status@1.0.0\n capability: helio/capabilities/repository-status@1.0.0\n" }, { - "path": "agents/payments-repo-agent.agent.yaml", + "path": "capabilities/prepare-brief.capability.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: agent\nid: helio/payments-repo-agent@1.0.0\ndisplayName: Helio Payments Repository Agent\ndescription: Specializes repository assistance for the fictional payments service.\nembeds:\n - helio/repo-agent@1.0.0\ncontextFiles:\n - context/payments-service.md\nskills:\n - ref: helio/skills/payments-repository-status@1.0.0\n contract: helio/skills/repository-status@1.0.0\n" + "content": "schemaVersion: 3\nkind: capability\nid: helio/capabilities/prepare-brief@1.0.0\ndisplayName: Prepare Brief\ndescription: Capability slot for assembling decision-oriented executive briefs.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022topic\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022topic\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022brief\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022openQuestions\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022brief\u0022,\u0022openQuestions\u0022]}\u0027\n" }, { - "path": "agents/person-agent.agent.yaml", + "path": "capabilities/repository-status.capability.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: agent\nid: helio/person-agent@1.0.0\ndisplayName: Helio Person Agent\ndescription: Handles respectful inbound and outbound assistance for a person.\nemit: false\nembeds:\n - helio/enterprise-agent@1.0.0\nslots:\n principal: context/principal.md\nworkingNorms:\n - Distinguish drafts from messages approved for delivery.\ncontextFiles:\n - context/principal.md\nskills:\n - ref: helio/skills/triage-message@1.0.0\n" + "content": "schemaVersion: 3\nkind: capability\nid: helio/capabilities/repository-status@1.0.0\ndisplayName: Repository Status\ndescription: Capability slot for evidence-backed repository health summaries.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" }, { - "path": "agents/repo-agent.agent.yaml", + "path": "capabilities/triage-message.capability.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: agent\nid: helio/repo-agent@1.0.0\ndisplayName: Helio Repository Agent\ndescription: Applies Helio delivery practices within a software repository.\nemit: false\nembeds:\n - helio/enterprise-agent@1.0.0\nslots:\n repository: context/repository.md\nworkingNorms:\n - Prefer evidence from tests, diffs, and version control over recollection.\ncontextFiles:\n - context/repository.md\nskills:\n - ref: helio/skills/repository-status@1.0.0\n" + "content": "schemaVersion: 3\nkind: capability\nid: helio/capabilities/triage-message@1.0.0\ndisplayName: Triage Message\ndescription: Capability slot for classifying inbound messages and selecting accountable next actions.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022message\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022message\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022summary\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022urgency\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022owner\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022nextAction\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022summary\u0022,\u0022urgency\u0022,\u0022owner\u0022,\u0022nextAction\u0022]}\u0027\n" }, { "path": "context/executive-rhythm.md", @@ -73,32 +73,47 @@ { "path": "interfaces/correspondent.interface.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: interface\nid: helio/interfaces/correspondent@1.0.0\ndisplayName: Correspondent\ndescription: Contract for agents that assess and route communications.\nrequiresSlots:\n - principal\nrequiresSkills:\n - helio/skills/triage-message@1.0.0\n" + "content": "schemaVersion: 3\nkind: interface\nid: helio/interfaces/correspondent@1.0.0\ndisplayName: Correspondent\ndescription: Contract for agents that assess and route communications.\nrequiresSlots:\n - principal\nrequiresCapabilities:\n - helio/capabilities/triage-message@1.0.0\n" }, { "path": "interfaces/repository-observer.interface.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: interface\nid: helio/interfaces/repository-observer@1.0.0\ndisplayName: Repository Observer\ndescription: Contract for agents that can report evidence-backed repository status.\nrequiresSlots:\n - repository\nrequiresSkills:\n - helio/skills/repository-status@1.0.0\n" + "content": "schemaVersion: 3\nkind: interface\nid: helio/interfaces/repository-observer@1.0.0\ndisplayName: Repository Observer\ndescription: Contract for agents that can report evidence-backed repository status.\nrequiresSlots:\n - repository\nrequiresCapabilities:\n - helio/capabilities/repository-status@1.0.0\n" + }, + { + "path": "profiles/enterprise-defaults.profile.yaml", + "mediaType": "application/yaml", + "content": "schemaVersion: 3\nkind: profile\nid: helio/profiles/enterprise-defaults@1.0.0\ndisplayName: Helio Enterprise Defaults\ndescription: Shared organizational governance for every Helio resource.\nslots:\n organization: context/organization.md\n safetyPolicy: context/safety-policy.md\nworkingNorms:\n - Preserve a clear audit trail for material decisions.\n - State uncertainty and route work to an accountable owner when authority is unclear.\ncontextFiles:\n - context/organization.md\n - context/safety-policy.md\n" + }, + { + "path": "profiles/person-defaults.profile.yaml", + "mediaType": "application/yaml", + "content": "schemaVersion: 3\nkind: profile\nid: helio/profiles/person-defaults@1.0.0\ndisplayName: Helio Person Defaults\ndescription: Reusable behavior for respectful inbound and outbound assistance for a person.\nembeds:\n - helio/profiles/enterprise-defaults@1.0.0\nslots:\n principal: context/principal.md\nworkingNorms:\n - Distinguish drafts from messages approved for delivery.\ncontextFiles:\n - context/principal.md\nskills:\n - ref: helio/skills/triage-message@1.0.0\n" + }, + { + "path": "profiles/repository-defaults.profile.yaml", + "mediaType": "application/yaml", + "content": "schemaVersion: 3\nkind: profile\nid: helio/profiles/repository-defaults@1.0.0\ndisplayName: Helio Repository Defaults\ndescription: Reusable delivery practices for software repository assistance.\nembeds:\n - helio/profiles/enterprise-defaults@1.0.0\nslots:\n repository: context/repository.md\nworkingNorms:\n - Prefer evidence from tests, diffs, and version control over recollection.\ncontextFiles:\n - context/repository.md\nskills:\n - ref: helio/skills/repository-status@1.0.0\n" }, { "path": "skills/payments-repository-status.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/payments-repository-status@1.0.0\ndisplayName: Payments Repository Status\ndescription: Report payments-service health with contract and reconciliation evidence.\ncontextFiles:\n - context/payments-service.md\ninstructions: |\n Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\n Do not report the service healthy when any required financial-control signal is unavailable.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" + "content": "schemaVersion: 3\nkind: skill\nid: helio/skills/payments-repository-status@1.0.0\nbinds: helio/capabilities/repository-status@1.0.0\ndisplayName: Payments Repository Status\ndescription: Report payments-service health with contract and reconciliation evidence.\ncontextFiles:\n - context/payments-service.md\ninstructions: |\n Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\n Do not report the service healthy when any required financial-control signal is unavailable.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" }, { "path": "skills/prepare-brief.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/prepare-brief@1.0.0\ndisplayName: Prepare Brief\ndescription: Assemble an executive brief, requesting repository evidence when needed.\ncontextFiles:\n - context/executive-rhythm.md\ninstructions: |\n Build a decision-oriented brief from the supplied topic and evidence.\n When repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022topic\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022topic\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022brief\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022openQuestions\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022brief\u0022,\u0022openQuestions\u0022]}\u0027\n" + "content": "schemaVersion: 3\nkind: skill\nid: helio/skills/prepare-brief@1.0.0\nbinds: helio/capabilities/prepare-brief@1.0.0\ndisplayName: Prepare Brief\ndescription: Assemble an executive brief, requesting repository evidence when needed.\ncontextFiles:\n - context/executive-rhythm.md\ninstructions: |\n Build a decision-oriented brief from the supplied topic and evidence.\n When repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022topic\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022topic\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022brief\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022openQuestions\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022brief\u0022,\u0022openQuestions\u0022]}\u0027\n" }, { "path": "skills/repository-status.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/repository-status@1.0.0\ndisplayName: Repository Status\ndescription: Summarize repository health using current version-control and test evidence.\ninstructions: |\n Inspect the requested repository signals. Report branch state, recent material changes, test evidence, risks, and the next accountable action.\n Mark any unavailable signal explicitly instead of inferring success.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" + "content": "schemaVersion: 3\nkind: skill\nid: helio/skills/repository-status@1.0.0\nbinds: helio/capabilities/repository-status@1.0.0\ndisplayName: Repository Status\ndescription: Summarize repository health using current version-control and test evidence.\ninstructions: |\n Inspect the requested repository signals. Report branch state, recent material changes, test evidence, risks, and the next accountable action.\n Mark any unavailable signal explicitly instead of inferring success.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}\u0027\n" }, { "path": "skills/triage-message.skill.yaml", "mediaType": "application/yaml", - "content": "schemaVersion: 2\nkind: skill\nid: helio/skills/triage-message@1.0.0\ndisplayName: Triage Message\ndescription: Classify an inbound message and recommend an accountable next action.\ninstructions: |\n Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\n Separate facts from assumptions. Return a concise recommendation; do not send a reply.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022message\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022message\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022summary\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022urgency\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022owner\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022nextAction\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022summary\u0022,\u0022urgency\u0022,\u0022owner\u0022,\u0022nextAction\u0022]}\u0027\n" + "content": "schemaVersion: 3\nkind: skill\nid: helio/skills/triage-message@1.0.0\nbinds: helio/capabilities/triage-message@1.0.0\ndisplayName: Triage Message\ndescription: Classify an inbound message and recommend an accountable next action.\ninstructions: |\n Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\n Separate facts from assumptions. Return a concise recommendation; do not send a reply.\ninputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022message\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022message\u0022],\u0022additionalProperties\u0022:false}\u0027\noutputSchema: \u0027{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022summary\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022urgency\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022owner\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022nextAction\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022required\u0022:[\u0022summary\u0022,\u0022urgency\u0022,\u0022owner\u0022,\u0022nextAction\u0022]}\u0027\n" } ] }, @@ -130,12 +145,12 @@ { "path": "bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/person-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/person-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "provenance.json", "mediaType": "application/json", - "content": "[\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n]\n" + "content": "[\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/person-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n]\n" }, { "path": "skills/prepare-brief/SKILL.md", @@ -151,7 +166,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "neutral" }, @@ -162,7 +177,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } @@ -189,23 +204,23 @@ { "path": "bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/repository-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/repository-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "provenance.json", "mediaType": "application/json", - "content": "[\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n]\n" + "content": "[\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/repository-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n]\n" }, { "path": "skills/repository-status/SKILL.md", "mediaType": "text/markdown", - "content": "---\nname: repository-status\ndescription: \u0022Report payments-service health with contract and reconciliation evidence.\u0022\n---\n\nApply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n\n## Context loaded on invocation\n\n- \u0060context/organization.md\u0060\n- \u0060context/safety-policy.md\u0060\n- \u0060context/repository.md\u0060\n- \u0060context/payments-service.md\u0060\n" + "content": "---\nname: repository-status\ndescription: \u0022Report payments-service health with contract and reconciliation evidence.\u0022\n---\n\nApply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n\n## Context loaded on invocation\n\n- \u0060context/organization.md\u0060\n- \u0060context/safety-policy.md\u0060\n- \u0060context/repository.md\u0060\n- \u0060context/payments-service.md\u0060\n" } ] }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "neutral" }, @@ -216,7 +231,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } @@ -254,7 +269,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/person-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/person-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -265,7 +280,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "codex" }, @@ -276,7 +291,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } @@ -298,7 +313,7 @@ { "path": ".agents/skills/repository-status/SKILL.md", "mediaType": "text/markdown", - "content": "---\nname: repository-status\ndescription: \u0022Report payments-service health with contract and reconciliation evidence.\u0022\n---\n\nApply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n\n## Context loaded on invocation\n\n- \u0060context/organization.md\u0060\n- \u0060context/safety-policy.md\u0060\n- \u0060context/repository.md\u0060\n- \u0060context/payments-service.md\u0060\n" + "content": "---\nname: repository-status\ndescription: \u0022Report payments-service health with contract and reconciliation evidence.\u0022\n---\n\nApply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n\n## Context loaded on invocation\n\n- \u0060context/organization.md\u0060\n- \u0060context/safety-policy.md\u0060\n- \u0060context/repository.md\u0060\n- \u0060context/payments-service.md\u0060\n" }, { "path": ".codex/config.toml", @@ -308,7 +323,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/repository-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/repository-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -319,7 +334,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "codex" }, @@ -330,7 +345,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } @@ -363,13 +378,13 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/person-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/person-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" } ] }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "copilot" }, @@ -380,7 +395,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } @@ -412,13 +427,13 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/repository-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/repository-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" } ] }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "copilot" }, @@ -429,7 +444,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } @@ -457,7 +472,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/person-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022contractId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022contractId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/person-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/person-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/executive-assistant@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Executive Assistant\u0022,\n \u0022description\u0022: \u0022Coordinates an executive\\u0027s correspondence, briefings, and cross-agent requests.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/person-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/correspondent@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022principal\u0022: \u0022context/principal.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Distinguish drafts from messages approved for delivery.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.prepare-brief\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022,\n \u0022description\u0022: \u0022Assemble an executive brief, requesting repository evidence when needed.\u0022,\n \u0022instructions\u0022: \u0022Build a decision-oriented brief from the supplied topic and evidence.\\nWhen repository status is material, request \\u0060payments-repo-agent.repository-status\\u0060 and incorporate its returned evidence with attribution.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022topic\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022topic\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022brief\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022openQuestions\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022brief\\u0022,\\u0022openQuestions\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022,\n \u0022context/executive-rhythm.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/prepare-brief@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/prepare-brief@1.0.0\u0022\n }\n ]\n },\n {\n \u0022dispatchName\u0022: \u0022executive-assistant.triage-message\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/triage-message@1.0.0\u0022,\n \u0022description\u0022: \u0022Classify an inbound message and recommend an accountable next action.\u0022,\n \u0022instructions\u0022: \u0022Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022message\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022message\\u0022],\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022summary\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022urgency\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022owner\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022nextAction\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022required\\u0022:[\\u0022summary\\u0022,\\u0022urgency\\u0022,\\u0022owner\\u0022,\\u0022nextAction\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/principal.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/triage-message@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/triage-message@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.principal\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/person-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/person-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/correspondent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/executive-assistant@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -468,7 +483,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "cursor" }, @@ -479,7 +494,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } @@ -506,7 +521,7 @@ { "path": ".typeference/bundle.json", "mediaType": "application/json", - "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/repo-agent@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022contractId\u0022: \u0022helio/skills/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.contract\u0022,\n \u0022source\u0022: \u0022helio/skills/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/enterprise-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/enterprise-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/repo-agent@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" + "content": "{\n \u0022id\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022,\n \u0022displayName\u0022: \u0022Helio Payments Repository Agent\u0022,\n \u0022description\u0022: \u0022Specializes repository assistance for the fictional payments service.\u0022,\n \u0022emit\u0022: true,\n \u0022embeds\u0022: [\n \u0022helio/profiles/repository-defaults@1.0.0\u0022\n ],\n \u0022satisfies\u0022: [\n \u0022helio/interfaces/repository-observer@1.0.0\u0022\n ],\n \u0022slots\u0022: {\n \u0022organization\u0022: \u0022context/organization.md\u0022,\n \u0022repository\u0022: \u0022context/repository.md\u0022,\n \u0022safetyPolicy\u0022: \u0022context/safety-policy.md\u0022\n },\n \u0022workingNorms\u0022: [\n \u0022Preserve a clear audit trail for material decisions.\u0022,\n \u0022State uncertainty and route work to an accountable owner when authority is unclear.\u0022,\n \u0022Prefer evidence from tests, diffs, and version control over recollection.\u0022\n ],\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022skills\u0022: [\n {\n \u0022dispatchName\u0022: \u0022payments-repo-agent.repository-status\u0022,\n \u0022capabilityId\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022,\n \u0022implementationId\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022,\n \u0022description\u0022: \u0022Report payments-service health with contract and reconciliation evidence.\u0022,\n \u0022instructions\u0022: \u0022Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\\nDo not report the service healthy when any required financial-control signal is unavailable.\\n\u0022,\n \u0022inputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022focus\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022additionalProperties\\u0022:false}\u0022,\n \u0022outputSchema\u0022: \u0022{\\u0022type\\u0022:\\u0022object\\u0022,\\u0022properties\\u0022:{\\u0022status\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022},\\u0022evidence\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}},\\u0022risks\\u0022:{\\u0022type\\u0022:\\u0022array\\u0022,\\u0022items\\u0022:{\\u0022type\\u0022:\\u0022string\\u0022}}},\\u0022required\\u0022:[\\u0022status\\u0022,\\u0022evidence\\u0022,\\u0022risks\\u0022]}\u0022,\n \u0022contextFiles\u0022: [\n \u0022context/organization.md\u0022,\n \u0022context/safety-policy.md\u0022,\n \u0022context/repository.md\u0022,\n \u0022context/payments-service.md\u0022\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022skill.capability\u0022,\n \u0022source\u0022: \u0022helio/capabilities/repository-status@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022skill.implementation\u0022,\n \u0022source\u0022: \u0022helio/skills/payments-repository-status@1.0.0\u0022\n }\n ]\n }\n ],\n \u0022provenance\u0022: [\n {\n \u0022field\u0022: \u0022slots.organization\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.safetyPolicy\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/enterprise-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/enterprise-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022slots.repository\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022workingNorms\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/profiles/repository-defaults@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022embeds.helio/profiles/repository-defaults@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022displayName\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022description\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022contextFiles\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n },\n {\n \u0022field\u0022: \u0022satisfies.helio/interfaces/repository-observer@1.0.0\u0022,\n \u0022source\u0022: \u0022helio/payments-repo-agent@1.0.0\u0022\n }\n ]\n}\n" }, { "path": "AGENTS.md", @@ -517,7 +532,7 @@ }, "metadata": { "generatedBy": "TypeFerence", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f", + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26", "sourceIdentifier": "urn:air:helio.example:typeference:source:helio", "target": "cursor" }, @@ -528,7 +543,7 @@ { "relation": "derivedFrom", "sourceId": "urn:air:helio.example:typeference:source:helio", - "sourceDigest": "sha256:4aae9cdc4210014aaaa313c7968f111c914cfda5061828fed4f2fc8386678c6f" + "sourceDigest": "sha256:70270ce0b55dd8c489246a0cffcd64b76f87b4f99e2815ce471ffc7c7dc79d26" } ] } diff --git a/dist/codex/executive-assistant/.typeference/bundle.json b/dist/codex/executive-assistant/.typeference/bundle.json index 154da1d..c343d10 100644 --- a/dist/codex/executive-assistant/.typeference/bundle.json +++ b/dist/codex/executive-assistant/.typeference/bundle.json @@ -4,7 +4,7 @@ "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", "emit": true, "embeds": [ - "helio/person-agent@1.0.0" + "helio/profiles/person-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/correspondent@1.0.0" @@ -28,7 +28,7 @@ "skills": [ { "dispatchName": "executive-assistant.prepare-brief", - "contractId": "helio/skills/prepare-brief@1.0.0", + "capabilityId": "helio/capabilities/prepare-brief@1.0.0", "implementationId": "helio/skills/prepare-brief@1.0.0", "description": "Assemble an executive brief, requesting repository evidence when needed.", "instructions": "Build a decision-oriented brief from the supplied topic and evidence.\nWhen repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\n", @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/prepare-brief@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/prepare-brief@1.0.0" }, { "field": "skill.implementation", @@ -53,7 +53,7 @@ }, { "dispatchName": "executive-assistant.triage-message", - "contractId": "helio/skills/triage-message@1.0.0", + "capabilityId": "helio/capabilities/triage-message@1.0.0", "implementationId": "helio/skills/triage-message@1.0.0", "description": "Classify an inbound message and recommend an accountable next action.", "instructions": "Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\n", @@ -66,8 +66,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/triage-message@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/triage-message@1.0.0" }, { "field": "skill.implementation", @@ -77,68 +77,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/person-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "slots.principal", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/correspondent@1.0.0", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { - "field": "embeds.helio/person-agent@1.0.0", + "field": "embeds.helio/profiles/person-defaults@1.0.0", "source": "helio/executive-assistant@1.0.0" }, { diff --git a/dist/codex/payments-repo-agent/.agents/skills/repository-status/SKILL.md b/dist/codex/payments-repo-agent/.agents/skills/repository-status/SKILL.md index 297c403..9e8fcf8 100644 --- a/dist/codex/payments-repo-agent/.agents/skills/repository-status/SKILL.md +++ b/dist/codex/payments-repo-agent/.agents/skills/repository-status/SKILL.md @@ -3,7 +3,7 @@ name: repository-status description: "Report payments-service health with contract and reconciliation evidence." --- -Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness. +Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness. Do not report the service healthy when any required financial-control signal is unavailable. ## Context loaded on invocation diff --git a/dist/codex/payments-repo-agent/.typeference/bundle.json b/dist/codex/payments-repo-agent/.typeference/bundle.json index 84012ec..1396aa0 100644 --- a/dist/codex/payments-repo-agent/.typeference/bundle.json +++ b/dist/codex/payments-repo-agent/.typeference/bundle.json @@ -4,7 +4,7 @@ "description": "Specializes repository assistance for the fictional payments service.", "emit": true, "embeds": [ - "helio/repo-agent@1.0.0" + "helio/profiles/repository-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/repository-observer@1.0.0" @@ -28,10 +28,10 @@ "skills": [ { "dispatchName": "payments-repo-agent.repository-status", - "contractId": "helio/skills/repository-status@1.0.0", + "capabilityId": "helio/capabilities/repository-status@1.0.0", "implementationId": "helio/skills/payments-repository-status@1.0.0", "description": "Report payments-service health with contract and reconciliation evidence.", - "instructions": "Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", + "instructions": "Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", "inputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}", "outputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}", "contextFiles": [ @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/repository-status@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/repository-status@1.0.0" }, { "field": "skill.implementation", @@ -53,68 +53,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/repo-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "slots.repository", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/repository-observer@1.0.0", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { - "field": "embeds.helio/repo-agent@1.0.0", + "field": "embeds.helio/profiles/repository-defaults@1.0.0", "source": "helio/payments-repo-agent@1.0.0" }, { diff --git a/dist/copilot/executive-assistant/.typeference/bundle.json b/dist/copilot/executive-assistant/.typeference/bundle.json index 154da1d..c343d10 100644 --- a/dist/copilot/executive-assistant/.typeference/bundle.json +++ b/dist/copilot/executive-assistant/.typeference/bundle.json @@ -4,7 +4,7 @@ "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", "emit": true, "embeds": [ - "helio/person-agent@1.0.0" + "helio/profiles/person-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/correspondent@1.0.0" @@ -28,7 +28,7 @@ "skills": [ { "dispatchName": "executive-assistant.prepare-brief", - "contractId": "helio/skills/prepare-brief@1.0.0", + "capabilityId": "helio/capabilities/prepare-brief@1.0.0", "implementationId": "helio/skills/prepare-brief@1.0.0", "description": "Assemble an executive brief, requesting repository evidence when needed.", "instructions": "Build a decision-oriented brief from the supplied topic and evidence.\nWhen repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\n", @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/prepare-brief@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/prepare-brief@1.0.0" }, { "field": "skill.implementation", @@ -53,7 +53,7 @@ }, { "dispatchName": "executive-assistant.triage-message", - "contractId": "helio/skills/triage-message@1.0.0", + "capabilityId": "helio/capabilities/triage-message@1.0.0", "implementationId": "helio/skills/triage-message@1.0.0", "description": "Classify an inbound message and recommend an accountable next action.", "instructions": "Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\n", @@ -66,8 +66,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/triage-message@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/triage-message@1.0.0" }, { "field": "skill.implementation", @@ -77,68 +77,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/person-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "slots.principal", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/correspondent@1.0.0", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { - "field": "embeds.helio/person-agent@1.0.0", + "field": "embeds.helio/profiles/person-defaults@1.0.0", "source": "helio/executive-assistant@1.0.0" }, { diff --git a/dist/copilot/payments-repo-agent/.typeference/bundle.json b/dist/copilot/payments-repo-agent/.typeference/bundle.json index 84012ec..1396aa0 100644 --- a/dist/copilot/payments-repo-agent/.typeference/bundle.json +++ b/dist/copilot/payments-repo-agent/.typeference/bundle.json @@ -4,7 +4,7 @@ "description": "Specializes repository assistance for the fictional payments service.", "emit": true, "embeds": [ - "helio/repo-agent@1.0.0" + "helio/profiles/repository-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/repository-observer@1.0.0" @@ -28,10 +28,10 @@ "skills": [ { "dispatchName": "payments-repo-agent.repository-status", - "contractId": "helio/skills/repository-status@1.0.0", + "capabilityId": "helio/capabilities/repository-status@1.0.0", "implementationId": "helio/skills/payments-repository-status@1.0.0", "description": "Report payments-service health with contract and reconciliation evidence.", - "instructions": "Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", + "instructions": "Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", "inputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}", "outputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}", "contextFiles": [ @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/repository-status@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/repository-status@1.0.0" }, { "field": "skill.implementation", @@ -53,68 +53,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/repo-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "slots.repository", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/repository-observer@1.0.0", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { - "field": "embeds.helio/repo-agent@1.0.0", + "field": "embeds.helio/profiles/repository-defaults@1.0.0", "source": "helio/payments-repo-agent@1.0.0" }, { diff --git a/dist/cursor/executive-assistant/.typeference/bundle.json b/dist/cursor/executive-assistant/.typeference/bundle.json index 154da1d..c343d10 100644 --- a/dist/cursor/executive-assistant/.typeference/bundle.json +++ b/dist/cursor/executive-assistant/.typeference/bundle.json @@ -4,7 +4,7 @@ "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", "emit": true, "embeds": [ - "helio/person-agent@1.0.0" + "helio/profiles/person-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/correspondent@1.0.0" @@ -28,7 +28,7 @@ "skills": [ { "dispatchName": "executive-assistant.prepare-brief", - "contractId": "helio/skills/prepare-brief@1.0.0", + "capabilityId": "helio/capabilities/prepare-brief@1.0.0", "implementationId": "helio/skills/prepare-brief@1.0.0", "description": "Assemble an executive brief, requesting repository evidence when needed.", "instructions": "Build a decision-oriented brief from the supplied topic and evidence.\nWhen repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\n", @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/prepare-brief@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/prepare-brief@1.0.0" }, { "field": "skill.implementation", @@ -53,7 +53,7 @@ }, { "dispatchName": "executive-assistant.triage-message", - "contractId": "helio/skills/triage-message@1.0.0", + "capabilityId": "helio/capabilities/triage-message@1.0.0", "implementationId": "helio/skills/triage-message@1.0.0", "description": "Classify an inbound message and recommend an accountable next action.", "instructions": "Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\n", @@ -66,8 +66,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/triage-message@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/triage-message@1.0.0" }, { "field": "skill.implementation", @@ -77,68 +77,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/person-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "slots.principal", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/correspondent@1.0.0", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { - "field": "embeds.helio/person-agent@1.0.0", + "field": "embeds.helio/profiles/person-defaults@1.0.0", "source": "helio/executive-assistant@1.0.0" }, { diff --git a/dist/cursor/payments-repo-agent/.typeference/bundle.json b/dist/cursor/payments-repo-agent/.typeference/bundle.json index 84012ec..1396aa0 100644 --- a/dist/cursor/payments-repo-agent/.typeference/bundle.json +++ b/dist/cursor/payments-repo-agent/.typeference/bundle.json @@ -4,7 +4,7 @@ "description": "Specializes repository assistance for the fictional payments service.", "emit": true, "embeds": [ - "helio/repo-agent@1.0.0" + "helio/profiles/repository-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/repository-observer@1.0.0" @@ -28,10 +28,10 @@ "skills": [ { "dispatchName": "payments-repo-agent.repository-status", - "contractId": "helio/skills/repository-status@1.0.0", + "capabilityId": "helio/capabilities/repository-status@1.0.0", "implementationId": "helio/skills/payments-repository-status@1.0.0", "description": "Report payments-service health with contract and reconciliation evidence.", - "instructions": "Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", + "instructions": "Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", "inputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}", "outputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}", "contextFiles": [ @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/repository-status@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/repository-status@1.0.0" }, { "field": "skill.implementation", @@ -53,68 +53,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/repo-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "slots.repository", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/repository-observer@1.0.0", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { - "field": "embeds.helio/repo-agent@1.0.0", + "field": "embeds.helio/profiles/repository-defaults@1.0.0", "source": "helio/payments-repo-agent@1.0.0" }, { diff --git a/dist/neutral/executive-assistant/bundle.json b/dist/neutral/executive-assistant/bundle.json index 154da1d..c343d10 100644 --- a/dist/neutral/executive-assistant/bundle.json +++ b/dist/neutral/executive-assistant/bundle.json @@ -4,7 +4,7 @@ "description": "Coordinates an executive\u0027s correspondence, briefings, and cross-agent requests.", "emit": true, "embeds": [ - "helio/person-agent@1.0.0" + "helio/profiles/person-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/correspondent@1.0.0" @@ -28,7 +28,7 @@ "skills": [ { "dispatchName": "executive-assistant.prepare-brief", - "contractId": "helio/skills/prepare-brief@1.0.0", + "capabilityId": "helio/capabilities/prepare-brief@1.0.0", "implementationId": "helio/skills/prepare-brief@1.0.0", "description": "Assemble an executive brief, requesting repository evidence when needed.", "instructions": "Build a decision-oriented brief from the supplied topic and evidence.\nWhen repository status is material, request \u0060payments-repo-agent.repository-status\u0060 and incorporate its returned evidence with attribution.\n", @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/prepare-brief@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/prepare-brief@1.0.0" }, { "field": "skill.implementation", @@ -53,7 +53,7 @@ }, { "dispatchName": "executive-assistant.triage-message", - "contractId": "helio/skills/triage-message@1.0.0", + "capabilityId": "helio/capabilities/triage-message@1.0.0", "implementationId": "helio/skills/triage-message@1.0.0", "description": "Classify an inbound message and recommend an accountable next action.", "instructions": "Read the message and identify its sender, intent, urgency, decision owner, and requested deadline.\nSeparate facts from assumptions. Return a concise recommendation; do not send a reply.\n", @@ -66,8 +66,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/triage-message@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/triage-message@1.0.0" }, { "field": "skill.implementation", @@ -77,68 +77,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/person-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "slots.principal", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/correspondent@1.0.0", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { - "field": "embeds.helio/person-agent@1.0.0", + "field": "embeds.helio/profiles/person-defaults@1.0.0", "source": "helio/executive-assistant@1.0.0" }, { diff --git a/dist/neutral/executive-assistant/provenance.json b/dist/neutral/executive-assistant/provenance.json index 012f14c..4bd2556 100644 --- a/dist/neutral/executive-assistant/provenance.json +++ b/dist/neutral/executive-assistant/provenance.json @@ -1,66 +1,46 @@ [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/person-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "slots.principal", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/person-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/correspondent@1.0.0", - "source": "helio/person-agent@1.0.0" + "source": "helio/profiles/person-defaults@1.0.0" }, { - "field": "embeds.helio/person-agent@1.0.0", + "field": "embeds.helio/profiles/person-defaults@1.0.0", "source": "helio/executive-assistant@1.0.0" }, { diff --git a/dist/neutral/payments-repo-agent/bundle.json b/dist/neutral/payments-repo-agent/bundle.json index 84012ec..1396aa0 100644 --- a/dist/neutral/payments-repo-agent/bundle.json +++ b/dist/neutral/payments-repo-agent/bundle.json @@ -4,7 +4,7 @@ "description": "Specializes repository assistance for the fictional payments service.", "emit": true, "embeds": [ - "helio/repo-agent@1.0.0" + "helio/profiles/repository-defaults@1.0.0" ], "satisfies": [ "helio/interfaces/repository-observer@1.0.0" @@ -28,10 +28,10 @@ "skills": [ { "dispatchName": "payments-repo-agent.repository-status", - "contractId": "helio/skills/repository-status@1.0.0", + "capabilityId": "helio/capabilities/repository-status@1.0.0", "implementationId": "helio/skills/payments-repository-status@1.0.0", "description": "Report payments-service health with contract and reconciliation evidence.", - "instructions": "Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", + "instructions": "Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness.\nDo not report the service healthy when any required financial-control signal is unavailable.\n", "inputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022focus\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022additionalProperties\u0022:false}", "outputSchema": "{\u0022type\u0022:\u0022object\u0022,\u0022properties\u0022:{\u0022status\u0022:{\u0022type\u0022:\u0022string\u0022},\u0022evidence\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}},\u0022risks\u0022:{\u0022type\u0022:\u0022array\u0022,\u0022items\u0022:{\u0022type\u0022:\u0022string\u0022}}},\u0022required\u0022:[\u0022status\u0022,\u0022evidence\u0022,\u0022risks\u0022]}", "contextFiles": [ @@ -42,8 +42,8 @@ ], "provenance": [ { - "field": "skill.contract", - "source": "helio/skills/repository-status@1.0.0" + "field": "skill.capability", + "source": "helio/capabilities/repository-status@1.0.0" }, { "field": "skill.implementation", @@ -53,68 +53,48 @@ } ], "provenance": [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/repo-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "slots.repository", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/repository-observer@1.0.0", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { - "field": "embeds.helio/repo-agent@1.0.0", + "field": "embeds.helio/profiles/repository-defaults@1.0.0", "source": "helio/payments-repo-agent@1.0.0" }, { diff --git a/dist/neutral/payments-repo-agent/provenance.json b/dist/neutral/payments-repo-agent/provenance.json index 4b865a5..6a5b701 100644 --- a/dist/neutral/payments-repo-agent/provenance.json +++ b/dist/neutral/payments-repo-agent/provenance.json @@ -1,66 +1,46 @@ [ - { - "field": "displayName", - "source": "helio/enterprise-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/enterprise-agent@1.0.0" - }, { "field": "slots.organization", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "slots.safetyPolicy", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/enterprise-agent@1.0.0" + "source": "helio/profiles/enterprise-defaults@1.0.0" }, { - "field": "embeds.helio/enterprise-agent@1.0.0", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "displayName", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "description", - "source": "helio/repo-agent@1.0.0" + "field": "embeds.helio/profiles/enterprise-defaults@1.0.0", + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "slots.repository", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "workingNorms", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { "field": "contextFiles", - "source": "helio/repo-agent@1.0.0" - }, - { - "field": "satisfies.helio/interfaces/repository-observer@1.0.0", - "source": "helio/repo-agent@1.0.0" + "source": "helio/profiles/repository-defaults@1.0.0" }, { - "field": "embeds.helio/repo-agent@1.0.0", + "field": "embeds.helio/profiles/repository-defaults@1.0.0", "source": "helio/payments-repo-agent@1.0.0" }, { diff --git a/dist/neutral/payments-repo-agent/skills/repository-status/SKILL.md b/dist/neutral/payments-repo-agent/skills/repository-status/SKILL.md index 297c403..9e8fcf8 100644 --- a/dist/neutral/payments-repo-agent/skills/repository-status/SKILL.md +++ b/dist/neutral/payments-repo-agent/skills/repository-status/SKILL.md @@ -3,7 +3,7 @@ name: repository-status description: "Report payments-service health with contract and reconciliation evidence." --- -Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness. +Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness. Do not report the service healthy when any required financial-control signal is unavailable. ## Context loaded on invocation diff --git a/docs/assets/compiler-pipeline.svg b/docs/assets/compiler-pipeline.svg index 53749d9..db95212 100644 --- a/docs/assets/compiler-pipeline.svg +++ b/docs/assets/compiler-pipeline.svg @@ -2,7 +2,7 @@ TypeFerence compiler pipelineTyped YAML is validated and resolved to an intermediate representation, then emitted through native adapters. Typed YAMLagents, interfaces, skills - Validatecontracts and paths + Validatecapabilities and paths Resolved IRbehavior plus provenance Codex diff --git a/docs/assets/dispatch.svg b/docs/assets/dispatch.svg index 4bb154a..8239618 100644 --- a/docs/assets/dispatch.svg +++ b/docs/assets/dispatch.svg @@ -1,7 +1,7 @@ - Polymorphic skill dispatchA derived MCP tool call resolves a base contract to a specialized implementation and returns an invocation package. + Polymorphic skill dispatchA derived MCP tool call resolves a capability to a specialized implementation and returns an invocation package. MCP callpayments-repo-agent.repository-status - Resolve contractrepository-status@1.0.0nearest compatible override + Resolve capabilityrepository-status@1.0.0nearest compatible binding Invocation package- specialized instructions- validated arguments- conditional context- target hints- source provenance diff --git a/docs/assets/type-hierarchy.svg b/docs/assets/type-hierarchy.svg index 0c0c833..4439842 100644 --- a/docs/assets/type-hierarchy.svg +++ b/docs/assets/type-hierarchy.svg @@ -3,9 +3,9 @@ embedded by - helio/enterprise-agentgovernance and shared norms - helio/person-agentpromotes enterprise behavior - helio/repo-agentpromotes enterprise behavior + helio/profiles/enterprise-defaultsgovernance and shared norms + helio/profiles/person-defaultspromotes enterprise behavior + helio/profiles/repository-defaultspromotes enterprise behavior executive-assistantstructurally a correspondent - payments-repo-agentbinds a compatible skill contract + payments-repo-agentbinds a closer capability implementation diff --git a/docs/specification.md b/docs/specification.md index 374673c..b3672bc 100644 --- a/docs/specification.md +++ b/docs/specification.md @@ -1,42 +1,44 @@ # TypeFerence Draft Specification -Status: experimental reference draft, July 2026. Typed resources use `schemaVersion: 2`; this document is not a claim of ecosystem-standard or production-stable status. +Status: experimental reference draft, July 2026. Typed resources use `schemaVersion: 3`; this document is not a claim of ecosystem-standard or production-stable status. ## Scope and non-goals -TypeFerence defines structural composition and deterministic compilation of agent instructions, skill contracts, and context references. It does not define an inference runtime, guarantee equivalent behavior across models or hosts, establish publisher trust, or provide resource discovery. +TypeFerence defines structural composition and deterministic compilation of agent instructions, capability contracts, skill implementations, and context references. It does not define an inference runtime, guarantee equivalent behavior across models or hosts, establish publisher trust, or provide resource discovery. Agentic Resource Discovery (ARD) can advertise compiled TypeFerence outputs. ARD identifies and locates artifacts; TypeFerence produces target-specific artifacts before publication. Invocation remains the responsibility of MCP, A2A, OpenAPI, or a host-native mechanism. ## Resource identity -A source tree contains YAML documents with `schemaVersion: 2`, a `kind`, and an `id`. IDs use `namespace/name@semantic-version`. Supported kinds are `agent`, `interface`, and `skill`. +A source tree contains YAML documents with `schemaVersion: 3`, a `kind`, and an `id`. IDs use `namespace/name@semantic-version`. Supported kinds are `agent`, `profile`, `interface`, `capability`, and `skill`. -## Agents +## Agents and profiles -An agent MAY embed zero or more agents. Embedding promotes the embedded agents' slots, norms, contexts, and skills into the embedding agent. An embedding graph MUST NOT contain a cycle. No universal root is required. +An agent is an identity-bearing unit that MAY produce target artifacts. A profile is a reusable composition unit for organizational, domain, or team defaults. Agents MAY embed profiles or agents. Profiles MAY embed profiles but MUST NOT embed agents. Embedding promotes the embedded resources' slots, norms, contexts, and capability bindings into the embedding resource. An embedding graph MUST NOT contain a cycle. No universal root is required. -An agent with `emit: false` participates in composition and validation but does not produce a target bundle. This is useful for reusable organizational or domain components without introducing abstract base types. +Profiles participate in composition and validation but do not produce target bundles. This lets users start with `kind: agent` while platform teams define reusable profiles underneath. -Resolution proceeds from embedded agents toward the embedding agent: +Resolution proceeds from embedded resources toward the embedding resource: -1. Display name and description belong to the declaring agent and are not promoted. -2. Slots are promoted by name. The shallowest declaration wins; conflicting declarations at the same depth are ambiguous unless the embedding agent declares that slot locally. +1. Display name and description belong to the declaring resource and are not promoted. +2. Slots are promoted by name. The shallowest declaration wins; conflicting declarations at the same depth are ambiguous unless the embedding resource declares that slot locally. 3. Norms and context paths append in embedding order and deduplicate in first-seen order. -4. Skills are promoted by contract ID. The shallowest implementation wins; conflicting implementations at the same depth are ambiguous unless the embedding agent declares that contract locally. +4. Capability bindings are promoted by capability ID. The shallowest implementation wins; conflicting implementations at the same depth are ambiguous unless the embedding resource binds that capability locally. 5. Interfaces are computed structurally from the final promoted member set. Every resolved contribution records its source resource in provenance. ## Interfaces -Interfaces are contracts only. They MAY require slot names and skill contract IDs, and MAY embed other interfaces. They MUST NOT provide implementation. Every agent whose resolved slots and skill contracts contain all requirements satisfies the interface implicitly; agents do not declare `implements`. Interface embedding MUST NOT contain a cycle. +Interfaces are contracts only. They MAY require slot names and capability IDs, and MAY embed other interfaces. They MUST NOT provide implementation. Every agent whose resolved slots and capability bindings contain all requirements satisfies the interface implicitly; agents do not declare `implements`. Interface embedding MUST NOT contain a cycle. -## Skills and contract implementations +## Capabilities and skill implementations -A skill defines instructions, conditional context references, and JSON input/output schemas. Adding a skill establishes its own ID as the contract ID. A binding MAY name a different `contract`; its `ref` is then the local implementation of that contract. +A capability defines a stable semantic method slot and its public JSON input/output schemas. It has no instructions and no runtime context. -A contract implementation MUST preserve canonical input and output schemas. It MAY change instructions, description, and conditional context. The outer dispatch name resolves to the local implementation while the embedded agent retains its own namespace. +A skill defines instructions, conditional context references, and JSON input/output schemas. Every skill MUST declare `binds: `. A skill implementation MUST preserve the bound capability's canonical input and output schemas. It MAY change instructions, description, and conditional context. + +An agent's or profile's `skills` list binds skill implementations into that resource's resolved method set. If a binding omits `capability`, the capability is inferred from the referenced skill's `binds` field. If it names `capability`, that value MUST match the referenced skill's `binds` field. The outer dispatch name resolves the capability to the nearest compatible skill implementation while the embedded resource retains its own namespace. ## Dispatch diff --git a/docs/whitepaper.md b/docs/whitepaper.md index 200e5f0..60ada21 100644 --- a/docs/whitepaper.md +++ b/docs/whitepaper.md @@ -8,7 +8,7 @@ TypeFerence contributors - July 2026 Organizations are teaching AI assistants the same business rules repeatedly: once for a coding agent, again for an executive assistant, again for each repository, and again for every vendor-specific Markdown format. The result is semantic drift hidden inside apparently simple files. -TypeFerence treats agent definitions as typed source code. Organizations define reusable agents, structurally satisfied interfaces, and versioned skills, then combine behavior through Go-like embedding. A deterministic compiler resolves those definitions and emits native artifacts for Codex, GitHub Copilot, Cursor, neutral Agent Markdown, and MCP. The central result is not merely portability. It is coherent reuse of domain decisions across people, repositories, tools, and time. Behavioral equivalence across hosts is the long-term objective; v2 supplies a typed baseline from which equivalence can be evaluated rather than claiming it has already been achieved. +TypeFerence treats agent definitions as typed source code. Organizations define reusable profiles, structurally satisfied interfaces, versioned capabilities, and skill implementations, then combine behavior through Go-like embedding. A deterministic compiler resolves those definitions and emits native artifacts for Codex, GitHub Copilot, Cursor, neutral Agent Markdown, and MCP. The central result is not merely portability. It is coherent reuse of domain decisions across people, repositories, tools, and time. Behavioral equivalence across hosts is the long-term objective; v3 supplies a typed baseline from which equivalence can be evaluated rather than claiming it has already been achieved. ## 1. The coherence problem @@ -20,9 +20,9 @@ TypeFerence introduces a canonical typed layer above runtime Markdown. Source de ## 2. Composition over ancestry -TypeFerence has no universal root. Organizations can define a reusable enterprise agent as the home for organization-wide norms and governance, then embed it wherever those behaviors belong. Agents with unrelated responsibilities do not need to pretend they share an ancestor. +TypeFerence has no universal root. Organizations can define reusable profiles as the home for organization-wide norms and governance, then embed them wherever those behaviors belong. Agents with unrelated responsibilities do not need to pretend they share an ancestor. -An embedding agent promotes the slots, norms, context, and skill contracts of its embedded agents. It can embed more than one reusable component. Local declarations resolve promoted-name conflicts explicitly, so composition never depends on a hidden linearization order. +An embedding agent promotes the slots, norms, context, and capability bindings of its embedded profiles or agents. It can embed more than one reusable component. Local declarations resolve promoted-name conflicts explicitly, so composition never depends on a hidden linearization order. ![Agent embedding](assets/type-hierarchy.svg) @@ -30,15 +30,15 @@ This separation matters. The framework owns composition mechanics while organiza ## 3. A sustainable object model -Agents may embed multiple agents. Interfaces state required slots and skill contracts but contribute no implementation, and interfaces may themselves embed narrower interfaces. Agents satisfy them implicitly when their resolved member sets match—there is no nominal `implements` list to drift out of sync. +Agents may embed multiple profiles or agents. Profiles may embed other profiles. Interfaces state required slots and capabilities but contribute no implementation, and interfaces may themselves embed narrower interfaces. Agents satisfy them implicitly when their resolved member sets match—there is no nominal `implements` list to drift out of sync. -Skills behave like versioned methods. A repository agent may provide `repository-status`. A payments repository agent can bind a specialized implementation to that promoted contract while preserving the same JSON input and output schemas. Callers use the outer namespace and receive its explicitly selected implementation. +Capabilities behave like versioned method slots. A repository profile may bind the default `repository-status` skill implementation. A payments repository agent can bind a specialized skill implementation to that same promoted capability while preserving the capability's JSON input and output schemas. Callers use the outer namespace and receive its explicitly selected implementation. -This is structural substitutability rather than text concatenation. An interface can require a status capability without knowing which concrete repository agent will satisfy it. Compilation reports structural matches, rejects ambiguous promotion, and rejects contract-breaking implementations before runtime. Whether two model executions behave equivalently remains an empirical question for evaluation, not a compiler guarantee. +This is structural substitutability rather than text concatenation. An interface can require a status capability without knowing which concrete repository agent will satisfy it. Compilation reports structural matches, rejects ambiguous promotion, and rejects capability-breaking implementations before runtime. Whether two model executions behave equivalently remains an empirical question for evaluation, not a compiler guarantee. ## 4. Compilation and native targets -The compiler parses resources, validates references, resolves embedding graphs, computes structural interface satisfaction, canonicalizes skill contracts, and creates a normalized intermediate representation. Target adapters then emit platform-native artifacts. +The compiler parses resources, validates references, resolves profile and agent embedding graphs, computes structural interface satisfaction, canonicalizes capability bindings, and creates a normalized intermediate representation. Target adapters then emit platform-native artifacts. ![Compiler pipeline](assets/compiler-pipeline.svg) @@ -64,7 +64,7 @@ Static host configurations are installable artifacts, not remotely callable agen Large prompts are not required. A skill contains a concise description for discovery, its focused instructions, input/output schemas, and only the context references needed when invoked. The host receives an invocation package and loads that context at execution time. -MCP provides the runtime object boundary. Each concrete method is exposed as `agent-name.skill-name`. Calling `payments-repo-agent.repository-status` resolves the base contract to the payments implementation, validates arguments, and returns instructions, context references, target hints, and provenance. +MCP provides the runtime object boundary. Each concrete method is exposed as `agent-name.skill-name`. Calling `payments-repo-agent.repository-status` resolves the repository-status capability to the payments implementation, validates arguments, and returns instructions, context references, target hints, and provenance. ![Dispatch](assets/dispatch.svg) @@ -72,21 +72,21 @@ TypeFerence intentionally does not select a model or execute an agent turn. It c ## 7. Agents beyond repositories -Engineering teams are plausible early adopters because their work is already versioned and reviewable, but the model is not repository-specific. The Helio example includes a generic person agent, an executive assistant, a repository agent, and a specialized payments repository agent. +Engineering teams are plausible early adopters because their work is already versioned and reviewable, but the model is not repository-specific. The Helio example includes generic person and repository profiles, an executive assistant, and a specialized payments repository agent. -The executive assistant can prepare a decision brief. When repository evidence is material, its skill requests the specialized repository-status method. The repository agent returns an invocation package grounded in its own domain context. The person-facing agent incorporates that evidence without duplicating repository knowledge. +The executive assistant can prepare a decision brief. When repository evidence is material, its skill requests the specialized repository-status method. The repository-facing agent returns an invocation package grounded in its own domain context. The person profile contributes communication behavior without duplicating repository knowledge. ![Cross-agent interaction](assets/cross-agent.svg) -This arrangement preserves distinct responsibilities. The executive assistant owns the shape of the brief. The repository agent owns technical status semantics. The enterprise base owns shared governance. TypeFerence owns how those parts compose. +This arrangement preserves distinct responsibilities. The executive assistant owns the shape of the brief. The repository profile owns default technical status semantics. The enterprise profile owns shared governance. TypeFerence owns how those parts compose. ## 8. Diff as governance Traditional infrastructure tools made declarative diffs operationally important. TypeFerence applies the useful portion of that idea without coupling compilation to deployment. Its lifecycle is author, validate, resolve, compile, diff, and publish. -A change to an enterprise norm can be compiled across every concrete agent. Reviewers can inspect exactly which target artifacts changed. Provenance answers why a line exists and which embedded agent or skill supplied it. Contract validation prevents an apparently harmless specialization from silently changing what callers may send or expect. +A change to an enterprise norm can be compiled across every concrete agent. Reviewers can inspect exactly which target artifacts changed. Provenance answers why a line exists and which embedded profile, agent, or skill supplied it. Capability validation prevents an apparently harmless specialization from silently changing what callers may send or expect. -This enables governance through normal software practices: pull requests, deterministic CI, golden artifacts, versioned contracts, and explicit ownership. +This enables governance through normal software practices: pull requests, deterministic CI, golden artifacts, versioned capabilities, and explicit ownership. ## 9. Boundaries and future work @@ -100,7 +100,7 @@ The important boundary should remain: portable mechanics in TypeFerence, behavio Agent coherence is not achieved by finding one perfect prompt. It is achieved by giving organizational behavior a maintainable type system and compiling that system into the places where work happens. -TypeFerence offers a compact thesis: define agent configuration once, embed intentionally, implement contracts compatibly, load context when needed, and emit native artifacts for each execution surface. The result is less duplicated Markdown, clearer ownership, and reviewable change. The route toward behavioral equivalence is then concrete: declare shared contracts, compile traceable target variants, and evaluate those variants against the same scenarios. +TypeFerence offers a compact thesis: define agent configuration once, embed intentionally, implement capabilities compatibly, load context when needed, and emit native artifacts for each execution surface. The result is less duplicated Markdown, clearer ownership, and reviewable change. The route toward behavioral equivalence is then concrete: declare shared capabilities, compile traceable target variants, and evaluate those variants against the same scenarios. ## References diff --git a/examples/helio/agents/executive-assistant.agent.yaml b/examples/helio/agents/executive-assistant.agent.yaml index c65989c..5bada56 100644 --- a/examples/helio/agents/executive-assistant.agent.yaml +++ b/examples/helio/agents/executive-assistant.agent.yaml @@ -1,10 +1,10 @@ -schemaVersion: 2 +schemaVersion: 3 kind: agent id: helio/executive-assistant@1.0.0 displayName: Helio Executive Assistant description: Coordinates an executive's correspondence, briefings, and cross-agent requests. embeds: - - helio/person-agent@1.0.0 + - helio/profiles/person-defaults@1.0.0 contextFiles: - context/executive-rhythm.md skills: diff --git a/examples/helio/agents/payments-repo-agent.agent.yaml b/examples/helio/agents/payments-repo-agent.agent.yaml index 7059023..40fde20 100644 --- a/examples/helio/agents/payments-repo-agent.agent.yaml +++ b/examples/helio/agents/payments-repo-agent.agent.yaml @@ -1,12 +1,12 @@ -schemaVersion: 2 +schemaVersion: 3 kind: agent id: helio/payments-repo-agent@1.0.0 displayName: Helio Payments Repository Agent description: Specializes repository assistance for the fictional payments service. embeds: - - helio/repo-agent@1.0.0 + - helio/profiles/repository-defaults@1.0.0 contextFiles: - context/payments-service.md skills: - ref: helio/skills/payments-repository-status@1.0.0 - contract: helio/skills/repository-status@1.0.0 + capability: helio/capabilities/repository-status@1.0.0 diff --git a/examples/helio/agents/person-agent.agent.yaml b/examples/helio/agents/person-agent.agent.yaml deleted file mode 100644 index d094525..0000000 --- a/examples/helio/agents/person-agent.agent.yaml +++ /dev/null @@ -1,16 +0,0 @@ -schemaVersion: 2 -kind: agent -id: helio/person-agent@1.0.0 -displayName: Helio Person Agent -description: Handles respectful inbound and outbound assistance for a person. -emit: false -embeds: - - helio/enterprise-agent@1.0.0 -slots: - principal: context/principal.md -workingNorms: - - Distinguish drafts from messages approved for delivery. -contextFiles: - - context/principal.md -skills: - - ref: helio/skills/triage-message@1.0.0 diff --git a/examples/helio/capabilities/prepare-brief.capability.yaml b/examples/helio/capabilities/prepare-brief.capability.yaml new file mode 100644 index 0000000..3eca798 --- /dev/null +++ b/examples/helio/capabilities/prepare-brief.capability.yaml @@ -0,0 +1,7 @@ +schemaVersion: 3 +kind: capability +id: helio/capabilities/prepare-brief@1.0.0 +displayName: Prepare Brief +description: Capability slot for assembling decision-oriented executive briefs. +inputSchema: '{"type":"object","properties":{"topic":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}}},"required":["topic"],"additionalProperties":false}' +outputSchema: '{"type":"object","properties":{"brief":{"type":"string"},"openQuestions":{"type":"array","items":{"type":"string"}}},"required":["brief","openQuestions"]}' diff --git a/examples/helio/capabilities/repository-status.capability.yaml b/examples/helio/capabilities/repository-status.capability.yaml new file mode 100644 index 0000000..27911ad --- /dev/null +++ b/examples/helio/capabilities/repository-status.capability.yaml @@ -0,0 +1,7 @@ +schemaVersion: 3 +kind: capability +id: helio/capabilities/repository-status@1.0.0 +displayName: Repository Status +description: Capability slot for evidence-backed repository health summaries. +inputSchema: '{"type":"object","properties":{"focus":{"type":"string"}},"additionalProperties":false}' +outputSchema: '{"type":"object","properties":{"status":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"risks":{"type":"array","items":{"type":"string"}}},"required":["status","evidence","risks"]}' diff --git a/examples/helio/capabilities/triage-message.capability.yaml b/examples/helio/capabilities/triage-message.capability.yaml new file mode 100644 index 0000000..9a2121e --- /dev/null +++ b/examples/helio/capabilities/triage-message.capability.yaml @@ -0,0 +1,7 @@ +schemaVersion: 3 +kind: capability +id: helio/capabilities/triage-message@1.0.0 +displayName: Triage Message +description: Capability slot for classifying inbound messages and selecting accountable next actions. +inputSchema: '{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}' +outputSchema: '{"type":"object","properties":{"summary":{"type":"string"},"urgency":{"type":"string"},"owner":{"type":"string"},"nextAction":{"type":"string"}},"required":["summary","urgency","owner","nextAction"]}' diff --git a/examples/helio/interfaces/correspondent.interface.yaml b/examples/helio/interfaces/correspondent.interface.yaml index 06ba11c..7339374 100644 --- a/examples/helio/interfaces/correspondent.interface.yaml +++ b/examples/helio/interfaces/correspondent.interface.yaml @@ -1,9 +1,9 @@ -schemaVersion: 2 +schemaVersion: 3 kind: interface id: helio/interfaces/correspondent@1.0.0 displayName: Correspondent description: Contract for agents that assess and route communications. requiresSlots: - principal -requiresSkills: - - helio/skills/triage-message@1.0.0 +requiresCapabilities: + - helio/capabilities/triage-message@1.0.0 diff --git a/examples/helio/interfaces/repository-observer.interface.yaml b/examples/helio/interfaces/repository-observer.interface.yaml index 3762244..375e5bf 100644 --- a/examples/helio/interfaces/repository-observer.interface.yaml +++ b/examples/helio/interfaces/repository-observer.interface.yaml @@ -1,9 +1,9 @@ -schemaVersion: 2 +schemaVersion: 3 kind: interface id: helio/interfaces/repository-observer@1.0.0 displayName: Repository Observer description: Contract for agents that can report evidence-backed repository status. requiresSlots: - repository -requiresSkills: - - helio/skills/repository-status@1.0.0 +requiresCapabilities: + - helio/capabilities/repository-status@1.0.0 diff --git a/examples/helio/agents/enterprise-agent.agent.yaml b/examples/helio/profiles/enterprise-defaults.profile.yaml similarity index 62% rename from examples/helio/agents/enterprise-agent.agent.yaml rename to examples/helio/profiles/enterprise-defaults.profile.yaml index 3925682..8306dc9 100644 --- a/examples/helio/agents/enterprise-agent.agent.yaml +++ b/examples/helio/profiles/enterprise-defaults.profile.yaml @@ -1,9 +1,8 @@ -schemaVersion: 2 -kind: agent -id: helio/enterprise-agent@1.0.0 -displayName: Helio Enterprise Agent -description: Shared organizational identity and governance for every Helio agent. -emit: false +schemaVersion: 3 +kind: profile +id: helio/profiles/enterprise-defaults@1.0.0 +displayName: Helio Enterprise Defaults +description: Shared organizational governance for every Helio resource. slots: organization: context/organization.md safetyPolicy: context/safety-policy.md diff --git a/examples/helio/profiles/person-defaults.profile.yaml b/examples/helio/profiles/person-defaults.profile.yaml new file mode 100644 index 0000000..73977ac --- /dev/null +++ b/examples/helio/profiles/person-defaults.profile.yaml @@ -0,0 +1,15 @@ +schemaVersion: 3 +kind: profile +id: helio/profiles/person-defaults@1.0.0 +displayName: Helio Person Defaults +description: Reusable behavior for respectful inbound and outbound assistance for a person. +embeds: + - helio/profiles/enterprise-defaults@1.0.0 +slots: + principal: context/principal.md +workingNorms: + - Distinguish drafts from messages approved for delivery. +contextFiles: + - context/principal.md +skills: + - ref: helio/skills/triage-message@1.0.0 diff --git a/examples/helio/agents/repo-agent.agent.yaml b/examples/helio/profiles/repository-defaults.profile.yaml similarity index 50% rename from examples/helio/agents/repo-agent.agent.yaml rename to examples/helio/profiles/repository-defaults.profile.yaml index 7d01d07..7fa7784 100644 --- a/examples/helio/agents/repo-agent.agent.yaml +++ b/examples/helio/profiles/repository-defaults.profile.yaml @@ -1,11 +1,10 @@ -schemaVersion: 2 -kind: agent -id: helio/repo-agent@1.0.0 -displayName: Helio Repository Agent -description: Applies Helio delivery practices within a software repository. -emit: false +schemaVersion: 3 +kind: profile +id: helio/profiles/repository-defaults@1.0.0 +displayName: Helio Repository Defaults +description: Reusable delivery practices for software repository assistance. embeds: - - helio/enterprise-agent@1.0.0 + - helio/profiles/enterprise-defaults@1.0.0 slots: repository: context/repository.md workingNorms: diff --git a/examples/helio/skills/payments-repository-status.skill.yaml b/examples/helio/skills/payments-repository-status.skill.yaml index 4251888..a46bb33 100644 --- a/examples/helio/skills/payments-repository-status.skill.yaml +++ b/examples/helio/skills/payments-repository-status.skill.yaml @@ -1,12 +1,13 @@ -schemaVersion: 2 +schemaVersion: 3 kind: skill id: helio/skills/payments-repository-status@1.0.0 +binds: helio/capabilities/repository-status@1.0.0 displayName: Payments Repository Status description: Report payments-service health with contract and reconciliation evidence. contextFiles: - context/payments-service.md instructions: | - Apply the repository-status contract, then include payment-contract compatibility, reconciliation checks, and rollback readiness. + Apply the repository-status capability, then include payment-contract compatibility, reconciliation checks, and rollback readiness. Do not report the service healthy when any required financial-control signal is unavailable. inputSchema: '{"type":"object","properties":{"focus":{"type":"string"}},"additionalProperties":false}' outputSchema: '{"type":"object","properties":{"status":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"risks":{"type":"array","items":{"type":"string"}}},"required":["status","evidence","risks"]}' diff --git a/examples/helio/skills/prepare-brief.skill.yaml b/examples/helio/skills/prepare-brief.skill.yaml index 0711c2c..ba4c2d6 100644 --- a/examples/helio/skills/prepare-brief.skill.yaml +++ b/examples/helio/skills/prepare-brief.skill.yaml @@ -1,6 +1,7 @@ -schemaVersion: 2 +schemaVersion: 3 kind: skill id: helio/skills/prepare-brief@1.0.0 +binds: helio/capabilities/prepare-brief@1.0.0 displayName: Prepare Brief description: Assemble an executive brief, requesting repository evidence when needed. contextFiles: diff --git a/examples/helio/skills/repository-status.skill.yaml b/examples/helio/skills/repository-status.skill.yaml index 133cde6..0502cda 100644 --- a/examples/helio/skills/repository-status.skill.yaml +++ b/examples/helio/skills/repository-status.skill.yaml @@ -1,6 +1,7 @@ -schemaVersion: 2 +schemaVersion: 3 kind: skill id: helio/skills/repository-status@1.0.0 +binds: helio/capabilities/repository-status@1.0.0 displayName: Repository Status description: Summarize repository health using current version-control and test evidence. instructions: | diff --git a/examples/helio/skills/triage-message.skill.yaml b/examples/helio/skills/triage-message.skill.yaml index b685fe4..8d0e69f 100644 --- a/examples/helio/skills/triage-message.skill.yaml +++ b/examples/helio/skills/triage-message.skill.yaml @@ -1,6 +1,7 @@ -schemaVersion: 2 +schemaVersion: 3 kind: skill id: helio/skills/triage-message@1.0.0 +binds: helio/capabilities/triage-message@1.0.0 displayName: Triage Message description: Classify an inbound message and recommend an accountable next action. instructions: | diff --git a/output/pdf/typeference-whitepaper.pdf b/output/pdf/typeference-whitepaper.pdf index ea9220f791c3455f1d319a1c3f7ac2e9b669c855..cdfc96d1313576848ab488ed0973ace5e8fda973 100644 GIT binary patch delta 15369 zcmZXb%MOCxzTdMuID_3`PfnAL4vL7Vpn`}ZARsCVf(nRS6fdACqIel~VB2)s@jq$O zqz}=g!zS&#PtXp|6Z93zJ{_H1N5}{->$g7N%lhB{{crx;|M;7K^I!h-$NtxB{F!C{ z{QkVc{r%75{pU`z(n)=kmuWVUING#=h}60hpat27&@|Yt4=yj%4}Wd9 zb`aDucuk$U4y%@CnP58KjwKCWLOS93sC;6z=Bj_D?n-lr9+asj!NYhbfHnY%99Q7A zfqRz?hw<4BE?Yra^vj80KovK;gPNn9X5(v>^4pIPtFX13)B=traNyLw+e-7N;v*aj zufVrc-XcrzBQ%DJPF|R$X^3#hY1sHaxeZG55>>YDn0CND?pEIK*+=ONtj3Y@2^)(M z%(G2KRAc)@1((+N?RZK3y6}%KS&ZmU%Z>mUIu;Mr=R%b$&}UnnCoVs$#US&$7+o6< zi$_25LeAeOil*TC72>YvopPt+4#JpvS^=%BP4|nrn`_CwYOBGP8Jx%lg=jl*h7qd% zos6K#nt>l0+p7z=Lr|7x$VCu1*`MuQDryzSa5A7Lk5ffx)3b%j`x*5eVZR7^PPxlF zqeU!wuCc(r;`&=J#UdURn;IQ7ee>O1%YCXm5RcE=i3GvKW8P19P?~&quI#ICoVRL4 zlxDWq%Gp7R9pW0nqmxx_wvHo!TT_oRorEiJQ}VA58g53bVL2Oh(}XN7R=@dJp0LjZ zehfR0a~USrkXpEf%k^=$pmm%;Ne68U*oa;=p8Cb8e zrw4v1csRCrbZf2j(K?H@L6o#LX9{x;aDkS>X{Qo%xu%Haz^duU^4T00X!VDoGrEC# zw_b1i9(|UaS(_b~W9yo(u-l-zNmq?CM$bOQa8MtSwW78(@lvxcQZxvRhsA^q`8F$6 z*ZWnn^s0xeS;6gQzyBcajPmY8)z|ew-Lu8ougwOPp;$W@_q`h~&$~-sN}7T26ZA_P ze4}ZbhPEtU+7WlPU1>965_DI*QkuFkJH!ghj<@pKWJZc`kC4ax>=l!T3;J*%ZJ6NI z#CDS5r8(UvW$G$+)LASQ>#djhwFx}kw|vE^1pDPfy}G5ysOu4+2yW!0#w7Wrws$5Q zfIFc(YO?1GAFLy9oob@EDph)3xtjpb!{&R{+&qg5Rf-qi$+(@~OexIh)BVbRW__Ym z89`~4Z7CB7TH#EyziSDVw_GDvz0tAFFk~6wrK+Y9LQgE~CUaiZ_W8oT&7syWY&1uo z(Vrn?#<-ZZmOgwBYMKtrR|@4!FHIW8MAsH}eb| z2sZw!vSjsd6poMEptmkmSKA5OX`VxJ?0y)3S{$U;ZuL-C{XyMtvM$>jHpcC4cvtMh zMGC+Iz3eK8*_yD&v2;EpnCCww%?DT~o~zA`(JpT1>EKkW zSi6(FuSd(NpU!iCbGq=KRmqx@Zy0M=2zq-E+}dva zN>+y$?+(v>PH8tC2Lm@BY12z(UV4n24qa0gZzNeyBmV}taMfV< zo11oPF)gR*b0L1|@#$S0S^z&D-Jkda{sNwjXf4Xp*!<0nY*#>gLQy>qZ??Sf(rI>K z^tg-R61;MrM=CuH)A;(@#7ssH|M<7>KmCh8{!jcT=0_03KY@&IV|bod_y97`J>zy# zKgEEH_7lCV2`mlsL0eZ|=S-3Af?V>!=XbI8u4j973AB=Yq>6K`byH}2Tw$l0=fXX%^YYhcKiqMi08u0pcEKAL%^BDSZM#O;>Cn#t1laBB z`&wIXW6UvnwhGR3hmYS-QQ{Y^mF<0tpZO0_$l_q^Tc(X)569_QJ}{fRxvmKM$XPX+ zfEdqSn-&a_5QmFKW}eiODM=5XOG4d8H#5QeRp{_J->?G{P z8gxX6t+n7_>{{bjKgx$XX1|kc#iMIOE6k!iQ|Pe&gd$?aj|$qiVAbWbS3D|dw3jBdrw$Gb;I1g zx}EA+Rn9ATS7}$>+jCk_-!E-0np4@?&;_P^dS&tV{CY7cUxKO8&_Axw)77@WV>@|_ zvmM|oAF|llgmu9htSk9Ki>-ZcbAJUL=u*KtzY1?fL&q+wO1p;EUhAD;_$B3<^qu9` z?2tyQMmnHGpShh+R!$8<6WtYdXz`ZaI_P zgIR^esu{csY_Tz)*VWD_?qLozk@4-3TSp1&rvcFQ^kJMp`KTaz%R7Asz%equ);Ip0NG)FllGP`;G$V=FON^o#kiO zV2wrB>ntI+LHDcEkw5Y0u~_u)M<+2x$Ye#@v;^=0by!6Trh-Stu8-FcEW;$9|c*WRzn01IHnwSSl%U4yAm`Veufve{qO2pENxr4MqMPwTyj(!z4f}( zUAXmw&od4wW_MwB56uWJA&}LDHZ%1VEnF?;8F*_k*UR&!`uU*}JZwpgN z7d!5Aam5p7;PE?l#De3(OmtYn2jF&2i5 zSuGiTZ@H3$_${&VQaZLK^$3*H@uGLJbz*Uw>a%s+9>f!AcB-*vsfm0KiBs;9ljg}9 zcEDp9oir%syTWe^ag*Y!Z?D62!f|y36c$Ul0j{RMMlP_rT0A%0r*Q4n<{h>u_B_yO za=Cs)O5_RTGIEVJsPE@GEOf0gBW+~(t>|JLJ{!zp3Y>cz7Q)8)czMlsr|Y}03KIWW zX=Pys0)VBCF|BBZFixtAN3uV-#yZvl--eLI(X3zd$A{yn5zbUix zG`!EqRspWOP)|pMe2R;(U7WH=SaKhisa!K=gY@7EE2x4J%kCg*sh25uE^Fs8FGxgz zeD{S~KP~Ua1MDXS7Evs}3q1(rsgGK&zq&)FQaYJsEuLk}^QelF+T6p{j zbim7vJ(z@1GlJ*TNQMR%)e!oI78*v@-e-LsFASt7$Oi=zY=O*^IkkaHVN(Wb$)|BR zoD1&;R6gCOnDCR0H*j^%eRd)xL2L6$-qqVJn4$JVc-_4;nr`$xe+CpI+$d>9@)WjV z(lKyG51sS=QiX2qNeNoq7cxJZtW8Xz0 zlbmvN7|vkklltOslP;Q^Hh*Edn&lhCMtK(uHtKYiHRd&3QgMjug%?^!QKm1n&ezI| znjf+9fvlEBHT<>e2ZZ(P$4=Hi^cq6##ZLt2ZLH$RLdI@ig4CYV#`{nJ-*6}+YMn|n zeT0dX9?RO+11J7(9w*OhcYCTTMwbN>%Qm~)O^ML!B6=@ClVm;4P^Z^h+gAQ9TXZL0 zg8Qz9kvcwLGv5Ll%YH~!!UNYi^HJlxT zc<-}su;%U6B5{N>Z~fZzBEi@O9stL=W@vK1F*$Lwv3PSR^U2OQ`Y5@?G`S~pqS0iA7F z!PKuc1vm1dn~r`j4Eh4mSnYb-Yq>-hnsHEOALspaLv{CbPNQlrr59a6+U%~pCzFAHV*RqQ@_-x}AgQ?@)W z7RF^vkCt`0cD?;{+wmiHjKraOX;q1bj6?#bRpMPwewmgjR2&v@PrS5qtmcs{pKp+s zg@C|XClP;Eci47MOZUot%^HpyEFNUDJf5Vj_yHr3L`0+7CSOk4t;>v_#}|M+KK(XK z2a;Ylp}=@Z{U2CfmF9OO23i7UHPHaNQU*uy<LGh}`v9ZWy# z2NzI8>^o{(g~Jn@uHY1DThLi%<6OG3X?IC=;p3Hl^wleCd@-_!hgj?{Bw{jq_kh1?(Jv;q44bRgWYbmo5N`mORAUXyc2JgO+IyXDDbY+9VtS^1~`th2m*+S-HW{72*oJj`VX@2S;p;D_x^W|1y09 ziPtB(^XITaW%?rYa$$e}dYX(z-CXXki_vJmQO5JJ!~1ITBzl)oyf}46;c3fLnpV^K zG&FU=-P|~I{WJQP%o4`O$bSL}7}#EkiZaL0ac;N(chBN9^PFAz@E9KJ-{h>cwq1A| zLA!KV3d>Gks?I;gsUp^{o0iB>BcBZb_hEDAXsY_--Ubc^BgZ}t%If-bR@_SqiORyX z#N4*@IpS4~`<+mHJB~`WDevxXA4PNf44t4Se!~b{nV-Ipnz2ytcF{PWc04rix=HkE zN)l%0i}hR^)S?E*<$Jg#DYa1!-!C&a?ve+wS#{3G>fjiO1UKlo>&{Ei7KieBjUe^b zyQIyV#Km5}*q$Y4cs`jkFQ~k6&3zddB6RBC!(^(| z3g>Km*;km({wKm0ZYpM zvkrjWiQBY<8Rh(|*A6?F&U^=vv@P^j9o?&oEo~3m&p-a*U;pV}{?-TzNwxNsoPYb_ zm=h7Ssb0p=5U8=`DliC!wf?T~N%DgDh6~ zy$SEB5=%fDjaeG?;|vakEMOsj?1q9ZFA(bhL}yr*`i11-g4xiCfNGG*}mHxsSNxALF)bz#vfwW%3p)7X4O^xc3$i8_EalPDpTRByPfLn_sRmROj z>XAErFJS%qcK4Jw-+Xg7keKvv*KQpb1$08T){~?D(jvVChw-ECU5}*S!^SK)G`hkK z+&=3ib;<3U1K=x@;^WdDKy3m8KHHUf2`-A$oL)-tV(rW)Eb#0R?JoR_%feWLiosru zQ)tI5PeMN6`b$S&id10yw4oHli@TcuyOs#MmC1-@8Y zR0SbAy)VT*z1`*bs>xmtgw92+`{EW_Hayas)%^5Wsmo&1*HC28R#4v$?+v1J>n?gz z5LJr^aX~JR_m#PU2?E;%TRT|UOL(oTw81t%|+K{j)?^m%tZXf>qfFVN%-J`=j{Ow~aiCk}SZ(X$Rk1Y06F>>m%Z{ zg2!5VV#C>EX1pzhbSZb%N3-`}nLY@6BuX8@Znjd3o}r z#LbZV8{glF$at)5v_O;&hd%aEZD|XX@=YQ!u4iE4jHzu9>!&xe_;Q#UFpoo?x;lce zkgvWnLYV0krmLL-if+c^>u%UA6X{Yr6Egdi!rHc!ho@Hd;7>+Y z+5nYn@Vsd-1mE5SvdAYhl@CBAVk$?7$Gi73nJo({ffh#LQBOhTS@zzLwLMfT=i$Sr z@YZZNJBGLR$6NovQ}x6kn@I(F!cCFnH_-Dq}s#V6xxnjSG^ky=8q)ffq5(`P$sKaE$Z)RiUqExLDy_*OJRjF2@ z88f*bnLe7Tj>Y|6XTn0(=nCp#=W-{v250zc7j=;rx7!0QU$`iX^R(r5V4@2>YX^Bp zPm{b>kp^4$<}Gu0VTp&po?4p{2x|{)59Hoh5e$~Zt8p~B19;jr^oqDg_hEPE2yb%q z=z!L^p!K+ZW4%j$#z7&r{rBW_*+jSG%Wk0OiSN=S;zXedu6HPu*M!qbk3WUKB$#ZV z^@@)*eGBG~VlV?B&dW}-Y3Xt|nfvev;UM0v1vBn2jSjmrL9A74{d}wp(#{2Dqfz{Z zn{2{bleHMyRL;J?N-@KIaWi=acy<}Z{szq(l zSItdMd#g-PEhXg)30tqcSx(M)Z+p0vy5<2mJ^_2Yd2LTDG6nScCaA2W3=yi=Qyu#Jy>n+HNB=XQ1Tt&Und$&Zga zP4*wgzzzlxRA|{E*A7Z8Oe!CjpVItW=`^`M-F+4YAi{8BZA`1%eHn;2M5_~O;i^pV zEn$AfL*m6_glBGlrpm6O(tLd9gxK;=MLSg*8o;NE?szxcwCa#pq(td@0vj1VCtanT zi@3fsx|n3<)gLFZ`ruO^6c*yV8Wd>jE(=n0&rLMP4dZ|p=_W|Q} z(~?Kbn!-nB2K2AKEIGXEa9^NkXw&7sb^^n+LTcmY{4#l=jkwLd9^V1H0yqH=rX#Z; zm!q>40>xpju=$Jw9{bCO*4swHEg~%@<1J!r{z=wG} z>i6I)_vhx84_dz^L0h|yg}{xp_C(8t`BVh>;!bsI@sLcL7DrMXio+ustCQMNAC~T$Co#>t0kXFS52MynV1!Ft>%IHqTi=;|T0#ht zt;!ZT&y(mvD=hV!tn!`#xz|Onxx?GsqP?M`YJhFz91&*Cr=)Z;fS(#p5iSN%KNY-ZP@>2_Kedpe?eS@IT6k(1;?&@!bBx+GV{eJa?m zQT)=fOG3K@y-PT6^}Ivnmrc;l?4_VnrXoGAR7kY*St_jRcX4;5=fQJ7>Z8vq+Kjfr_wqU= z$zo}=!sTU9eACqfo4ySGc5-I^={6o;wr5;eqUIH2t2XHr=v`vT1l)@Uqn9S`}zR>IH*==8^w3R-hGy8-R*NhSSes^8ZQzW!=u_Q0$MDJ3H7D{ zE?zi#9aQ46xAmKhrarjX>lz*%KZFRf26ZG!dwx6A9@)&7k(tLO6!MV(s} z1?AQtZm#sMML=(d`I)JpTU^0dve)TA8SXUf>_}%v458~pd7a8#p3MWAtDxX>(5uPRzkKUuB@(DAr17tl(>nc{a} zQhnF3&)I#@2tB@MV8Zo5YPO1jTTr+q&&9|ppOf`<&^}5`sr;(H4WBty5?|uWR&~!e zwW30oyWcB$KZ$qy_IvQjum|9a5PCDW#Z2QCMqQR0vgcpy3*XpH;$fxxc+hSwLuYwm zB_s#z-51YC$a=B*$_wwC8?qhZX8m-1bhmx8vY&RI+40>>7$5H-AN}-UZl`Bnsgao1 zmpFRRs5UGYYLzZl2c@5zN?$`PxiKZ~il&va08-FY)9ehQd-YnJ$dhHrz&pE>$!pzt zoi>NU{b|)rUW5q3{`TJr-GmtQ!E&xx*(DFpZB;AB)ul9Q2r1M|J6{q$`Y&L^D*j@2 z#=PPEKKQnl*@zr2JGURCe=w)!+&wOyRpH`LVH%&wTBuuBuW3%*JHNbpcb%|r&ijyj z^ZbZC+Zf8ddH%Ake}??#x>TiYsON@@)i*n9IvR^J$}ZOK&jj1?RgkOp9r-j(XVeCn zeL0z+#m`GUePg&fy%v6zaww1T@OAcrLT0w=T=&}GJq~YK9)bm<4{GlUkJ0JKFx@9~ zC^NORt+k-C-xc;jZX>?>+s>M)zupXzCtoG95X~x`Rmk+~f=|E>piFO75>=&gj{j_w zG@6d{hO_b^bb&|QI6~<5J6D_oIIB-YplJcrlg(FV-8d}9_gx2Q7Spz4-|Nv5PN(*FbP|M(wr&?f&s z&^}1#yIwlh$Kb|SZAzh!$iXpWU%n2mdB=iiOaiiu%lEcJ+BIRS)hrrFJIrUI`%Ky$yuk*}rO z><%t7is}3a}T;gUfrDOr81$>!XZ}iXin}XSldB4Zq0UTPqr#0 z{1CL1M*6A2au@bh@msC*($!_Q%w-$XJ~=78XccxAc1oP&bl{ku7fH%Xt{1EJM9qg% zY~?MX%{lQ@V3G$`l{Qe$YpHny5Zd_EsE};oN~4t>>kEJCeM-qAX)`bA94&;lx z?*h#`LQ#h-WxMl&vs#$f?&9X{7mt^8dfzLnMgBli-UYz|dJGoWpB@YvL;5YoP;RZy zwt0at87;ea{d1F!Su^LA<9hr8Yv?_$*Rsow;f=sN`37C|MCpOy-1DBrppoURs#A`C zx-*x1SbGqh1!DO)7+oMv{K@HiFUqB9uTT)M#ASuGCydBFMwe)HiC zZrf-+05o?cOg?E9qHb&0pA6#58<>UNie4});cR>lZULS3_ZGXve^$F5K9%+yUJp}K zMkfm-8_&jOuITpVSEGcM$&P-1BLW;aW%`X@h+W=l#D^t)vV3=(Gr(h$R~MH@A4i@J zi#sG3&x(4!hd$f=22CEGLsXctjmDO)HHyV!bKi^F&38B(P*QQCPsQIkofhtj>Ph}C z8w{NIk_cF_r=Ioe2u_vjH~eUCC}}w=)))E}E~{P%UMVvA~XA$N1O15$nXyU%0s1g)D#_Bn2%&y+<~Si75}-abx1cKF1r$Y1^%T%VPJ2NzAVHVZ*INWaytjG6?39YNJ$e_u-$J|o) zP$oS;yJ0?vFZ%*vB}y{Er{xD;lO|8PUd&rw@G`6lq|z89w{pPRNqh41)8esxtpKji za83A;#UVOhzE+!~U&uy`F5O2{fmsNp+{&h6&P$IC8aP#}9`=s8$~nV}cc_DlFgRV> zj6ZwiJ+#x1N%fM;iqsD2L|2o?&;v=`jgH0 z-2R-wclCSc+G$6q1?<)RN=uHT?G+-Miff>y&UoGJ<3p&|8}{s-<9zL(^L=@MTfeUM z-gqEo#a5bg*rz{TNJ!Q>-&boZJ{JcZJ&Tcg6lT~mY2QgIJilw_OW{^&PIm2LJ-y}S zaM>>{XqjXiJ$Qp1+O?3ZM`YLFLA_uo3RSFMrmB*MS)Z{zpkW1!3EHpyi0*_LL;M7v ztPcqtrn6OBT8GLNv+IjfC15dyLKpU%Z2;C zH@G(3Mzx%-_=&w@2GL?{zM1c9ae_OF)^-DVdr-Bh|I&ARq#%kj_tS4EzfY;u059Fa zwxF7}9d~Zh&TU@mIZcGmx?(M3XN|ieT2Sc)R~oddW)ftx+N>l))NH!0Pl+eAVhU~Vd3;5c_5pTLPs)cH)fY)J0d69{FqVZghJCEemI8;Xuwt%Lk-b9-U`nU*IMyJPRVBC6-LGf2uIOb<& z;Z+EmE`;msP=}(tEs*Y>B~aXJ((J(aC9@N0ViFR4q8}QCI(?YS(_XNJCr5XEJlmC1 z+VpGVn5%YB;!+M3ain|pG`n5ZEb5@(MSf&SSCjhwxd=-mx+qZ9Q65Nm1_32{L(&uU zBj$_b8)CP@*DS70P7-e`we*}mmb;d+MF04QKmN4*wg0InyJs#(NKYX_@(T=^VY3-Q zX8e9#D)Y;BCTaVX`5K^K=5R@Gz_t7`E^yA;uRY{3J@2)|oo?M4ysnqDDo!hgbpy*1Wd?DzUDeFe{F&)H% zn&;0w7g)ZH{A9r*r`WVs7M_a(Uo_>dQCob%qHzV`aVVI-;!DQjT-=*a|GQwT57(Qj720fL7(&x|1IYg+?zF}z;6r za4SFFH#leTtPmd>dJ(S_S~0dCc8S+;A0S<{K^EOg`$K(GX9u_>>9o`;UY?^Lrv zN>g}oEk8y(-CW3qkauev%{3pdp-#7Nue9N>ILKweQf_TO9(^=u37f18Z8y4t9zjH{ z8DCV^Kn*+&VS9RJCY1T14?M3tnzD@%UrCdBK_;b5x_cPisvrW9aMwE2TzOmK2O>#r@Yn!{s3k z;1*pzs*Jok>AOR_WW^FT^-p1ayoj;Yu_o5ZpT|P9jPX$`XGk+eXbf50X7Uc26`ToS z+a>wUzQpQUNkCQXOW^cg-mIY4K3dHu+gq2`*X>eb46_$#@8{XrDvL9uP{%N!7vk5& zvCyzLMkxaQmPl;wNM3ZggT;0c{z}&~bj4K*5|89Zl!i0aYE4_3bZhCKe5%&u$yVwo z8#%J3-s67y$5S)^^?&`RKdt}SqWkxazr6lF{rf-v<3+dK?6&{<9@T9$|LMJEqe*od ee|?W=x4M7)`~Uo>|M}0!20{M0RFbsOpZ_miyPnwq delta 15291 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 I%gG=A2SuKgbpQYW diff --git a/src/TypeFerence.Core/Compiler.cs b/src/TypeFerence.Core/Compiler.cs index e0c2f2b..55363ef 100644 --- a/src/TypeFerence.Core/Compiler.cs +++ b/src/TypeFerence.Core/Compiler.cs @@ -438,7 +438,7 @@ private static string RenderInstructions(ResolvedAgent agent) } private static string RenderSkill(ResolvedSkill skill) => $"---\nname: {SkillSlug(skill)}\ndescription: {EscapeYaml(skill.Description)}\n---\n\n{skill.Instructions.Trim()}\n\n## Context loaded on invocation\n\n{string.Join("\n", skill.ContextFiles.Select(x => $"- `{x}`"))}\n"; - private static string SkillSlug(ResolvedSkill skill) => skill.ContractId.Split('/').Last().Split('@')[0]; + private static string SkillSlug(ResolvedSkill skill) => skill.CapabilityId.Split('/').Last().Split('@')[0]; private static string Slug(string id) => id.Split('/').Last().Split('@')[0]; private static string EscapeYaml(string value) => "\"" + value.Replace("\\", "\\\\").Replace("\"", "\\\"") + "\""; diff --git a/src/TypeFerence.Core/Models.cs b/src/TypeFerence.Core/Models.cs index 49f9e28..2a3c0a3 100644 --- a/src/TypeFerence.Core/Models.cs +++ b/src/TypeFerence.Core/Models.cs @@ -9,10 +9,11 @@ public sealed class ResourceDocument public string Id { get; set; } = ""; public string DisplayName { get; set; } = ""; public string Description { get; set; } = ""; + public string Binds { get; set; } = ""; public bool Emit { get; set; } = true; public List Embeds { get; set; } = []; public List RequiresSlots { get; set; } = []; - public List RequiresSkills { get; set; } = []; + public List RequiresCapabilities { get; set; } = []; public SortedDictionary Slots { get; set; } = new(StringComparer.Ordinal); public List WorkingNorms { get; set; } = []; public List ContextFiles { get; set; } = []; @@ -25,7 +26,7 @@ public sealed class ResourceDocument public sealed class SkillBinding { public string Ref { get; set; } = ""; - public string? Contract { get; set; } + public string? Capability { get; set; } } public sealed record ProvenanceEntry(string Field, string Source); @@ -33,7 +34,7 @@ public sealed record ProvenanceEntry(string Field, string Source); public sealed class ResolvedSkill { public string DispatchName { get; init; } = ""; - public string ContractId { get; init; } = ""; + public string CapabilityId { get; init; } = ""; public string ImplementationId { get; init; } = ""; public string Description { get; init; } = ""; public string Instructions { get; init; } = ""; diff --git a/src/TypeFerence.Core/ResourceLoader.cs b/src/TypeFerence.Core/ResourceLoader.cs index ff23437..13007c1 100644 --- a/src/TypeFerence.Core/ResourceLoader.cs +++ b/src/TypeFerence.Core/ResourceLoader.cs @@ -49,11 +49,14 @@ public IReadOnlyDictionary Load(string sourceDirectory private static void ValidateShape(ResourceDocument resource, string file, string root) { - if (resource.SchemaVersion != 2) throw new TypeFerenceException($"{file}: schemaVersion must be 2"); - if (resource.Kind is not ("agent" or "interface" or "skill")) throw new TypeFerenceException($"{file}: unknown kind '{resource.Kind}'"); + if (resource.SchemaVersion != 3) throw new TypeFerenceException($"{file}: schemaVersion must be 3"); + if (resource.Kind is not ("agent" or "profile" or "interface" or "capability" or "skill")) throw new TypeFerenceException($"{file}: unknown kind '{resource.Kind}'"); if (!ResourceId.IsMatch(resource.Id)) throw new TypeFerenceException($"{file}: id must use lowercase namespace/name@semantic-version"); - if (resource.Kind == "skill" && resource.Embeds.Count != 0) throw new TypeFerenceException($"{file}: skills cannot embed resources"); + if (resource.Kind is "capability" or "skill" && resource.Embeds.Count != 0) throw new TypeFerenceException($"{file}: {resource.Kind}s cannot embed resources"); + if (resource.Kind == "skill" && string.IsNullOrWhiteSpace(resource.Binds)) throw new TypeFerenceException($"{file}: skills must bind a capability"); + if (resource.Kind == "skill" && !ResourceId.IsMatch(resource.Binds)) throw new TypeFerenceException($"{file}: binds must reference a capability id"); + if (resource.Kind != "skill" && !string.IsNullOrWhiteSpace(resource.Binds)) throw new TypeFerenceException($"{file}: only skills can bind capabilities"); foreach (var relative in resource.ContextFiles.Concat(resource.Slots.Values)) { var full = Path.GetFullPath(Path.Combine(root, relative.Replace('/', Path.DirectorySeparatorChar))); diff --git a/src/TypeFerence.Core/TypeResolver.cs b/src/TypeFerence.Core/TypeResolver.cs index e4bf44c..404a080 100644 --- a/src/TypeFerence.Core/TypeResolver.cs +++ b/src/TypeFerence.Core/TypeResolver.cs @@ -4,15 +4,19 @@ namespace TypeFerence.Core; public sealed class TypeResolver(IReadOnlyDictionary resources) { - private readonly Dictionary _agentCache = new(StringComparer.Ordinal); + private readonly Dictionary _componentCache = new(StringComparer.Ordinal); private readonly Dictionary _interfaceCache = new(StringComparer.Ordinal); private readonly Dictionary> _slotDepths = new(StringComparer.Ordinal); private readonly Dictionary> _skillDepths = new(StringComparer.Ordinal); public IReadOnlyList ResolveAll() { + foreach (var item in resources.Values.Where(x => x.Kind == "skill").OrderBy(x => x.Id, StringComparer.Ordinal)) + ValidateSkillImplementation(item); foreach (var item in resources.Values.Where(x => x.Kind == "interface").OrderBy(x => x.Id, StringComparer.Ordinal)) ResolveInterface(item.Id, new HashSet(StringComparer.Ordinal)); + foreach (var item in resources.Values.Where(x => x.Kind == "profile").OrderBy(x => x.Id, StringComparer.Ordinal)) + ResolveComponent(item.Id, new HashSet(StringComparer.Ordinal), requireAgent: false); return resources.Values .Where(x => x.Kind == "agent") .OrderBy(x => x.Id, StringComparer.Ordinal) @@ -20,19 +24,26 @@ public IReadOnlyList ResolveAll() .ToArray(); } - public ResolvedAgent Resolve(string id) => ResolveAgent(id, new HashSet(StringComparer.Ordinal)); + public ResolvedAgent Resolve(string id) => ResolveComponent(id, new HashSet(StringComparer.Ordinal), requireAgent: true); - private ResolvedAgent ResolveAgent(string id, HashSet visiting) + private ResolvedAgent ResolveComponent(string id, HashSet visiting, bool requireAgent) { - if (_agentCache.TryGetValue(id, out var cached)) return cached; - var current = Require(id, "agent"); + if (requireAgent) Require(id, "agent"); + if (_componentCache.TryGetValue(id, out var cached)) return cached; + var current = RequireEmbeddable(id); if (!visiting.Add(id)) throw new TypeFerenceException($"Embedding cycle detected at {id}"); if (current.Embeds.Count != current.Embeds.Distinct(StringComparer.Ordinal).Count()) - throw new TypeFerenceException($"{id}: an agent cannot embed the same agent more than once"); + throw new TypeFerenceException($"{id}: a {current.Kind} cannot embed the same resource more than once"); try { - var embedded = current.Embeds.Select(x => ResolveAgent(x, visiting)).ToArray(); + var embedded = current.Embeds.Select(x => + { + var embeddedResource = RequireEmbeddable(x); + if (current.Kind == "profile" && embeddedResource.Kind != "profile") + throw new TypeFerenceException($"{id}: profiles can only embed profiles"); + return ResolveComponent(x, visiting, requireAgent: false); + }).ToArray(); var (slots, slotDepths) = MergeSlots(id, current, embedded); var norms = Distinct(embedded.SelectMany(x => x.WorkingNorms).Concat(current.WorkingNorms)); var contexts = Distinct(embedded.SelectMany(x => x.ContextFiles).Concat(current.ContextFiles).Select(NormalizePath)); @@ -44,7 +55,7 @@ private ResolvedAgent ResolveAgent(string id, HashSet visiting) .Select(x => x.Id) .ToArray(); - var provenance = embedded.SelectMany(x => x.Provenance).ToList(); + var provenance = embedded.SelectMany(x => x.Provenance.Where(IsPromotedProvenance)).ToList(); provenance.AddRange(current.Embeds.Select(x => new ProvenanceEntry($"embeds.{x}", id))); if (!string.IsNullOrWhiteSpace(current.DisplayName)) provenance.Add(new("displayName", id)); if (!string.IsNullOrWhiteSpace(current.Description)) provenance.Add(new("description", id)); @@ -64,12 +75,12 @@ private ResolvedAgent ResolveAgent(string id, HashSet visiting) Slots = slots, WorkingNorms = norms, ContextFiles = contexts, - Skills = skills.Values.OrderBy(x => x.ContractId, StringComparer.Ordinal).Select(x => x.WithDispatch(id)).ToArray(), + Skills = skills.Values.OrderBy(x => x.CapabilityId, StringComparer.Ordinal).Select(x => x.WithDispatch(id)).ToArray(), Provenance = provenance }; _slotDepths[id] = slotDepths; _skillDepths[id] = skillDepths; - return _agentCache[id] = resolved; + return _componentCache[id] = resolved; } finally { @@ -111,17 +122,17 @@ private ResolvedAgent ResolveAgent(string id, HashSet visiting) { var result = new Dictionary(StringComparer.Ordinal); var depths = new Dictionary(StringComparer.Ordinal); - var localContracts = current.Skills.Select(x => x.Contract ?? x.Ref).ToHashSet(StringComparer.Ordinal); - if (localContracts.Count != current.Skills.Count) - throw new TypeFerenceException($"{id}: a skill contract cannot be declared more than once"); + var localCapabilities = current.Skills.Select(x => ResolveCapabilityId(x, id)).ToHashSet(StringComparer.Ordinal); + if (localCapabilities.Count != current.Skills.Count) + throw new TypeFerenceException($"{id}: a capability cannot be bound more than once"); foreach (var group in embedded.SelectMany(x => x.Skills.Select(skill => - (Agent: x.Id, Skill: skill, Depth: _skillDepths[x.Id][skill.ContractId] + 1))) - .GroupBy(x => x.Skill.ContractId, StringComparer.Ordinal)) + (Agent: x.Id, Skill: skill, Depth: _skillDepths[x.Id][skill.CapabilityId] + 1))) + .GroupBy(x => x.Skill.CapabilityId, StringComparer.Ordinal)) { var depth = group.Min(x => x.Depth); var nearest = group.Where(x => x.Depth == depth).ToArray(); - if (nearest.Length > 1 && !localContracts.Contains(group.Key)) - throw new TypeFerenceException($"{id}: embedded skill contract '{group.Key}' is ambiguous between {string.Join(", ", nearest.Select(x => x.Agent))}; declare the contract on {id} to resolve the conflict"); + if (nearest.Length > 1 && !localCapabilities.Contains(group.Key)) + throw new TypeFerenceException($"{id}: embedded capability '{group.Key}' is ambiguous between {string.Join(", ", nearest.Select(x => x.Agent))}; bind the capability on {id} to resolve the conflict"); result[group.Key] = nearest[0].Skill; depths[group.Key] = depth; } @@ -129,29 +140,44 @@ private ResolvedAgent ResolveAgent(string id, HashSet visiting) foreach (var binding in current.Skills) { var implementation = Require(binding.Ref, "skill"); - var contract = binding.Contract ?? binding.Ref; - if (binding.Contract is not null) - { - var contractResource = Require(contract, "skill"); - EnsureSameContract(contractResource, implementation, id); - } - if (result.TryGetValue(contract, out var promoted)) EnsureSameContract(promoted, implementation, id); - result[contract] = new ResolvedSkill + var capabilityId = ResolveCapabilityId(binding, id); + var capability = Require(capabilityId, "capability"); + EnsureImplementsCapability(capability, implementation, id); + if (result.TryGetValue(capabilityId, out var promoted)) EnsureSameCapability(promoted, capability, id); + result[capabilityId] = new ResolvedSkill { - ContractId = contract, + CapabilityId = capabilityId, ImplementationId = implementation.Id, Description = implementation.Description, Instructions = implementation.Instructions, InputSchema = CanonicalJson(implementation.InputSchema), OutputSchema = CanonicalJson(implementation.OutputSchema), ContextFiles = Distinct(contexts.Concat(implementation.ContextFiles.Select(NormalizePath))), - Provenance = [new("skill.contract", contract), new("skill.implementation", implementation.Id)] + Provenance = [new("skill.capability", capabilityId), new("skill.implementation", implementation.Id)] }; - depths[contract] = 0; + depths[capabilityId] = 0; } return (result, depths); } + private string ResolveCapabilityId(SkillBinding binding, string agent) + { + var implementation = Require(binding.Ref, "skill"); + if (string.IsNullOrWhiteSpace(implementation.Binds)) + throw new TypeFerenceException($"{agent}: skill {implementation.Id} does not bind a capability"); + if (binding.Capability is not null && binding.Capability != implementation.Binds) + throw new TypeFerenceException($"{agent}: binding declares capability {binding.Capability}, but skill {implementation.Id} binds {implementation.Binds}"); + return binding.Capability ?? implementation.Binds; + } + + private void ValidateSkillImplementation(ResourceDocument implementation) + { + if (string.IsNullOrWhiteSpace(implementation.Binds)) + throw new TypeFerenceException($"Skill {implementation.Id} does not bind a capability"); + var capability = Require(implementation.Binds, "capability"); + EnsureImplementsCapability(capability, implementation, implementation.Id); + } + private InterfaceContract ResolveInterface(string id, HashSet visiting) { if (_interfaceCache.TryGetValue(id, out var cached)) return cached; @@ -160,10 +186,10 @@ private InterfaceContract ResolveInterface(string id, HashSet visiting) try { var embedded = current.Embeds.Select(x => ResolveInterface(x, visiting)).ToArray(); - foreach (var skill in current.RequiresSkills) Require(skill, "skill"); + foreach (var capability in current.RequiresCapabilities) Require(capability, "capability"); return _interfaceCache[id] = new( Distinct(embedded.SelectMany(x => x.Slots).Concat(current.RequiresSlots)), - Distinct(embedded.SelectMany(x => x.Skills).Concat(current.RequiresSkills))); + Distinct(embedded.SelectMany(x => x.Skills).Concat(current.RequiresCapabilities))); } finally { @@ -180,22 +206,34 @@ private ResourceDocument Require(string id, string kind) return resource; } - private static void EnsureSameContract(ResolvedSkill contract, ResourceDocument implementation, string agent) + private ResourceDocument RequireEmbeddable(string id) + { + if (!resources.TryGetValue(id, out var resource) || resource.Kind is not ("agent" or "profile")) + throw new TypeFerenceException($"Missing embeddable resource: {id}"); + return resource; + } + + private static void EnsureSameCapability(ResolvedSkill promoted, ResourceDocument capability, string agent) { - if (contract.InputSchema != CanonicalJson(implementation.InputSchema) || contract.OutputSchema != CanonicalJson(implementation.OutputSchema)) - throw new TypeFerenceException($"{agent}: implementation {implementation.Id} changes the public contract of {contract.ContractId}"); + if (promoted.InputSchema != CanonicalJson(capability.InputSchema) || promoted.OutputSchema != CanonicalJson(capability.OutputSchema)) + throw new TypeFerenceException($"{agent}: promoted implementation {promoted.ImplementationId} changes the public contract of {capability.Id}"); } - private static void EnsureSameContract(ResourceDocument contract, ResourceDocument implementation, string agent) + private static void EnsureImplementsCapability(ResourceDocument capability, ResourceDocument implementation, string agent) { - if (CanonicalJson(contract.InputSchema) != CanonicalJson(implementation.InputSchema) || - CanonicalJson(contract.OutputSchema) != CanonicalJson(implementation.OutputSchema)) - throw new TypeFerenceException($"{agent}: implementation {implementation.Id} changes the public contract of {contract.Id}"); + if (implementation.Binds != capability.Id) + throw new TypeFerenceException($"{agent}: implementation {implementation.Id} binds {implementation.Binds}, not capability {capability.Id}"); + if (CanonicalJson(capability.InputSchema) != CanonicalJson(implementation.InputSchema) || + CanonicalJson(capability.OutputSchema) != CanonicalJson(implementation.OutputSchema)) + throw new TypeFerenceException($"{agent}: implementation {implementation.Id} changes the public contract of {capability.Id}"); } private static string NormalizePath(string value) => value.Replace('\\', '/').TrimStart('/'); private static IReadOnlyList Distinct(IEnumerable values) => values.Distinct(StringComparer.Ordinal).ToArray(); private static string CanonicalJson(string json) => JsonSerializer.Serialize(JsonDocument.Parse(json).RootElement); + private static bool IsPromotedProvenance(ProvenanceEntry entry) => + entry.Field is not ("displayName" or "description") && + !entry.Field.StartsWith("satisfies.", StringComparison.Ordinal); private sealed record InterfaceContract(IReadOnlyList Slots, IReadOnlyList Skills); } @@ -203,8 +241,8 @@ internal static class ResolvedSkillExtensions { internal static ResolvedSkill WithDispatch(this ResolvedSkill skill, string agentId) => new() { - DispatchName = $"{agentId.Split('/').Last().Split('@')[0]}.{skill.ContractId.Split('/').Last().Split('@')[0]}", - ContractId = skill.ContractId, + DispatchName = $"{agentId.Split('/').Last().Split('@')[0]}.{skill.CapabilityId.Split('/').Last().Split('@')[0]}", + CapabilityId = skill.CapabilityId, ImplementationId = skill.ImplementationId, Description = skill.Description, Instructions = skill.Instructions, diff --git a/tests/TypeFerence.Tests/CompilerTests.cs b/tests/TypeFerence.Tests/CompilerTests.cs index bbc4604..12f753f 100644 --- a/tests/TypeFerence.Tests/CompilerTests.cs +++ b/tests/TypeFerence.Tests/CompilerTests.cs @@ -14,11 +14,13 @@ public sealed class CompilerTests private static string Example => Path.Combine(Root, "examples", "helio"); [Fact] - public void Agents_DoNotNeedAUniversalRoot() + public void Profiles_AreReusableAndNotEmittedAsAgents() { - var enterprise = new TypeFerenceCompiler().Validate(Example).Single(x => x.Id == "helio/enterprise-agent@1.0.0"); - Assert.False(enterprise.Emit); - Assert.Empty(enterprise.Embeds); + var agents = new TypeFerenceCompiler().Validate(Example); + Assert.Equal(2, agents.Count); + Assert.DoesNotContain(agents, x => x.Id == "helio/profiles/enterprise-defaults@1.0.0"); + Assert.All(agents, x => Assert.True(x.Emit)); + Assert.All(agents, x => Assert.Contains("helio/profiles/", x.Embeds.Single())); } [Fact] @@ -29,11 +31,11 @@ public void ConcreteAgents_PromoteEmbeddedBehavior() } [Fact] - public void Override_PreservesContractAndUsesDerivedDispatch() + public void Override_PreservesCapabilityAndUsesDerivedDispatch() { var agent = new TypeFerenceCompiler().Validate(Example).Single(x => x.Id == "helio/payments-repo-agent@1.0.0"); var skill = Assert.Single(agent.Skills); - Assert.Equal("helio/skills/repository-status@1.0.0", skill.ContractId); + Assert.Equal("helio/capabilities/repository-status@1.0.0", skill.CapabilityId); Assert.Equal("helio/skills/payments-repository-status@1.0.0", skill.ImplementationId); Assert.Equal("payments-repo-agent.repository-status", skill.DispatchName); } @@ -57,7 +59,7 @@ public void Compilation_IsDeterministicAndProducesNativeShapes() var compiler = new TypeFerenceCompiler(); compiler.Build(Example, one.Path, Enum.GetValues(), new ArdPublicationOptions("helio.example")); compiler.Build(Example, two.Path, Enum.GetValues(), new ArdPublicationOptions("helio.example")); - Assert.Equal("3217c82010c4859535f76797d04b432d07531a7f02c3b1c2ef84adb655c6eae5", TypeFerenceCompiler.HashDirectory(one.Path)); + Assert.Equal("a22f5410ba5f8e172c8d25dd2ff3efb867b212753723fd2e3b1faca21d2b3963", TypeFerenceCompiler.HashDirectory(one.Path)); Assert.Equal(TypeFerenceCompiler.HashDirectory(one.Path), TypeFerenceCompiler.HashDirectory(two.Path)); Assert.False(DiffResult.Compare(one.Path, two.Path).Different); Assert.True(File.Exists(Path.Combine(one.Path, "codex", "executive-assistant", ".agents", "skills", "prepare-brief", "SKILL.md"))); @@ -323,8 +325,8 @@ public void EmbeddingCycles_AreRejected() { var resources = new Dictionary { - ["test/a@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/a@1.0.0", Embeds = ["test/b@1.0.0"] }, - ["test/b@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/b@1.0.0", Embeds = ["test/a@1.0.0"] } + ["test/a@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/a@1.0.0", Embeds = ["test/b@1.0.0"] }, + ["test/b@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/b@1.0.0", Embeds = ["test/a@1.0.0"] } }; Assert.Contains("cycle", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.OrdinalIgnoreCase); } @@ -334,11 +336,11 @@ public void MultipleEmbedding_RequiresExplicitConflictResolution() { var resources = new Dictionary { - ["test/left@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/left@1.0.0", Slots = { ["owner"] = "left.md" } }, - ["test/right@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/right@1.0.0", Slots = { ["owner"] = "right.md" } }, + ["test/left@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/left@1.0.0", Slots = { ["owner"] = "left.md" } }, + ["test/right@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/right@1.0.0", Slots = { ["owner"] = "right.md" } }, ["test/ambiguous@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "agent", Id = "test/ambiguous@1.0.0", Embeds = ["test/left@1.0.0", "test/right@1.0.0"] @@ -353,25 +355,34 @@ public void MultipleEmbedding_RequiresExplicitConflictResolution() [Fact] public void MultipleEmbedding_PrefersTheShallowestPromotedMember() { + var capability = new ResourceDocument + { + SchemaVersion = 3, + Kind = "capability", + Id = "test/capabilities/status@1.0.0" + }; var baseSkill = new ResourceDocument { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "skill", - Id = "test/skills/status@1.0.0" + Id = "test/skills/status@1.0.0", + Binds = capability.Id }; var specializedSkill = new ResourceDocument { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "skill", - Id = "test/skills/special-status@1.0.0" + Id = "test/skills/special-status@1.0.0", + Binds = capability.Id }; var resources = new Dictionary { + [capability.Id] = capability, [baseSkill.Id] = baseSkill, [specializedSkill.Id] = specializedSkill, ["test/deep@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "agent", Id = "test/deep@1.0.0", Slots = { ["owner"] = "deep.md" }, @@ -379,22 +390,22 @@ public void MultipleEmbedding_PrefersTheShallowestPromotedMember() }, ["test/middle@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "agent", Id = "test/middle@1.0.0", Embeds = ["test/deep@1.0.0"] }, ["test/shallow@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "agent", Id = "test/shallow@1.0.0", Slots = { ["owner"] = "shallow.md" }, - Skills = [new SkillBinding { Ref = specializedSkill.Id, Contract = baseSkill.Id }] + Skills = [new SkillBinding { Ref = specializedSkill.Id, Capability = capability.Id }] }, ["test/outer@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "agent", Id = "test/outer@1.0.0", Embeds = ["test/middle@1.0.0", "test/shallow@1.0.0"] @@ -414,7 +425,7 @@ public void Provenance_CoversEffectiveScalarsStructuralContractsAndSkills() Assert.Contains(agent.Provenance, x => x.Field.StartsWith("satisfies.", StringComparison.Ordinal)); Assert.All(agent.Skills, skill => { - Assert.Contains(skill.Provenance, x => x.Field == "skill.contract"); + Assert.Contains(skill.Provenance, x => x.Field == "skill.capability"); Assert.Contains(skill.Provenance, x => x.Field == "skill.implementation"); }); } @@ -424,9 +435,9 @@ public void Interfaces_AreSatisfiedImplicitly() { var resources = new Dictionary { - ["test/contract@1.0.0"] = new() { SchemaVersion = 2, Kind = "interface", Id = "test/contract@1.0.0", RequiresSlots = ["owner"] }, - ["test/plain@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/plain@1.0.0" }, - ["test/owned@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/owned@1.0.0", Slots = { ["owner"] = "owner.md" } } + ["test/contract@1.0.0"] = new() { SchemaVersion = 3, Kind = "interface", Id = "test/contract@1.0.0", RequiresSlots = ["owner"] }, + ["test/plain@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/plain@1.0.0" }, + ["test/owned@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/owned@1.0.0", Slots = { ["owner"] = "owner.md" } } }; var agents = new TypeResolver(resources).ResolveAll(); Assert.Empty(agents.Single(x => x.Id == "test/plain@1.0.0").Satisfies); @@ -434,48 +445,105 @@ public void Interfaces_AreSatisfiedImplicitly() } [Fact] - public void InterfaceSkillRequirements_MustReferenceSkills() + public void InterfaceCapabilityRequirements_MustReferenceCapabilities() { var resources = new Dictionary { ["test/contract@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "interface", Id = "test/contract@1.0.0", - RequiresSkills = ["test/skills/missing@1.0.0"] + RequiresCapabilities = ["test/capabilities/missing@1.0.0"] } }; - Assert.Contains("Missing skill", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); + Assert.Contains("Missing capability", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); } [Fact] - public void MissingEmbeddedAgents_AreRejected() + public void Skills_MustBindACapability() { + using var source = new TempDirectory(); + File.WriteAllText(Path.Combine(source.Path, "skill.yaml"), """ +schemaVersion: 3 +kind: skill +id: test/skills/status@1.0.0 +"""); + + Assert.Contains("skills must bind a capability", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void AgentSkillBindings_MustMatchTheSkillCapability() + { + var capability = new ResourceDocument { SchemaVersion = 3, Kind = "capability", Id = "test/capabilities/status@1.0.0" }; + var otherCapability = new ResourceDocument { SchemaVersion = 3, Kind = "capability", Id = "test/capabilities/other-status@1.0.0" }; + var skill = new ResourceDocument { SchemaVersion = 3, Kind = "skill", Id = "test/skills/status@1.0.0", Binds = capability.Id }; var resources = new Dictionary { - ["test/base@1.0.0"] = new() { SchemaVersion = 2, Kind = "agent", Id = "test/base@1.0.0", Embeds = ["test/missing@1.0.0"] } + [capability.Id] = capability, + [otherCapability.Id] = otherCapability, + [skill.Id] = skill, + ["test/agent@1.0.0"] = new() + { + SchemaVersion = 3, + Kind = "agent", + Id = "test/agent@1.0.0", + Skills = [new SkillBinding { Ref = skill.Id, Capability = otherCapability.Id }] + } }; - Assert.Contains("Missing agent", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); + + Assert.Contains("binding declares capability", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); } [Fact] - public void SkillContractImplementations_MustPreserveSchemas() + public void MissingEmbeddedResources_AreRejected() { + var resources = new Dictionary + { + ["test/base@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/base@1.0.0", Embeds = ["test/missing@1.0.0"] } + }; + Assert.Contains("Missing embeddable resource", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); + } + + [Fact] + public void Profiles_CannotEmbedAgents() + { + var resources = new Dictionary + { + ["test/profile@1.0.0"] = new() { SchemaVersion = 3, Kind = "profile", Id = "test/profile@1.0.0", Embeds = ["test/agent@1.0.0"] }, + ["test/agent@1.0.0"] = new() { SchemaVersion = 3, Kind = "agent", Id = "test/agent@1.0.0" } + }; + Assert.Contains("profiles can only embed profiles", Assert.Throws(() => new TypeResolver(resources).ResolveAll()).Message, StringComparison.Ordinal); + } + + [Fact] + public void SkillCapabilityImplementations_MustPreserveSchemas() + { + var capability = new ResourceDocument + { + SchemaVersion = 3, + Kind = "capability", + Id = "test/capabilities/status@1.0.0", + InputSchema = "{\"type\":\"object\",\"properties\":{\"focus\":{\"type\":\"string\"}}}", + OutputSchema = "{\"type\":\"object\"}" + }; var baseSkill = new ResourceDocument { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "skill", Id = "test/skills/status@1.0.0", + Binds = capability.Id, InputSchema = "{\"type\":\"object\",\"properties\":{\"focus\":{\"type\":\"string\"}}}", OutputSchema = "{\"type\":\"object\"}" }; var replacement = new ResourceDocument { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "skill", Id = "test/skills/special-status@1.0.0", + Binds = capability.Id, InputSchema = "{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"number\"}}}", OutputSchema = "{\"type\":\"object\"}" }; @@ -483,7 +551,7 @@ public void SkillContractImplementations_MustPreserveSchemas() { ["test/base@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "agent", Id = "test/base@1.0.0", Emit = false, @@ -491,12 +559,13 @@ public void SkillContractImplementations_MustPreserveSchemas() }, ["test/concrete@1.0.0"] = new() { - SchemaVersion = 2, + SchemaVersion = 3, Kind = "agent", Id = "test/concrete@1.0.0", Embeds = ["test/base@1.0.0"], - Skills = [new SkillBinding { Ref = replacement.Id, Contract = baseSkill.Id }] + Skills = [new SkillBinding { Ref = replacement.Id, Capability = capability.Id }] }, + [capability.Id] = capability, [baseSkill.Id] = baseSkill, [replacement.Id] = replacement }; @@ -507,9 +576,9 @@ public void SkillContractImplementations_MustPreserveSchemas() public void Interfaces_CanEmbedInterfaces() { using var source = new TempDirectory(); - File.WriteAllText(Path.Combine(source.Path, "base.yaml"), "schemaVersion: 2\nkind: interface\nid: test/base@1.0.0\nrequiresSlots: [owner]\n"); - File.WriteAllText(Path.Combine(source.Path, "interface.yaml"), "schemaVersion: 2\nkind: interface\nid: test/contract@1.0.0\nembeds: [test/base@1.0.0]\nrequiresSlots: [repository]\n"); - File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), "schemaVersion: 2\nkind: agent\nid: test/agent@1.0.0\nslots: { owner: owner.md, repository: repository.md }\n"); + File.WriteAllText(Path.Combine(source.Path, "base.yaml"), "schemaVersion: 3\nkind: interface\nid: test/base@1.0.0\nrequiresSlots: [owner]\n"); + File.WriteAllText(Path.Combine(source.Path, "interface.yaml"), "schemaVersion: 3\nkind: interface\nid: test/contract@1.0.0\nembeds: [test/base@1.0.0]\nrequiresSlots: [repository]\n"); + File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), "schemaVersion: 3\nkind: agent\nid: test/agent@1.0.0\nslots: { owner: owner.md, repository: repository.md }\n"); File.WriteAllText(Path.Combine(source.Path, "owner.md"), "owner"); File.WriteAllText(Path.Combine(source.Path, "repository.md"), "repository"); var agent = new TypeResolver(new ResourceLoader().Load(source.Path)).Resolve("test/agent@1.0.0"); @@ -522,7 +591,7 @@ public void Interfaces_CanEmbedInterfaces() public void ContextPaths_MustStayInsideSourceAndExist(string path, string expected) { using var source = new TempDirectory(); - File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), $"schemaVersion: 2\nkind: agent\nid: test/agent@1.0.0\ncontextFiles:\n - {path}\n"); + File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), $"schemaVersion: 3\nkind: agent\nid: test/agent@1.0.0\ncontextFiles:\n - {path}\n"); Assert.Contains(expected, Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); } @@ -531,7 +600,7 @@ public void UnknownYamlFields_AreRejected() { using var source = new TempDirectory(); File.WriteAllText(Path.Combine(source.Path, "root.yaml"), """ -schemaVersion: 2 +schemaVersion: 3 kind: agent id: test/agent@1.0.0 unknownField: rejected @@ -545,7 +614,7 @@ public void UnknownYamlFields_AreRejected() public void LegacyInheritanceFields_AreRejected(string field) { using var source = new TempDirectory(); - File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), $"schemaVersion: 2\nkind: agent\nid: test/agent@1.0.0\n{field}\n"); + File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), $"schemaVersion: 3\nkind: agent\nid: test/agent@1.0.0\n{field}\n"); Assert.Contains("invalid YAML", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); } @@ -554,7 +623,7 @@ public void VersionOneResources_AreRejected() { using var source = new TempDirectory(); File.WriteAllText(Path.Combine(source.Path, "agent.yaml"), "schemaVersion: 1\nkind: agent\nid: test/agent@1.0.0\n"); - Assert.Contains("schemaVersion must be 2", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); + Assert.Contains("schemaVersion must be 3", Assert.Throws(() => new ResourceLoader().Load(source.Path)).Message, StringComparison.OrdinalIgnoreCase); } [Fact] @@ -562,7 +631,7 @@ public void ResourceIds_RequireSemanticVersions() { using var source = new TempDirectory(); File.WriteAllText(Path.Combine(source.Path, "root.yaml"), """ -schemaVersion: 2 +schemaVersion: 3 kind: agent id: system/object@latest """); diff --git a/tools/render_whitepaper.py b/tools/render_whitepaper.py index 6d614cf..85930c5 100644 --- a/tools/render_whitepaper.py +++ b/tools/render_whitepaper.py @@ -103,9 +103,9 @@ def node(d, x, y, w, h, title, subtitle="", fill=colors.HexColor("#F7F8FC"), str def hierarchy(): d = Drawing(470, 238) - node(d, 155, 185, 160, 42, "enterprise-agent", "reusable behavior", colors.HexColor("#E9ECFF")) - node(d, 25, 60, 160, 42, "person-agent", "human-facing domain") - node(d, 285, 60, 160, 42, "repo-agent", "repository domain") + node(d, 155, 185, 160, 42, "enterprise profile", "reusable governance", colors.HexColor("#E9ECFF")) + node(d, 25, 60, 160, 42, "person profile", "human-facing defaults") + node(d, 285, 60, 160, 42, "repository profile", "repository defaults") node(d, 25, 0, 160, 38, "executive-assistant", fill=PALE, stroke=PURPLE) node(d, 285, 0, 160, 38, "payments-repo-agent", fill=PALE, stroke=PURPLE) for x1, y1, x2, y2 in [(235,185,105,102),(235,185,365,102),(105,60,105,38),(365,60,365,38)]: @@ -118,7 +118,7 @@ def pipeline(): d = Drawing(470, 165) node(d, 0, 60, 90, 48, "Typed YAML", "agents + skills") arrow(d, 90, 84, 120, 84) - node(d, 120, 60, 90, 48, "Compose", "embedding + contracts") + node(d, 120, 60, 90, 48, "Compose", "embedding + capabilities") arrow(d, 210, 84, 240, 84) node(d, 240, 55, 105, 58, "Resolved IR", "behavior + provenance", NAVY, NAVY, True) for y, label in [(125,"Codex"),(72,"Copilot"),(19,"Cursor + MCP")]: @@ -147,7 +147,7 @@ def dispatch(): d = Drawing(470, 150) node(d, 0, 48, 130, 55, "MCP call", "derived skill name") arrow(d, 130, 75, 165, 75) - node(d, 165, 40, 140, 70, "Resolve contract", "compatible local binding", NAVY, NAVY, True) + node(d, 165, 40, 140, 70, "Resolve capability", "compatible local binding", NAVY, NAVY, True) arrow(d, 305, 75, 340, 75) node(d, 340, 20, 130, 110, "Invocation package", "args + context + provenance", PALE, PURPLE) return d