marshal-ledger 0.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: marshal-ledger
|
|
3
|
+
Version: 0.0.0
|
|
4
|
+
Summary: Marshal — a vendor-neutral, open-source ledger for enterprise AI agents. Pre-release placeholder.
|
|
5
|
+
Project-URL: Homepage, https://github.com/marshal-ledger/marshal
|
|
6
|
+
Classifier: Development Status :: 1 - Planning
|
|
7
|
+
Classifier: Intended Audience :: Developers
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
|
|
12
|
+
# Marshal — an agent ledger
|
|
13
|
+
|
|
14
|
+
A vendor-neutral, open-source ledger for enterprise AI agents. Any format in, any format out, with versions, diffs, portability and audit across every platform.
|
|
15
|
+
|
|
16
|
+
Status: pre-alpha, private. See [the project spec](agent-ledger-project.md).
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Marshal — an agent ledger
|
|
2
|
+
|
|
3
|
+
A vendor-neutral, open-source ledger for enterprise AI agents. Any format in, any format out, with versions, diffs, portability and audit across every platform.
|
|
4
|
+
|
|
5
|
+
Status: pre-alpha, private. See [the project spec](agent-ledger-project.md).
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# Marshal — an agent ledger
|
|
2
|
+
|
|
3
|
+
**A vendor-neutral, open-source ledger for enterprise AI agents. Any format in, any format out, with versions, diffs, portability and audit across every platform.**
|
|
4
|
+
|
|
5
|
+
*(Name decided. `marshal-ledger` was free on PyPI, npm and GitHub as of 2026-10-25. Bare `marshal` is unusable on PyPI because it is a Python standard-library module; the Python package is `marshal_ledger`. Domains and trademark not yet checked.)*
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The problem
|
|
10
|
+
|
|
11
|
+
Large organizations run agents on several platforms at once: Databricks, Copilot Studio, Bedrock, Vertex, Agentforce, and pro-code frameworks in their own repos. Each platform stores definitions in its own format, and new open standards (ADL, Open Agent Spec, OASF) add more formats rather than replacing the old ones. Nobody can answer basic questions across all of them:
|
|
12
|
+
|
|
13
|
+
- What agents exist, where do they run, and which team owns them?
|
|
14
|
+
- What changed between the version in production last month and today?
|
|
15
|
+
- Which agents use this tool, this knowledge source, or this write permission?
|
|
16
|
+
- Could this agent move to another platform, and what exactly would be lost?
|
|
17
|
+
- Has another team already built something like the agent I'm about to build?
|
|
18
|
+
|
|
19
|
+
Platform vendors have no reason to answer these questions across competitors' platforms, and the open standards ask authors to rewrite agents in a new format, which most teams won't do.
|
|
20
|
+
|
|
21
|
+
## The approach
|
|
22
|
+
|
|
23
|
+
Marshal never asks anyone to author in a new format or change how they deploy. It reads the artifacts teams already produce, builds a normalized, versioned record, and translates to whatever format someone needs next.
|
|
24
|
+
|
|
25
|
+
**Principles**
|
|
26
|
+
|
|
27
|
+
- **Any format in, any format out.** Closed platform formats and open standards are all just adapters. No format is privileged, including our own.
|
|
28
|
+
- **Passive.** A CI step and optional API pollers collect definitions automatically. Nobody maintains the ledger by hand.
|
|
29
|
+
- **Read-only by default.** It never writes to repos or platforms, which keeps the security review simple.
|
|
30
|
+
- **Honest about fidelity.** Every record and every translation carries a quality and fidelity score. The ledger never guesses, and an unknown value is stored as `unknown`.
|
|
31
|
+
- **Self-hosted.** It runs inside the organization's network, on their own database.
|
|
32
|
+
|
|
33
|
+
## Architecture
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
COLLECTORS (passive)
|
|
37
|
+
CI step (proposed + shipped events) → deploy artifacts
|
|
38
|
+
API pollers (optional, admin read) → UI-built agents, drift
|
|
39
|
+
File import → exports, specs, manifests
|
|
40
|
+
↓
|
|
41
|
+
READERS (one per format)
|
|
42
|
+
Databricks · Copilot Studio · Bedrock · Vertex · Agentforce
|
|
43
|
+
LangGraph · CrewAI · OpenAI Agents SDK · ADL · Agent Spec · OASF
|
|
44
|
+
↓
|
|
45
|
+
LEDGER MODEL (hub) + VERSION STORE
|
|
46
|
+
agents · versions · deployments
|
|
47
|
+
tools · knowledge · permissions (shared entities)
|
|
48
|
+
per-field provenance and quality scores
|
|
49
|
+
↓
|
|
50
|
+
WRITERS (one per format) CAPABILITIES
|
|
51
|
+
any reader's format, plus → inventory · risk-ranked diff
|
|
52
|
+
fidelity report portability scores · discovery
|
|
53
|
+
audit trail · conversion
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Hub-and-spoke translation.** Every format gets one reader and one writer, both mapping to the ledger model. Adding a format costs two adapters, not one translator per pair of formats. The ledger model is a superset: it holds everything a standard holds, plus provenance, deployments, unknowns and platform extension blocks.
|
|
57
|
+
|
|
58
|
+
**Translation is easy to write and hard to make faithful.** Generating adapters is fast. Making them trustworthy is the real work. Every adapter ships with:
|
|
59
|
+
|
|
60
|
+
- **Round-trip tests:** read → write → read must produce the same ledger record, or the differences must be declared.
|
|
61
|
+
- **Golden fixtures:** real public agent definitions for each format, never synthetic ones.
|
|
62
|
+
- **A declared loss table:** which fields this writer can't express, so fidelity reports are computed, not guessed.
|
|
63
|
+
|
|
64
|
+
## Supported formats
|
|
65
|
+
|
|
66
|
+
Fidelity tiers keep the user experience smooth while coverage grows. Every major provider is supported at some tier from early on, and the score tells the user exactly what that tier means for their agent.
|
|
67
|
+
|
|
68
|
+
| Tier | Meaning |
|
|
69
|
+
|---|---|
|
|
70
|
+
| **Full** | Read and write, round-trip tested |
|
|
71
|
+
| **Partial** | Read and write, with declared gaps |
|
|
72
|
+
| **Inventory** | Read metadata only (name, owner, platform, version, deployments) |
|
|
73
|
+
|
|
74
|
+
| Format | Type | Starting tier (target) |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| Databricks Asset Bundles, including Genie spaces | Closed, as-code | Full (first parser) |
|
|
77
|
+
| Copilot Studio solution exports | Closed | Spike in week 1, then Partial |
|
|
78
|
+
| Amazon Bedrock agents (CloudFormation / CDK) | Closed, as-code | Partial |
|
|
79
|
+
| Google Vertex AI agents | Closed | Inventory → Partial |
|
|
80
|
+
| Salesforce Agentforce | Closed | Inventory → Partial |
|
|
81
|
+
| LangGraph, CrewAI, OpenAI Agents SDK | Pro-code | Partial via static extraction |
|
|
82
|
+
| ADL | Open standard | Full |
|
|
83
|
+
| Open Agent Spec | Open standard | Full |
|
|
84
|
+
| AGNTCY OASF | Open standard | Full (metadata) |
|
|
85
|
+
|
|
86
|
+
*Verify each format's current export path and schema before building its adapter. ADL's spec repo notes a US provisional patent application alongside its Apache 2.0 license; review that before deep integration.*
|
|
87
|
+
|
|
88
|
+
## Data model
|
|
89
|
+
|
|
90
|
+
**Agent → Version → Deployment**
|
|
91
|
+
|
|
92
|
+
- **Agent:** the logical identity, such as `invoice-agent`.
|
|
93
|
+
- **Version:** content-addressed, a hash of the normalized definition. Environment-bound fields (endpoints, connection references, environment variables) are excluded from the hash, so the same definition in dev and prod is literally the same version.
|
|
94
|
+
- **Deployment:** version + platform + environment + time + pipeline run. "Which version runs where" is a query.
|
|
95
|
+
|
|
96
|
+
**Shared entities.** Tools, knowledge sources and permissions are first-class records shared across agents, so the ledger can answer "who depends on this?" In the MVP, entities match only on exact identity. Recognizing that a Copilot connector, an MCP tool and an OpenAPI operation wrap the same underlying API is the hard entity-resolution problem and a planned milestone.
|
|
97
|
+
|
|
98
|
+
**Two events per deploy.**
|
|
99
|
+
|
|
100
|
+
- `proposed`: captured before deploy, from the PR. Powers review.
|
|
101
|
+
- `shipped`: confirmed after deploy succeeds. Diffs compare against the last shipped version, so failed deploys never show up as live.
|
|
102
|
+
|
|
103
|
+
## Ledger record (draft)
|
|
104
|
+
|
|
105
|
+
Every field records where its value came from: `declared` (in the source artifact), `annotation` (such as MCP tool hints), `derived` (computed by the ledger), or `unknown`.
|
|
106
|
+
|
|
107
|
+
```yaml
|
|
108
|
+
apiVersion: marshal/v0
|
|
109
|
+
kind: AgentVersion
|
|
110
|
+
agent: invoice-agent
|
|
111
|
+
version: sha256:7c41...
|
|
112
|
+
source:
|
|
113
|
+
format: databricks-asset-bundle
|
|
114
|
+
artifact: databricks.yml
|
|
115
|
+
commit: 3f9c2e1
|
|
116
|
+
pipeline_run: gh-actions/8812
|
|
117
|
+
spec:
|
|
118
|
+
model:
|
|
119
|
+
requested: claude-sonnet # alias the agent asks for
|
|
120
|
+
resolved: unknown # only filled where a gateway is connected
|
|
121
|
+
instructions:
|
|
122
|
+
hash: sha256:ab12...
|
|
123
|
+
text: prompts/invoice.md # omitted in hash-only mode
|
|
124
|
+
tools:
|
|
125
|
+
- ref: tool/sap.update_po
|
|
126
|
+
scope: { value: write, provenance: declared }
|
|
127
|
+
reversible: { value: unknown, provenance: unknown }
|
|
128
|
+
knowledge:
|
|
129
|
+
- ref: knowledge/uc.finance.vendor_faq_idx
|
|
130
|
+
permissions:
|
|
131
|
+
identity: service_principal
|
|
132
|
+
principal: sp-invoice-agent
|
|
133
|
+
extensions:
|
|
134
|
+
databricks: { ... } # platform-specific fields kept intact
|
|
135
|
+
quality:
|
|
136
|
+
completeness: 0.82
|
|
137
|
+
unknown_fields: [tools[0].reversible, model.resolved]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Quality and portability scores
|
|
141
|
+
|
|
142
|
+
Scores are how the ledger stays useful even where support is partial.
|
|
143
|
+
|
|
144
|
+
**Completeness.** How much of the record is declared or derived versus `unknown`, weighted by importance (permissions and write tools count more than descriptions).
|
|
145
|
+
|
|
146
|
+
**Portability, per target platform.** Two parts, always shown separately:
|
|
147
|
+
|
|
148
|
+
1. **Platform limitations** from the public capability matrix: what the target can't express at all.
|
|
149
|
+
*"Copilot Studio has no equivalent for Unity Catalog vector index references."*
|
|
150
|
+
2. **Agent-specific issues:** features this particular agent uses that don't translate.
|
|
151
|
+
*"Uses 2 Databricks-only functions; 1 tool has unknown write scope."*
|
|
152
|
+
|
|
153
|
+
**Translation fidelity.** Every conversion produces a report listing what carried over losslessly, what was approximated, and what was dropped.
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
$ marshal port invoice-agent --to copilot-studio
|
|
157
|
+
|
|
158
|
+
Portability: 71 / 100
|
|
159
|
+
Platform limitations (copilot-studio):
|
|
160
|
+
✗ UC vector index → no native equivalent; needs a knowledge source rebuild
|
|
161
|
+
Agent-specific issues:
|
|
162
|
+
~ instructions reference a Genie space by ID
|
|
163
|
+
? tool sap.update_po: write scope unknown in source
|
|
164
|
+
Fidelity: 14 fields lossless · 3 approximated · 2 dropped
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### The capability matrix
|
|
168
|
+
|
|
169
|
+
A public, community-maintained data file per platform listing what it supports: tool types, knowledge source types, identity modes, guardrails and model options. It keeps portability scores honest and gives contributors an easy first PR.
|
|
170
|
+
|
|
171
|
+
## Capabilities
|
|
172
|
+
|
|
173
|
+
### MVP
|
|
174
|
+
|
|
175
|
+
| Capability | What it does |
|
|
176
|
+
|---|---|
|
|
177
|
+
| **Inventory** | Every agent, version and deployment across platforms |
|
|
178
|
+
| **Risk-ranked diff** | Normalized diff between versions, sorted by severity: permission escalation, new write tools, model changes and removed knowledge first. Posted as a PR comment |
|
|
179
|
+
| **Conversion** | Any supported format to any other, with a fidelity report |
|
|
180
|
+
| **Portability scores** | Per target, split into platform limitations and agent-specific issues |
|
|
181
|
+
| **Discovery** | Search by tool, knowledge source, model or permission; "who depends on this?" |
|
|
182
|
+
| **Audit trail** | Who changed what, when, through which pipeline |
|
|
183
|
+
|
|
184
|
+
### Later
|
|
185
|
+
|
|
186
|
+
- **Entity resolution** across connector types for the same underlying API
|
|
187
|
+
- **Forking with lineage:** copy another team's agent into your platform's format and track the upstream
|
|
188
|
+
- **Agent bill of materials:** everything a version depended on, pinned where sources are connected
|
|
189
|
+
- **Rollback recipes:** the exact commit, artifact and command to revert to, run by the team's own pipeline
|
|
190
|
+
- **Policy checks:** rules like "write-scope or irreversible tools need approval," the same on every platform
|
|
191
|
+
- **Resolved-model enrichment** where an AI gateway is connected
|
|
192
|
+
|
|
193
|
+
### Non-goals
|
|
194
|
+
|
|
195
|
+
- Runtime evaluation or testing (needs traces most teams don't have)
|
|
196
|
+
- Hosting or executing agents
|
|
197
|
+
- Writing to repos or platforms by default
|
|
198
|
+
- Scoring or monitoring individual people
|
|
199
|
+
|
|
200
|
+
## Security posture
|
|
201
|
+
|
|
202
|
+
- **Secret redaction in every reader**, by design. Deploy artifacts often carry credentials and environment variables; they never reach the store.
|
|
203
|
+
- **Hash-only mode** per org: store instruction hashes instead of prompt text. Diffs then report "instructions changed" without showing content.
|
|
204
|
+
- **CI path stands alone.** Pollers need admin-level read credentials, so they're optional, not required for core value.
|
|
205
|
+
- **Self-hosted** with no external calls.
|
|
206
|
+
|
|
207
|
+
## Demo
|
|
208
|
+
|
|
209
|
+
**GitHub Action, around the deploy step teams already have:**
|
|
210
|
+
|
|
211
|
+
```yaml
|
|
212
|
+
- uses: marshal-ledger/collect@v1
|
|
213
|
+
with: { event: proposed, artifacts: databricks.yml }
|
|
214
|
+
- run: databricks bundle deploy -t prod
|
|
215
|
+
- uses: marshal-ledger/collect@v1
|
|
216
|
+
with: { event: shipped, artifacts: databricks.yml, target: prod }
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**PR comment, ranked by risk:**
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
invoice-agent (Databricks) v14 → v15
|
|
223
|
+
|
|
224
|
+
HIGH + tool: sap.update_po (write, reversibility unknown)
|
|
225
|
+
HIGH ~ permissions: principal gained 1 grant
|
|
226
|
+
MED - knowledge: vendor-faq-2023
|
|
227
|
+
LOW ~ instructions: 3 lines changed
|
|
228
|
+
|
|
229
|
+
Completeness 82% · Portability: Bedrock 88 · Copilot Studio 71
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**CLI:**
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
$ marshal ls --tool "sap.*"
|
|
236
|
+
$ marshal diff invoice-agent@v12 invoice-agent@v15
|
|
237
|
+
$ marshal convert agent.adl.yaml --to agent-spec
|
|
238
|
+
$ marshal port invoice-agent --to bedrock
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Plan
|
|
242
|
+
|
|
243
|
+
| Weeks | Deliverable |
|
|
244
|
+
|---|---|
|
|
245
|
+
| 1 | Exportability spike across Copilot Studio, Bedrock, Vertex and Agentforce. Ledger model v0. Databricks reader |
|
|
246
|
+
| 2–3 | Version store with agent → version → deployment, proposed/shipped events, `ledger ls` and `ledger diff` |
|
|
247
|
+
| 4 | GitHub Action, risk-ranked PR comments, secret redaction, hash-only mode |
|
|
248
|
+
| 5–6 | Readers and writers for ADL, Open Agent Spec and OASF, round-trip tests, `ledger convert` with fidelity reports |
|
|
249
|
+
| 7 | Capability matrix v0, quality and portability scores, `ledger port` |
|
|
250
|
+
| 8 | Copilot Studio and Bedrock adapters at the tier the spike supports; inventory-only readers for the rest |
|
|
251
|
+
| 9 | Discovery and dependency queries, simple read-only web view |
|
|
252
|
+
| 10 | Docs, capability matrix contribution guide, sample repo with real public agents, launch |
|
|
253
|
+
|
|
254
|
+
## Target users and success metrics
|
|
255
|
+
|
|
256
|
+
**First users:** platform and AI enablement teams at organizations running agents on two or more platforms.
|
|
257
|
+
|
|
258
|
+
**Success looks like:**
|
|
259
|
+
|
|
260
|
+
- 3 platform teams running the Action in real pipelines
|
|
261
|
+
- Every major platform supported at Inventory tier or better
|
|
262
|
+
- Round-trip tests passing for all Full-tier formats
|
|
263
|
+
- Outside contributions to the capability matrix
|
|
264
|
+
|
|
265
|
+
## Tech stack (suggested)
|
|
266
|
+
|
|
267
|
+
- **Core, readers, writers:** Python, with Pydantic models generated from a JSON Schema spec
|
|
268
|
+
- **Store:** SQLite or DuckDB locally; Postgres for shared deployments
|
|
269
|
+
- **CI:** GitHub Action first; GitLab and Azure DevOps later
|
|
270
|
+
- **UI:** a lightweight read-only web view
|
|
271
|
+
- **Packaging:** Docker image and Helm chart for self-hosting
|
|
272
|
+
|
|
273
|
+
## Open questions
|
|
274
|
+
|
|
275
|
+
- How much of each closed platform's config is actually exportable today? (Answered by the week 1 spike.)
|
|
276
|
+
- How should completeness be weighted so the score reflects real governance risk?
|
|
277
|
+
- Should the capability matrix be versioned per platform release?
|
|
278
|
+
- Which open standard gains the most adoption, and should the ledger model track it closely or stay deliberately independent?
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "marshal-ledger"
|
|
7
|
+
version = "0.0.0"
|
|
8
|
+
description = "Marshal — a vendor-neutral, open-source ledger for enterprise AI agents. Pre-release placeholder."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 1 - Planning",
|
|
13
|
+
"Intended Audience :: Developers",
|
|
14
|
+
"Programming Language :: Python :: 3",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
[project.urls]
|
|
18
|
+
Homepage = "https://github.com/marshal-ledger/marshal"
|