Skip to content
LogoLogo

Generated — do not edit. Source of truth: crates/terp-rs/tools/hash-market/docs/e2e-capability-matrix.md. Edit there, then rebuild docs.

Hashmerchant e2e capability matrix

First-principles modular harness replacing a single “headstash e2e blob.”

Layers

LayerLocationNeeds Docker?What it proves
L0 in-processhash-market tests::suiteNotrees, oracle_bounds, kind separation, VE wire
L1 config contractict-rs hashmerchant_modular_matrixNoTOML generators for default vs elevated oracle
L2 sidecar + chainict-rs example hashmerchantYesAnvil → VE → HashRoot on-chain (Model A)
L3 bootstrap installict-rs example hashmerchant_bootstrap_ubuntuYesFresh Ubuntu → hm-support → runtime health/VE schema
L3+ client ingressict-rs example hashmerchant_client_ingress_e2e (milestone)YesClient → server island + DB Merkle VE + dual-path claims + optional Mode C price math
L3 oline shapeo-line parallel-stack e2eYesdeploy/upload/health shape (not full VE)

Run

# L0 — always run in CI
cd crates/terp-rs/tools/hash-market
cargo test -p hash-market --lib tests::suite
 
# L1 — ICT_MOCK safe
cd crates/ict-rs
just test-file hashmerchant_modular_matrix
 
# L2 — full pipeline (operator machine)
cargo run -p ict-rs --example hashmerchant --features full
 
# L3 — install packaging (B1–B5 + SANITY/EXT/B7/B8)
cargo run --example hashmerchant_bootstrap_ubuntu --features docker
# ICT_L3_REPORT=./hashmerchant_l3_report.json  # optional JSON report
# ICT_HM_RUNTIME=auto   # prefer local hash-market:local|mint when present
# ICT_HM_RUNTIME=full   # force real images
 
# Client ingress milestone (S1–S4 default; +S5 Mode C math)
cargo run --example hashmerchant_client_ingress_e2e --features docker
# ICT_INGRESS_REPORT=./hashmerchant_ingress_report.json
# ICT_INGRESS_PHASES=S1,S2,S3,S4,S5
# just client-ingress-milestone

Session freeze verify

Five-command matrix (L0 → L3 mock → ingress S1–S5 → loyalty Docker optional → zk-jwt offline):
see HANDOFFS.md § Verify matrix (session freeze).

LayerSoft / hardReport schema_version
L0 tests::suiteHardn/a (cargo)
L3 bootstrap mockHard1 in hashmerchant_l3_report.json
L3+ ingress milestone S1–S4(+S5)Hard product story1 in hashmerchant_ingress_report.json
Loyalty dual-path on-chainSoft / nightly goldn/a
zk-jwt offlineHard offlinen/a

just: from crates/ict-rsjust l3-bootstrap-mock · just client-ingress-pr1 · just client-ingress-milestone · just verify-hm-freeze (heavy=1 includes loyalty Docker).

Handoff: docs/bootstrap/hashmerchant-ict-bootstrap-e2e-handoff.md
B4/B5 full hash-market + product e2e ladder: docs/bootstrap/hashmerchant-b4-b5-full-runtime-and-product-e2e.md
Client→isolated server ingress (conductor over L3 + loyalty + zk-jwt + NFT): docs/bootstrap/hashmerchant-client-ingress-sequence.md
Multi-source design: x/hashmerchant/spec/10_multi_source_oracle.md (Model B after module P0).

L3 acceptance IDs

IDWhat
B1–B3hm-support prepare / install / whitelist self-test on Ubuntu
B4P-mint runtime health + data dir persist across restart
SANITYDense checks: config path, data dir, pid, logs, restart counters
SANITY-HC / VE / RST / LOG / CONChealth↔files; VE curl inside Ubuntu; pidfile restart; log growth; concurrent curls
B5P-sidecar /vote-extension schema
EXT-WL / EXT-WL-BAD / EXT-WL-PROOFwhitelist build; bad members fail-closed; proof for fixture addr
EXT-USB / EXT-USB-STRICTpackage-usb kit; scripts + SHASUMS layout
EXT-SMOKE / EXT-SMOKE-BADsmoke URL OK; wrong URL fail-closed
EXT-SWITCH / EXT-AUTH / EXT-CLIENTprofile switch w/o wipe; authenticate checklist; 2nd Ubuntu client attach
EXT-DEMO / EXT-FEE-DRYsoft: demo docs; feegrant dry-run (no chain)
B7Idempotent re-bootstrap (no wipe without flag)
B8Bad config fail-closed (profiles/P-bad.toml)
B6Optional Terp wire (L2 hashmerchant example)

L3 runtime modes

ModeEnvB4/B5 backendCadence
mock (default)unset / ICT_HM_RUNTIME=mockmock_runtime.pyevery PR
autoICT_HM_RUNTIME=autoprefer hash-market:local or :mint if present, else mockoperator
full (target)ICT_HM_RUNTIME=fullpinned hash-market:mint / :sidecar imagesnightly

See full-runtime doc for /ve path, feeder, and dual-image build.

Capability flags

trees                 — merkle whitelist (headstash claim surface)
oracle_bounds         — multi-source mid, role=bound_only (Tacit cUSD-like)
vote_extension        — ABCI++ root path (interop fabric)
content_distribution  — BUD+IPFS dual-index (opt-in; not default CI)
calendar_nostr        — Phase B: off-chain cid bind + NIP-52 egress (opt-in)
nostr                 — opt-in domain bus (not default matrix)
marketplace_inventory — Postgres inventory Merkle → Purchase buffer → Settle (loyalty parallel)
loyalty_rewards       — Postgres rewards Merkle → ClaimRewards dual-path (gold standard)

marketplace_inventory (loyalty parallel)

ICT harness for marketplace-mirror local-SKU purchase buffer + optional inventory Merkle attest. Delta design: crates/ict-rs/docs/MARKETPLACE_VS_LOYALTY_DELTA.md
Harness notes: crates/ict-rs/docs/marketplace_harness.md

L0 commands: leaf codec · buffer math (default 7) · oversell · UpdateStock · cancel auth (buyer|admin OK, seller REJECT).
Notes: Purchase uses local stock (hashmerchant root decorative until proof-gated restock); Nostr ingress stub / egress sketch only; Docker seller-cancel race offline-only (single key).

# L0 — offline leaf codec + buffer + oversell + cancel policy (no Docker)
cd crates/ict-rs
cargo run --example marketplace_inventory_offline
 
# L2 — Docker Postgres Merkle + P2–7 Agent A msgs (needs wasm + terp image)
MARKETPLACE_GAS_REPORT=./marketplace_gas_report.md \
  cargo run --example marketplace_inventory --features "docker hashmerchant"
 
# Compare with loyalty gold standard
cargo run --example loyalty_rewards --features "docker hashmerchant"
cargo run --example loyalty_rewards_zkjwt

content_distribution (L0)

cd crates/terp-rs
cargo test -p hash-market --lib content:: --features server
# cid parse/encode, dual_index_upload_meta_get_smoke, calendar bind, auth jwt

calendar_nostr (Phase B)

# L0 — bind + egress shape (no Docker)
cargo test -p hash-market --lib content::calendar --features server
cargo test -p hash-market --lib client::nostr::calendar_egress --features nostr
cargo test -p terp-scripts --test nostr_orch_suite
 
# L2 — Docker relay (+ optional local chain)
cargo test -p terp-scripts --test nostr_orch_suite -- --ignored --nocapture

Docs: docs/content-distribution.md, docs/PREP-BLOSSOM-S3-CALENDAR-NOSTR.md.

Design rules

  1. Modular — run oracle_demo() without trees; run trees_only() without prices.
  2. Default safe — elevated oracle TOML is opt-in (hash_market_config_toml_with_oracle_bounds).
  3. No mint — oracle scenarios assert role == "bound_only".
  4. Same language — ICT-RS HashMarketE2eCapability mirrors hash-market suite names.

Evolution from headstash e2e

OldNew
One Docker example focused on CW + ZK keysCapability matrix + optional Docker VE
Headstash trees implicitExplicit trees scenario
No pricingoracle_bounds + Connect-shaped multi-source
Monolithic pass/failPer-capability report (MatrixReport)