holdout-governance
OfficialThis server exposes a holdout-governance API for validating, assessing, scaffolding, and attaching evidence to research artifacts.
gov_check: Run the holdout gate chain on a manifest and get a release / review_needed / block decision.
gov_report: Generate a read-only governance assessment of a research artifact.
gov_init: Scaffold a holdout policy + artifact project in a specified directory.
gov_attach: Attach gate evidence, attachments, declarations, or review approvals to a manifest (resetting its decision to pending).
Provides a GitHub Action that runs gov check on research artifacts as a fail-closed CI gate, blocking releases when evidence is missing or stale.
Holdout Governance
Fail-closed evidence manifests for AI-assisted quantitative research.
This is not a factor library, a backtest engine, or a trading system.
holdout-governance is infrastructure for the moment when a financial AI
agent drafts a research conclusion, calls tools, attaches evidence, and asks
whether the result can move forward.
holdout-governance records one research run or AI-generated output as a small JSON manifest:
what evidence artifacts were used;
the latest allowed timestamp for the decision;
which checks passed;
whether AI was used, and which prompt version;
whether a person approved the run; and
that the result stays research-only.
It is a local validation tool. It does not fetch market data, call a model, place orders, or give investment advice.
Agent boundary
holdout-governance is the boundary around an AI-assisted research workflow.
An agent may draft a conclusion, run tools, and attach evidence, but the
manifest and policy decide whether the result can move forward. Missing
evidence blocks by default; warnings can be downgraded only when the policy
says so; final publication still belongs to a person or an external release
process.
This is the intended contract: AI can help produce research, but it cannot silently skip evidence, erase accountability, or turn a draft into a released decision on its own.
That makes Holdout different from the usual quant stack. The usual stack helps you generate signals, test portfolios, and run execution. Holdout governs the research artifact around that work: what evidence exists, what checks passed, what policy was applied, and where human approval is required.
Related MCP server: sigmodx-mcp
Philosophy
Part of the Holdout toolchain — the governance layer. The name comes from the holdout set and the holdout juror: the thing you do not touch early, and the person who does not go along until the evidence is in.
The product philosophy is:
evidence before assertion;
default deny when evidence is missing;
policy as data, not hard-coded judgment;
AI may propose, but humans still approve release.
That means one manifest, one verdict, before anything ships.
Product flow
This package is the wrapper above the other Holdout tools. The main flow is:
data -> adjust -> timing -> backtest -> falsify -> review -> publish
holdout-governance sits across that flow as the final release gate. It
records what was checked, what was attached, what remains missing, and whether
the result is approved for release.
Quick start
python -m pip install -c tools/suite-constraints.txt ".[suite,research]"
gov doctor
python examples/demo.pyValidate a manifest:
gov validate --manifest examples/ai-research-manifest.json
gov report --manifest examples/ai-research-manifest.jsonCheck ledger health (fail-closed: bad json / duplicate ids / hash-chain breaks / out-of-order timestamps):
gov health --ledger examples/gov-demo/ledger/ledger.jsonlInstall and diagnose the toolchain
The suite extra installs the six companion tools at exact versions:
python -m pip install "holdout-governance[suite,research]==0.5.0"
gov doctorFrom a source checkout, use
python -m pip install -c tools/suite-constraints.txt ".[suite,research]".
tools/suite-constraints.txt documents the supported
Holdout package combination; it does not lock transitive dependencies. The new
extra and commands are introduced in version 0.5.0.
gov doctor prints every package version, expected version, actual command path
and CLI version. Missing packages, missing commands, unsupported versions and
commands from a conflicting Python environment produce exit 1. gov doctor --json
provides the same diagnosis for automation; it does not run research or install
anything. Activate the Python environment where you installed the tools first.
The local synthetic research workbench uses the separate research extra:
run holdout-research after installing the extras above, or use
Start-Factor-Research.cmd from the source checkout. holdout-research --check
checks dependencies without creating a study or exposing final-test data.
The workbench uses public, reproducible synthetic data, not market-calibrated
returns. Final evaluation consumes one opportunity before accessing samples;
the shared registry rejects already used or overlapping samples across studies.
It is a trusted local workflow, not an OS sandbox. See the
workbench guide for limits and saved-run behavior.
Version 0.4.3 does not include this workbench.
Real end-to-end demo
examples/gov-demo/run_demo.py runs real imm / padj / lf / fl
commands through gov check in a disposable copy of the fixtures. All generated
manifests, ledger edits and reports stay in that temporary directory. Failure
or interruption leaves the source fixtures unchanged.
python examples/gov-demo/run_demo.py # Windows / Linux / macOS
bash examples/gov-demo/run-demo.sh # Linux / macOS
pwsh -File examples/gov-demo/run-demo.ps1 # Windows PowerShellWhat you should see:
1. GREEN PATH real gate chain -> release (exit 0)
2. TAMPER append an unchained synthetic ledger event
3. BLOCK exit 2 AND evidence_integrity=fail
4. RESTORE original ledger bytes -> release (exit 0)
5. STRATEGY real qc gate on positive synthetic returns -> release (exit 0)
6. STRATEGY BLOCK negative synthetic returns -> block (exit 2), qc gate=failExit 1, missing binaries and configuration errors are rejected as demo failures;
they cannot stand in for ledger tamper detection. The strategy attachments and
returns are synthetic fixtures, not a verified trading strategy or release
approval. CI installs this checkout plus six companion packages from fixed
commit IDs into a clean environment on Windows and Linux, runs gov doctor,
and then runs this chain. Unit tests with substituted processes do not replace
that integration check.
GitHub Action (fail-closed gate in CI)
holdout-labs/holdout-governance is a reusable action that runs gov check
on your manifest. When the gate chain blocks (missing or stale evidence), the
action step fails — which is the point: nothing ships without evidence.
steps:
- uses: holdout-labs/holdout-governance@v0.5.0
with:
manifest: research/artifact.json # path to your artifact.json
# policy: research/policy.yml # optional; defaults to beside the manifest
# suite: "true" # install the supported companion toolsNotes:
The updated action installs from its own downloaded source directory by default:
uses: ...@<tag-or-SHA>selects both the action and the installed package.refis an optional explicit installation override; it no longer defaults tomain. Setsuite: "true"to install the supported companion tools. Use a commit SHA for an immutable action reference. This behavior is introduced in v0.5.0.The gate needs its evidence tools on
PATH(imm/padj/lf/fl) to ever pass; without them it fails closed by design. The tools live in the sibling repos:falsification-ledger,pit-adjuster,factor-qc,lookahead-free,ashare-data-immunity.Exit codes:
0= release,1= review needed,2= block.
Contract (v0.2, frozen)
The governance contract lives in schema/ and is locked by tests:
schema/artifact.schema.json—holdout.artifact.v0.2schema/policy.schema.json+schema/policy.example.yml—holdout.policy.v0.1examples/artifact.example.json— a conformingresearch_conclusionartifactdocs/migration-v1-to-v0.2.md— upgrade path from the v1 manifest
gov check — scenario 1 (done, M1)
AI-generated research conclusions must pass data + timing + evidence gates before they can ship:
# scaffold a research-conclusion project
gov init --dir research/ --name momentum-oos-review
# point gate-inputs.json at your data (imm / padj / lf / fl commands),
# then run the gate chain and decide:
gov check --manifest research/artifact.json
# exit 0 = release, 1 = review_needed, 2 = block
# artifact.json is written back with decision, missing and gate evidence;
# raw tool outputs are persisted under research/reports/ (sha256-referenced)
gov report --manifest research/artifact.json # human-readablegov attach (done)
Attach evidence to an artifact before checking — the agent workflow:
gov attach --manifest research/artifact.json \
--gate data_integrity --status pass --tool imm --report-ref sha256:...
gov attach --manifest research/artifact.json --attachment sources=docs/sources.md
gov attach --manifest research/artifact.json --declaration contains_returns=true
gov attach --manifest research/artifact.json --review approved --reviewer research-ownerAttaching evidence resets decision to pending — a decision is only as
good as the evidence it was computed from, so any evidence change invalidates
it until the next gov check. The same operation is exposed to agents as the
gov_attach MCP tool.
Stable evidence fingerprints (done)
report_ref is a sha256: of the gate's tool output. Some tools stamp their
output with run-time fields (imm audit emits checked_at / audit_date),
so re-running the same check on the same data would change the fingerprint
and dirty every artifact.json diff. Gate specs can declare those fields:
{
"data_integrity": {
"cmd": ["imm", "audit", "--watchlist", "watchlist.json", "--history-root", "history", "--audit-root", "audit"],
"volatile_keys": ["audit_date", "checked_at"]
}
}volatile_keys are stripped (deep) from the JSON before hashing, with keys
sorted for a canonical form. The raw tool output is still persisted as
the gate report and the real run time stays in the gate entry's run_at —
nothing is lost, only the noise stops changing the fingerprint. Non-JSON
output keeps its byte-exact hash.
The acceptance suite (tests/test_m1_scenario1.py) runs 10 seeded-defect
samples (survivorship ×3, look-ahead ×3, adjustment drift ×2, missing
evidence ×2) against the real imm / lf / padj binaries — all 10 are
blocked, zero false passes — plus a clean control that must release.
Evidence semantics (done)
Two attestation failures found by a production evidence grill (2026-09) are
machine-checkable on the manifest: same-source evidence counted as
independent and a claimed data cutoff later than the run that produced
it (a now - lag stamp pretending to be a historical section).
Gate entries may attest two optional fields (gov attach, CLI or MCP):
gov attach --manifest research/artifact.json --gate pit_integrity \
--status pass --tool padj --report-ref sha256:... \
--evidence-source feed-a --data-cutoff 2026-09-06T14:59:00+08:00evidence_source— which data lineage the gate evidence rests on;data_cutoff— the data time the evidence reflects (not the run time).
Attestation is opt-in: an artifact that declares neither field anywhere
keeps the legacy semantics (a placeholder report_ref may legitimately
back several gate entries in manual-attach flows). Once any gate attests,
gov check / gov report enforce these rules fail-closed on the whole
artifact:
duplicate_evidence_content— two gate entries with the samereport_ref: the same bytes counted twice;data_cutoff_after_run_at— declared data time later than the run that produced the evidence: impossible by construction;same_source_slice_not_independent— twopassgates declaring the sameevidence_sourceand the samedata_cutoff: one time slice cannot confirm twice, whatever the byte content (volatile stamps differ, the information does not);warnings (not blockers):
same_source_multiple(sequential slices from one source are complementary, not independent) andattestation_incomplete(a cutoff without a source cannot be checked).
Run the same check standalone (read-only):
gov evidence --manifest research/artifact.jsonScenarios 2 & 3 (done, M2)
strategy_advice — must carry backtest evidence:
backtest_reportandrobustness_reportattachments, plus thestatistical_qualitygate (realqcrun). A backtest whosen_trialsis not declared is a refusal, not a failure:qcrefuses to judge →review_needed. A real overfitting blocker (DSR/PBO/haircut/MinTRL) →block. Acceptance suite:tests/test_m2_scenario23.py.public_copy — must carry
sources; when the copy declares return figures (declarations.contains_returns),limitationsbecomes required (conditional attachment, expressed inpolicy.yml, not code). A passinggov reportprints the attachments and serves as the publication note.
Contract extension (frozen): artifact.declarations (boolean flags) and
policy conditional_attachments (when/require).
Release integration (done, M3)
CI —
.github/workflows/ci.yml: pytest matrix (3.11/3.12) + a fail-closed smoke (scaffold →gov checkmust exit 2 without evidence).Reusable action —
.github/actions/gov-check: composite action that runsgov checkon any artifact in your workflows.pre-commit hook —
.pre-commit-hooks.yaml:gov check --manifeston everyartifact.json; a block refuses the commit. Wire it with:# .pre-commit-config.yaml repos: - repo: https://github.com/holdout-labs/holdout-governance rev: v0.5.0 hooks: - id: gov-checkAgent interface — two ways to call gov from code/agents:
gov api --port 8000— stdlib HTTP JSON API:GET /health,POST /check//report//init(no extra dependencies).gov mcp— MCP stdio server (pip install 'holdout-governance[mcp]') exposinggov_check,gov_report,gov_init,gov_attachtools for Claude / Cursor / any MCP client.
Fit
Use this package as the wrapper above the existing Holdout tools:
Need | Existing tool |
Data quality and snapshots |
|
Point-in-time price meaning |
|
Timing and future-data leakage |
|
Backtest quality |
|
Claims and evidence trail |
|
Past mistakes and reminders |
|
This package records that the checks passed. It does not authorize execution.
Verify a PyPI release
Each of the seven package repositories now has verify-pypi.yml. A published
GitHub release verifies its tag version on PyPI; the same workflow can be started
manually with an explicit version after a separate upload. It uses a pinned
pypi-verify-action, installs the exact version into a fresh environment and checks
packaged modules, package/CLI version consistency and help output. It never uploads
anything. A GitHub release made before the PyPI upload will fail verification until
the version is available; rerun after uploading rather than treating the release
page alone as proof of a usable package.
Development
python -m pip install -e .[test] pytest
python -m pytestAvailable Tools
4 toolsgov_attachA
Attach gate evidence, attachments, declarations or a human review to an artifact (decision resets to pending — run gov_check afterwards). Record gate + status + tool + report_ref after a gate tool produced evidence, or review + reviewer after a human reviewed. Attachments/declarations are name=value strings; repeated calls merge, never drop existing entries. Do NOT claim a gate passed when no tool ran — gov_check trusts the journaled status. Returns the updated gates, attachments, declarations and review.
| Name | Required | Description | Default |
|---|---|---|---|
| gate | No | gate_id to record together with status, e.g. data_integrity or temporal_integrity. | |
| tool | No | Name of the tool that produced the evidence, e.g. imm, padj, lf, fl, qc. | |
| review | No | Human review outcome: approved or not_recorded. | |
| status | No | Gate outcome: pass, fail, warn or not_run. | |
| manifest | Yes | Path to artifact.json (v0.2) that will receive the evidence. | |
| reviewer | No | Name of the human reviewer (auditable declaration, not authentication). | |
| attachment | No | Attachment as name=value, e.g. sources=docs/sources.md. Repeat by calling again. | |
| report_ref | No | Evidence reference for the report file, e.g. sha256:<hex> or a relative path. | |
| data_cutoff | No | Attest the data time the evidence reflects, ISO-8601 (distinct from run time). A cutoff later than the attach run is impossible and will block. | |
| declaration | No | Declaration as name=true|false, e.g. contains_returns=true. | |
| evidence_source | No | Attest which data lineage the gate evidence rests on (e.g. feed id or input file). Two pass gates on the SAME source and SAME data_cutoff are NOT independent evidence and will block. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the decision resets to pending, that repeated calls merge and 'never drop existing entries', and that gov_check trusts the journaled status rather than the caller's claim. It omits permissions/auth requirements and any explicit error or blocking behavior (the two block conditions live only in the schema), which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose before usage branches, constraints, and return shape. Only the closing 'Returns the updated gates, attachments, declarations and review' is largely redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter mutation tool with no annotations, the description covers purpose, the two recording modes, merge semantics, the reset-to-pending side effect, and the required gov_check follow-up; return values are covered by the output schema. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (11 params fully described), so the baseline would be 3, but the description adds real semantic value by grouping parameters into co-occurring sets (gate+status+tool+report_ref versus review+reviewer) and by clarifying that attachments/declarations are repeatable name=value merges. Those pairings are not derivable from reading the schema properties individually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb (Attach) and resource (gate evidence, attachments, declarations, human review) against an artifact, and further distinguishes itself by naming what it is not for and what must follow ('run gov_check afterwards'). An agent can separate it from gov_check and gov_report without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use branches: 'Record gate + status + tool + report_ref after a gate tool produced evidence, or review + reviewer after a human reviewed.' It also states an exclusion — 'Do NOT claim a gate passed when no tool ran' — and gives the required follow-up call, so both the trigger and the anti-pattern are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_checkA
Run the full holdout gate chain on a research artifact and return the verdict (release / review_needed / block) as JSON. Executes every required gate of the artifact kind with the real tools (fail-closed: missing tool, crash or timeout records not_run and blocks) and writes the result back. Use as the final step before publishing any AI-assisted research claim — after gov_init created the project and gov_attach recorded the evidence. Do NOT call it before evidence is attached: missing required gates produce review_needed or block by design. Returns decision, exit_code, missing, gates and policy_ref_ok; treat exit_code 2 (block) as do-not-publish.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Optional kind override, e.g. research_conclusion. Only use when the manifest's declared kind is wrong; otherwise leave unset. | |
| policy | No | Optional path to policy.yml. Defaults to policy.yml next to the manifest. | |
| manifest | Yes | Path to artifact.json (holdout v0.2 manifest) that records the research run. | |
| gate_inputs | No | Optional path to gate-inputs.json. Defaults to gate-inputs.json next to the manifest. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and meets it well. It discloses fail-closed behavior ('missing tool, crash or timeout records not_run and blocks'), the side effect of writing the result back, and the operational meaning of exit_code 2 as do-not-publish. This gives the agent a clear picture of safety and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four dense sentences with no filler: purpose and verdicts come first, then usage constraints, then return payload and error handling. Every sentence adds operational value, and critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a gate-checking tool with an output schema, the description covers return fields (decision, exit_code, missing, gates, policy_ref_ok), failure semantics, prerequisites, and the do-not-publish signal. Combined with the fully described schema and output schema, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all four parameters including defaults and when kind override should be used. The description reinforces the manifest and evidence-sequencing context but does not add parameter-level detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run the full holdout gate chain on a research artifact' and lists the exact verdict values (release / review_needed / block). Its lifecycle framing ('final step before publishing') distinguishes it from the related gov_init and gov_attach tools, so an agent can identify what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage timing ('Use as the final step before publishing'), prerequisite ordering ('after gov_init created the project and gov_attach recorded the evidence'), and a clear don't-call condition ('Do NOT call it before evidence is attached'). It does not explicitly name gov_report as the alternative for reporting, so it stops just short of fully contrasting all siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_initA
Scaffold a holdout governance project in a directory (created if missing): writes policy.yml and gate-inputs.json only if absent, and creates a new artifact.json with decision=pending. Never overwrites an existing artifact.json — if present it returns an error and writes nothing. Use once at the start of a research run, then attach evidence with gov_attach and decide with gov_check. Returns the created files and the policy_ref SHA.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Artifact kind, which selects the required gates: research_conclusion, strategy_advice, public_copy or code. | research_conclusion |
| name | No | Optional human-readable artifact id. Defaults to a timestamped id. | |
| directory | Yes | Directory to scaffold into. Created if missing (like mkdir -p). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses that files are created, conditionally written only if absent, artifact.json is never overwritten, and an error is returned with no writes on conflict. It also states the return value (created files and policy_ref SHA).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: what is written, the no-overwrite guarantee, the usage workflow, and the return value. It is front-loaded with the primary action and files.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, an output schema, and full schema param coverage, the description provides enough context for correct invocation: setup workflow, safety behavior, failure condition, and return payload. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents kind, name, and directory. The description adds little beyond the schema's existing notes, though it does reinforce that directory is created if missing. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('scaffold'), resource ('holdout governance project'), and exactly what is written (policy.yml, gate-inputs.json, artifact.json). It also distinguishes itself from siblings by referencing gov_attach and gov_check in the stated workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it once at the start of a research run and then use gov_attach and gov_check, which gives an agent clear sequencing guidance. It also states the error condition where the tool should not be used (if artifact.json already exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_reportA
Read-only governance assessment of a research artifact, returned as JSON: current decision state, missing required gates, pass/fail per recorded gate, and policy reference check — WITHOUT running any gate or changing any file. Use to inspect an artifact before attaching evidence or to understand why a previous check did not release. Prefer gov_check for fresh gate execution; gov_report never mutates and never spawns tools.
| Name | Required | Description | Default |
|---|---|---|---|
| policy | No | Optional path to policy.yml. Defaults to policy.yml next to the manifest. | |
| manifest | Yes | Path to artifact.json (v0.2) or a v1 manifest to assess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It clearly states the tool is read-only, runs no gates, changes no files, and never spawns tools. This gives an agent accurate expectations about side effects and safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. Every sentence earns its place: the first defines behavior and output, the second gives use cases, and the third names the sibling alternative and reinforces non-mutation. Key constraints are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only inspection tool. It covers purpose, output shape, usage timing, alternatives, and side-effect guarantees. An output schema exists, so return-value details need not be repeated, and the sibling context makes the tool's role in the workflow clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (manifest path and optional policy path). The description adds no additional parameter-level detail beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: a read-only governance assessment of a research artifact, returned as JSON. It enumerates the exact contents (decision state, missing gates, pass/fail per gate, policy reference check) and clearly distinguishes itself from gov_check by emphasizing it does not run gates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: inspect an artifact before attaching evidence or understand why a previous check did not release. It also names the alternative (gov_check) and states the preference for fresh gate execution, plus exclusions (never mutates, never spawns tools).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.5.0- Changed
gov_attach2 fields changed- added
Input schema / properties / data_cutoffAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Attest the data time the evidence reflects, ISO-8601 (distinct from run time). A cutoff later than the attach run is impossible and will block.", + "title": "Data Cutoff" +} - added
Input schema / properties / evidence_sourceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Attest which data lineage the gate evidence rests on (e.g. feed id or input file). Two pass gates on the SAME source and SAME data_cutoff are NOT independent evidence and will block.", + "title": "Evidence Source" +}
4 tool updates
v0.4.0- Changed
gov_attach9 fields changed- added
Input schema / properties / attachment / descriptionAdded value: +"Attachment as name=value, e.g. sources=docs/sources.md. Repeat by calling again." - added
Input schema / properties / declaration / descriptionAdded value: +"Declaration as name=true|false, e.g. contains_returns=true." - added
Input schema / properties / gate / descriptionAdded value: +"gate_id to record together with status, e.g. data_integrity or temporal_integrity." - added
Input schema / properties / manifest / descriptionAdded value: +"Path to artifact.json (v0.2) that will receive the evidence." - added
Input schema / properties / report_ref / descriptionAdded value: +"Evidence reference for the report file, e.g. sha256:<hex> or a relative path." - added
Input schema / properties / review / descriptionAdded value: +"Human review outcome: approved or not_recorded." - added
Input schema / properties / reviewer / descriptionAdded value: +"Name of the human reviewer (auditable declaration, not authentication)." - added
Input schema / properties / status / descriptionAdded value: +"Gate outcome: pass, fail, warn or not_run." - added
Input schema / properties / tool / descriptionAdded value: +"Name of the tool that produced the evidence, e.g. imm, padj, lf, fl, qc."
- Changed
gov_check4 fields changed- added
Input schema / properties / gate_inputs / descriptionAdded value: +"Optional path to gate-inputs.json. Defaults to gate-inputs.json next to the manifest." - added
Input schema / properties / kind / descriptionAdded value: +"Optional kind override, e.g. research_conclusion. Only use when the manifest's declared kind is wrong; otherwise leave unset." - added
Input schema / properties / manifest / descriptionAdded value: +"Path to artifact.json (holdout v0.2 manifest) that records the research run." - added
Input schema / properties / policy / descriptionAdded value: +"Optional path to policy.yml. Defaults to policy.yml next to the manifest."
- Changed
gov_init3 fields changed- added
Input schema / properties / directory / descriptionAdded value: +"Directory to scaffold into. Created if missing (like mkdir -p)." - added
Input schema / properties / kind / descriptionAdded value: +"Artifact kind, which selects the required gates: research_conclusion, strategy_advice, public_copy or code." - added
Input schema / properties / name / descriptionAdded value: +"Optional human-readable artifact id. Defaults to a timestamped id."
- Changed
gov_report2 fields changed- added
Input schema / properties / manifest / descriptionAdded value: +"Path to artifact.json (v0.2) or a v1 manifest to assess." - added
Input schema / properties / policy / descriptionAdded value: +"Optional path to policy.yml. Defaults to policy.yml next to the manifest."
4 tool updates
v0.1.0- First observed
gov_attach - First observed
gov_check - First observed
gov_init - First observed
gov_report
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: gov_init scaffolds, gov_attach records evidence, gov_check executes gates and returns a verdict, and gov_report reads state without mutating. Descriptions explicitly contrast gov_report (read-only) against gov_check (fresh execution), removing the main risk of confusion. No overlapping or redundant tools.
All four tools follow the same gov_ prefix with a consistent short verb (init, attach, check, report). The pattern is perfectly predictable across the set.
Four tools map cleanly onto a linear workflow (scaffold → attach → decide → inspect), each earning its place with no filler. The count is well-scoped for the domain.
The toolset covers the full lifecycle init → attach → check → report, with no dead ends in the primary flow. Minor gaps exist (e.g. no explicit tool to list/inspect multiple artifacts or revoke a prior decision), but core workflows are covered.
Maintenance
Related MCP Connectors
Runtime AI governance: decision gates, human approval, hash-chained audit, compliance mapping.
Governed MCP: agent audit, provenance, deterministic checks, and receipt-backed FragGate execution.
Independent AI-governance measurement MCP. Free reads + x402 evidence. Measurement not cert.
MCP-native AI evaluation: rubric audits, eval suites, and proof reports for AI/LLM output.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceTamper-proof audit trail for AI decisions. 6 tools to record, verify, and export cryptographic proof chains via MCP.1Apache 2.0
- AlicenseAqualityDmaintenanceAudit infrastructure for AI agents to log consequential decisions (invoice, GL, anomaly) and verify attestations via MCP tools.6MIT
- AlicenseAqualityDmaintenanceTamper-evident audit logging for AI decisions. Three tools (record_decision, verify_decision, list_decisions) write to a regulator-grade ledger built on AWS S3 Object Lock with 7-year retention. Designed for EU AI Act Article 12 and FCA SS1/23 evidence requirements. Try zero-config: npx audit-ledger-mcp boots in sandbox mode against a public hosted tenant.331 npm1Apache 2.0

@vaibot/mcp-serverofficial
AlicenseAqualityDmaintenanceGovernance circuit-breaker MCP server that enables AI agents to request risk-based decisions, approve or deny actions, and finalize outcomes with full audit receipts.4MIT