AssetCore Interop Runbook
Access Notice (Private Dependency)
This runbook requires private AssetCore repo access and the AssetCore starter-pack Docker image bundle. These assets are not included in the OSS Decision Gate repository.
At a Glance
What: Validate Decision Gate <-> AssetCore interoperability Why: Ensure AssetCore evidence integrates correctly with DG gates Who: Integration engineers, test operators Prerequisites: Docker (live mode), AssetCore repo access, Decision Gate CLI built
Fixture vs Live Mode
Deterministic Offline Fixtures
- Uses a provider stub with a fixture map.
- Fully deterministic and fast.
Live Mode (Integration)
- Runs AssetCore services in Docker.
- Exercises real MCP calls and network paths.
Anchor Policy
Decision Gate enforces anchor rules via config, not the scenario:
[anchors]
[[anchors.providers]]
provider_id = "assetcore_read"
anchor_type = "assetcore.anchor_set"
required_fields = ["assetcore.namespace_id", "assetcore.commit_id", "assetcore.world_seq"]
Evidence anchors: anchor_value is a string containing canonical JSON.
Example EvidenceResult snippet:
{
"evidence_anchor": {
"anchor_type": "assetcore.anchor_set",
"anchor_value": "{\"assetcore.namespace_id\":1,\"assetcore.commit_id\":\"c123\",\"assetcore.world_seq\":42}"
}
}
Offline Fixture Validation (Recommended)
cargo test -p system-tests \
--features system-tests \
--test providers \
-- \
--exact assetcore_integration::assetcore_interop_fixtures
What happens:
- Provider stub loads
system-tests/tests/fixtures/assetcore/interop/fixture_map.json. - DG evaluates gates using fixture evidence.
Live Mode (AssetCore Docker)
Step 1: Load AssetCore Images
cd <ASSETCORE_REPO_ROOT>
starter-pack/scripts/load_images.sh --bundle starter-pack/docker-images
Step 2: Start AssetCore Stack
docker compose \
--env-file starter-pack/docker/images.env \
-f starter-pack/docker/docker-compose.yml \
up -d
Step 3: Start Decision Gate MCP Server
cargo run -p decision-gate-cli -- \
serve \
--config system-tests/tests/fixtures/assetcore/decision-gate.toml
Relevant fixture config (exact fields):
[server]
transport = "http"
bind = "127.0.0.1:8088"
[[providers]]
name = "assetcore_read"
type = "mcp"
url = "http://127.0.0.1:9000/mcp"
allow_insecure_http = true
capabilities_path = "system-tests/tests/fixtures/assetcore/providers/assetcore_read.json"
Step 4: Run Interop Evaluation
cargo run -p decision-gate-cli -- \
interop eval \
--mcp-url http://127.0.0.1:8088/rpc \
--spec system-tests/tests/fixtures/assetcore/interop/scenarios/assetcore-interop-full.json \
--run-config system-tests/tests/fixtures/assetcore/interop/run-configs/assetcore-interop-full.json \
--trigger system-tests/tests/fixtures/assetcore/interop/triggers/assetcore-interop-full.json
Step 5: Tear Down AssetCore Stack
docker compose \
--env-file starter-pack/docker/images.env \
-f starter-pack/docker/docker-compose.yml \
down
Refreshing Fixtures
When AssetCore contracts change, regenerate fixtures from the AssetCore repo and copy them into this repo:
cp <ASSETCORE_GENERATED_DIR>/decision-gate/interop/fixture_map.json \
system-tests/tests/fixtures/assetcore/interop/fixture_map.json
cp <ASSETCORE_GENERATED_DIR>/decision-gate/providers/assetcore_read.json \
system-tests/tests/fixtures/assetcore/providers/assetcore_read.json
Troubleshooting
AssetCore MCP connection refused
- Verify AssetCore MCP adapter is running.
- Check the provider URL in the Decision Gate config (
http://127.0.0.1:9000/mcp).
Anchor validation failures
- Confirm anchor policy under
[anchors]. - Ensure
anchor_valueis a string containing canonical JSON with required fields.
Notes
- Interop fixtures use deterministic timestamps (no wall clock).
- Interop fixtures in this repo are ASCII-only; keep them that way for deterministic diffs.
Glossary
Anchor: External reference proving evidence provenance. Fixture Map: JSON mapping from queries to deterministic evidence results. Interop: Interoperability validation between DG and AssetCore.