Skip to content

Commit 71b473f

Browse files
author
Agoragentic
committed
Add Micro ECF Agent OS harness export
1 parent c1b8aa5 commit 71b473f

8 files changed

Lines changed: 364 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [2.6.2] - 2026-04-23
9+
10+
### Added
11+
- **Micro ECF** public repo entrypoint in `micro-ecf/`
12+
- Local policy example for context, tools, budget, approvals, memory, swarm, and deployment posture
13+
- No-spend `export-agent-os-harness.mjs` helper that emits `agoragentic.agent-os.harness.v1`
14+
- `agent_os_preview_request` mapping for Agent OS preview without distributing hosted platform internals
15+
- Discovery pointers for the Agent OS Harness at `https://agoragentic.com/agent-os-harness.json`
16+
817
## [2.5.0] - 2026-04-12
918

1019
### Added

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ Do **not** start with `GET /api/capabilities` or `POST /api/invoke/{listing_id}`
6565
| [**DashClaw**](dashclaw/) | JavaScript | ✅ Ready | `dashclaw/agoragentic_dashclaw.mjs` | [README](dashclaw/README.md) |
6666
| [**Syrin**](syrin/) | Python | ✅ Ready | `syrin/agoragentic_syrin.py` | [README](syrin/README.md) |
6767
| [**Agent OS Control Plane**](agent-os/) | JavaScript/Python | ✅ Ready | `agent-os/agent_os_node.mjs` | [README](agent-os/README.md) |
68+
| [**Micro ECF**](micro-ecf/) | JavaScript | Beta | `micro-ecf/export-agent-os-harness.mjs` | [README](micro-ecf/README.md) |
6869

6970
> **Machine-readable index:** [`integrations.json`](./integrations.json)
7071
@@ -132,6 +133,23 @@ Hosted docs:
132133
- https://agoragentic.com/agent-os/
133134
- https://agoragentic.com/guides/agent-os-quickstart/
134135

136+
## Micro ECF To Agent OS
137+
138+
Micro ECF is the local policy layer for preparing an agent before it gets hosted spend, public API exposure, marketplace seller exposure, or x402 monetization.
139+
140+
```bash
141+
node micro-ecf/export-agent-os-harness.mjs \
142+
--policy micro-ecf/policy.example.json \
143+
--output ./agent-os-harness.packet.json
144+
```
145+
146+
The output includes an Agent OS Harness packet plus `agent_os_preview_request` for `POST /api/hosting/agent-os/preview`.
147+
148+
Canonical contract:
149+
- https://agoragentic.com/agent-os-harness.json
150+
- https://agoragentic.com/agent-os/launch/
151+
- https://agoragentic.com/agent-os/deployments/
152+
135153
## Architecture
136154

137155
```
@@ -153,6 +171,7 @@ Your Agent → Integration (tools/MCP) → Agoragentic API
153171
| LLM full context | [`llms-full.txt`](./llms-full.txt) |
154172
| Capability description | [`SKILL.md`](./SKILL.md) |
155173
| Agent OS public export | [`agent-os/README.md`](./agent-os/README.md) |
174+
| Micro ECF | [`micro-ecf/README.md`](./micro-ecf/README.md) |
156175
| Changelog | [`CHANGELOG.md`](./CHANGELOG.md) |
157176
| Citation | [`CITATION.cff`](./CITATION.cff) |
158177
| A2A agent card | [`a2a/agent-card.json`](./a2a/agent-card.json) |

SKILL.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ Use x402 if you want zero-registration onchain payment.
113113
* **Docs:** `https://agoragentic.com/docs.html`
114114
* **Agent OS overview:** `https://agoragentic.com/agent-os/`
115115
* **Agent OS quickstart:** `https://agoragentic.com/guides/agent-os-quickstart/`
116+
* **Agent OS Harness:** `https://agoragentic.com/agent-os-harness.json`
116117
* **Sitemap:** `https://agoragentic.com/sitemap.xml`
117118

118119
MCP-compatible clients can use Agoragentic through the `.well-known/mcp/server-card.json` manifest.
@@ -159,6 +160,16 @@ Use it when an agent needs:
159160
Public export repo path: `agent-os/README.md` in [rhein1/agoragentic-integrations](https://github.com/rhein1/agoragentic-integrations).
160161
Hosted guide: [https://agoragentic.com/guides/agent-os-quickstart/](https://agoragentic.com/guides/agent-os-quickstart/)
161162

163+
### Micro ECF
164+
165+
Use `micro-ecf/` in this repo when a builder needs local context, tool, budget, approval, memory, and swarm policy before sending anything to hosted Agent OS. Run:
166+
167+
```bash
168+
node micro-ecf/export-agent-os-harness.mjs --policy micro-ecf/policy.example.json --output ./agent-os-harness.packet.json
169+
```
170+
171+
The output includes `agent_os_preview_request` for `POST /api/hosting/agent-os/preview`. It does not execute hosted work, provision cloud resources, activate billing, or publish marketplace listings.
172+
162173
---
163174

164175
## Authentication

integrations.json

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"version": "2.6.1",
3-
"updated_at": "2026-04-15",
2+
"version": "2.6.2",
3+
"updated_at": "2026-04-23",
44
"canonical_url": "https://agoragentic.com",
55
"canonical_manifest": "https://agoragentic.com/.well-known/agent-marketplace.json",
66
"packages": {
@@ -155,6 +155,15 @@
155155
"install": "node 18+ or pip install requests",
156156
"docs": "agent-os/README.md"
157157
},
158+
{
159+
"id": "micro-ecf",
160+
"name": "Micro ECF",
161+
"language": "javascript",
162+
"status": "beta",
163+
"path": "micro-ecf/export-agent-os-harness.mjs",
164+
"install": "node micro-ecf/export-agent-os-harness.mjs --policy micro-ecf/policy.example.json",
165+
"docs": "micro-ecf/README.md"
166+
},
158167
{
159168
"id": "langchain",
160169
"name": "LangChain",
@@ -387,6 +396,8 @@
387396
"acp_spec": "specs/ACP-SPEC.md",
388397
"agent_os": "agent-os/README.md",
389398
"agent_os_public_export": "agent-os/README.md",
399+
"micro_ecf": "micro-ecf/README.md",
400+
"agent_os_harness": "https://agoragentic.com/agent-os-harness.json",
390401
"agent_os_overview": "https://agoragentic.com/agent-os/",
391402
"agent_os_quickstart": "https://agoragentic.com/guides/agent-os-quickstart/",
392403
"live_api": "https://agoragentic.com",

llms.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- Dify, A2A (JSON)
1919
- LangSmith: langsmith/README.md (observability)
2020
- Agent OS Control Plane: agent-os/README.md (public quote, procurement, approval, execute, and reconciliation flow)
21+
- Micro ECF: micro-ecf/README.md (local policy simulation and Agent OS Harness export)
2122

2223
## Machine Index
2324
- integrations.json — structured index of all integrations, tools, packages
@@ -27,13 +28,15 @@
2728
- a2a/agent-card.json — A2A protocol card
2829
- glama.json — Glama registry
2930
- agent-os/README.md — Agent OS public control-plane export
31+
- micro-ecf/README.md — local Micro ECF policy layer and Agent OS Harness export
3032

3133
## Live API
3234
- Manifest: https://agoragentic.com/.well-known/agent-marketplace.json
3335
- Docs: https://agoragentic.com/docs.html
3436
- Self-test: https://agoragentic.com/api/discovery/check
3537
- Agent OS: https://agoragentic.com/agent-os/
3638
- Agent OS quickstart: https://agoragentic.com/guides/agent-os-quickstart/
39+
- Agent OS harness: https://agoragentic.com/agent-os-harness.json
3740

3841
## Optional
3942
- llms-full.txt — extended repo context

micro-ecf/README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Micro ECF
2+
3+
Micro ECF is the open local governance layer for builders who want to prepare an agent for Agent OS without receiving Agoragentic hosted internals.
4+
5+
It answers the pre-deployment questions:
6+
7+
- what the agent can know
8+
- what tools it can call
9+
- what it can spend
10+
- what needs approval
11+
- what it can remember
12+
- what it can hand off to another agent
13+
14+
The output is an Agent OS Harness packet that can be mapped into an Agent OS preview request.
15+
16+
## Boundary
17+
18+
Open in this folder:
19+
20+
- context, tool, budget, approval, memory, swarm, and deployment policy shape
21+
- local example policy
22+
- no-spend harness export helper
23+
- Agent OS preview-request mapping
24+
25+
Not included:
26+
27+
- hosted router ranking
28+
- trust, fraud, or reputation internals
29+
- settlement or payout orchestration
30+
- cloud provisioning adapters
31+
- reviewed executor internals
32+
- private connectors or broker authority
33+
- Full ECF private runtime
34+
35+
## Local Export
36+
37+
```bash
38+
node micro-ecf/export-agent-os-harness.mjs \
39+
--policy micro-ecf/policy.example.json \
40+
--output ./agent-os-harness.packet.json
41+
```
42+
43+
The exported JSON includes:
44+
45+
- `schema: "agoragentic.agent-os.harness.v1"`
46+
- local policy sections
47+
- `public_boundary`, the explicit no-spend/non-provisioning/non-billing boundary
48+
- `agent_os_export` endpoint metadata
49+
- `agent_os_preview_request`, a no-spend request body for `POST /api/hosting/agent-os/preview`
50+
51+
## Agent OS Funnel
52+
53+
1. Edit `micro-ecf/policy.example.json` for your agent.
54+
2. Export an Agent OS Harness packet.
55+
3. Send `agent_os_preview_request` to `POST https://agoragentic.com/api/hosting/agent-os/preview`.
56+
4. If the preview looks correct, record a deployment request with `POST /api/hosting/agent-os/deployments`.
57+
5. Fund the deployment treasury before autonomous runtime spend.
58+
6. Run or record one bounded first proof.
59+
7. Review results in the Agent OS workspace.
60+
8. Activate public API, marketplace, or x402 exposure only after fulfillment, smoke, and reconciliation gates pass.
61+
62+
Canonical contract:
63+
64+
- `https://agoragentic.com/agent-os-harness.json`
65+
- `https://agoragentic.com/agent-os/launch/`
66+
- `https://agoragentic.com/agent-os/deployments/`
67+
68+
## No-Spend Rule
69+
70+
This folder does not execute hosted work, provision cloud resources, activate billing, or publish marketplace listings. It only creates a local policy packet and preview-request body.
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
#!/usr/bin/env node
2+
import fs from 'node:fs';
3+
import path from 'node:path';
4+
import { fileURLToPath } from 'node:url';
5+
6+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
7+
const DEFAULT_POLICY = path.join(__dirname, 'policy.example.json');
8+
const DEFAULT_BASE_URL = 'https://agoragentic.com';
9+
10+
const REQUIRED_SECTIONS = [
11+
'agent_manifest',
12+
'context_policy',
13+
'tool_policy',
14+
'budget_policy',
15+
'approval_policy',
16+
'memory_policy',
17+
'swarm_policy',
18+
'deployment_policy',
19+
];
20+
21+
function parseArgs(argv) {
22+
const args = {
23+
policy: DEFAULT_POLICY,
24+
output: null,
25+
baseUrl: DEFAULT_BASE_URL,
26+
};
27+
28+
for (let i = 0; i < argv.length; i += 1) {
29+
const arg = argv[i];
30+
if (arg === '--policy') args.policy = argv[++i];
31+
else if (arg === '--output') args.output = argv[++i];
32+
else if (arg === '--base-url') args.baseUrl = argv[++i];
33+
else if (arg === '--help' || arg === '-h') {
34+
printHelp();
35+
process.exit(0);
36+
} else {
37+
throw new Error(`Unknown argument: ${arg}`);
38+
}
39+
}
40+
41+
return args;
42+
}
43+
44+
function printHelp() {
45+
console.log(`Usage:
46+
node micro-ecf/export-agent-os-harness.mjs --policy micro-ecf/policy.example.json --output ./agent-os-harness.packet.json
47+
48+
Options:
49+
--policy <path> Micro ECF policy JSON. Defaults to micro-ecf/policy.example.json.
50+
--output <path> Write packet to a file. Defaults to stdout.
51+
--base-url <url> Agoragentic base URL. Defaults to https://agoragentic.com.
52+
`);
53+
}
54+
55+
function readPolicy(policyPath) {
56+
const resolved = path.resolve(policyPath);
57+
const policy = JSON.parse(fs.readFileSync(resolved, 'utf8'));
58+
validatePolicy(policy);
59+
return { policy, resolved };
60+
}
61+
62+
function validatePolicy(policy) {
63+
for (const section of REQUIRED_SECTIONS) {
64+
if (!policy[section] || typeof policy[section] !== 'object' || Array.isArray(policy[section])) {
65+
throw new Error(`Missing required object section: ${section}`);
66+
}
67+
}
68+
if (!policy.agent_manifest.name) throw new Error('agent_manifest.name is required');
69+
if (!policy.agent_manifest.primary_goal) throw new Error('agent_manifest.primary_goal is required');
70+
}
71+
72+
function buildHarnessPacket(policy, { baseUrl, policyPath }) {
73+
const deploymentPolicy = policy.deployment_policy || {};
74+
const budgetPolicy = policy.budget_policy || {};
75+
const agent = policy.agent_manifest || {};
76+
const source = deploymentPolicy.source || {};
77+
const hostingTarget = deploymentPolicy.hosting_target || 'self_hosted_http';
78+
79+
const packet = {
80+
schema: 'agoragentic.agent-os.harness.v1',
81+
generated_at: new Date().toISOString(),
82+
generated_from: {
83+
source: 'micro-ecf/export-agent-os-harness.mjs',
84+
policy_path: policyPath,
85+
canonical_contract: `${baseUrl.replace(/\/$/, '')}/agent-os-harness.json`,
86+
},
87+
agent_manifest: agent,
88+
context_policy: policy.context_policy,
89+
tool_policy: policy.tool_policy,
90+
budget_policy: budgetPolicy,
91+
approval_policy: policy.approval_policy,
92+
memory_policy: policy.memory_policy,
93+
swarm_policy: policy.swarm_policy,
94+
deployment_policy: deploymentPolicy,
95+
public_boundary: {
96+
no_spend_export: true,
97+
hosted_billing: false,
98+
cloud_provisioning: false,
99+
marketplace_publication: false,
100+
hosted_runtime_secrets: false,
101+
requires_agent_os_preview_before_deployment: true,
102+
requires_treasury_funding_before_autonomous_spend: true,
103+
},
104+
agent_os_export: {
105+
catalog_endpoint: 'GET /api/hosting/agent-os/catalog',
106+
preview_endpoint: 'POST /api/hosting/agent-os/preview',
107+
deployment_endpoint: 'POST /api/hosting/agent-os/deployments',
108+
treasury_endpoint: 'GET /api/hosting/agent-os/deployments/{deployment_id}/treasury',
109+
workspace_surface: '/agent-os/workspaces/',
110+
marketplace_router: 'POST /api/execute',
111+
x402_edge: 'POST https://x402.agoragentic.com/v1/{slug}',
112+
},
113+
agent_os_preview_request: {
114+
name: agent.name,
115+
hosting_target: hostingTarget,
116+
template_id: hostingTarget === 'platform_hosted_syrin' ? 'syrin_creator_demo' : 'self_hosted_router_advocate',
117+
runtime_lane: hostingTarget === 'platform_hosted_syrin' ? 'shared_platform_runtime' : 'customer_managed_http_runtime',
118+
exposure_mode: deploymentPolicy.exposure_mode || 'private_only',
119+
source: {
120+
type: source.type || 'repository',
121+
ref: source.ref || '',
122+
},
123+
goals: {
124+
primary_goal: agent.primary_goal,
125+
budget: {
126+
max_daily_usdc: budgetPolicy.max_daily_spend_usdc || 0,
127+
approval_required_above_usdc: budgetPolicy.approval_required_above_usdc || 0,
128+
recommended_start_reserve_usdc: budgetPolicy.recommended_start_reserve_usdc || 0,
129+
},
130+
},
131+
safety_policy: {
132+
first_proof_required: deploymentPolicy.first_proof_required !== false,
133+
context_policy: policy.context_policy,
134+
tool_policy: policy.tool_policy,
135+
approval_policy: policy.approval_policy,
136+
memory_policy: policy.memory_policy,
137+
swarm_policy: policy.swarm_policy,
138+
},
139+
deployment_packet: {
140+
schema: 'agoragentic.micro-ecf.export.v1',
141+
source: 'public_micro_ecf',
142+
harness_schema: 'agoragentic.agent-os.harness.v1',
143+
},
144+
},
145+
};
146+
147+
return packet;
148+
}
149+
150+
function main() {
151+
const args = parseArgs(process.argv.slice(2));
152+
const { policy, resolved } = readPolicy(args.policy);
153+
const packet = buildHarnessPacket(policy, {
154+
baseUrl: args.baseUrl,
155+
policyPath: path.relative(process.cwd(), resolved).replace(/\\/g, '/'),
156+
});
157+
const json = `${JSON.stringify(packet, null, 2)}\n`;
158+
159+
if (args.output) {
160+
const outputPath = path.resolve(args.output);
161+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
162+
fs.writeFileSync(outputPath, json);
163+
console.log(JSON.stringify({ ok: true, output: outputPath }, null, 2));
164+
} else {
165+
process.stdout.write(json);
166+
}
167+
}
168+
169+
try {
170+
main();
171+
} catch (err) {
172+
console.error(JSON.stringify({ ok: false, error: err.message }, null, 2));
173+
process.exit(1);
174+
}

0 commit comments

Comments
 (0)