Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
ebac81a
refactor(evidence): extract portable response verifier crate
jeremi Aug 4, 2026
d8bbeda
docs(evidence): name the verifier crate in the Version 1 boundary
jeremi Aug 4, 2026
88a5c18
fix(evidence): tighten verifier fixture fidelity and guard portability
jeremi Aug 4, 2026
29f0735
fix(evidence): fail the verifier portability check on search errors
jeremi Aug 4, 2026
3bc2445
chore(release): declare the verifier portability gate
jeremi Aug 4, 2026
d3bd1d4
fix(evidence): align verifier portability claims and internal bounds
jeremi Aug 4, 2026
5189001
chore: build jsonschema without default features
jeremi Aug 4, 2026
57f12eb
fix(evidence): strengthen redaction canary and portability prose
jeremi Aug 4, 2026
2f7723b
docs(relay): document the spdci schema reference constraint
jeremi Aug 4, 2026
3615c9f
feat(evidence): add relying-party client SDK crate
jeremi Aug 4, 2026
6d6f338
fix(evidence): tighten client preflight and problem mapping
jeremi Aug 4, 2026
1a3fa55
fix(evidence): report client transport failures faithfully
jeremi Aug 4, 2026
5599ea2
refactor(evidence): polish the client SDK surface for bindings
jeremi Aug 4, 2026
1126476
fix(evidence): close client diagnostic and test gaps
jeremi Aug 5, 2026
114d538
feat(evidence): acquire client tokens via private key JWT
jeremi Aug 5, 2026
43f0cdd
docs(evidence): align the version one product shape with the shipped …
jeremi Aug 5, 2026
ebcdba3
fix(evidence): give token acquisition failures a stable discriminant
jeremi Aug 5, 2026
f9719f2
fix(evidence): give every client failure a stable discriminant
jeremi Aug 5, 2026
ba9e013
fix(evidence): bound the cached credential lifetime
jeremi Aug 5, 2026
338a1e2
docs(evidence): correct the client token provider documentation
jeremi Aug 5, 2026
1f876be
docs: narrow the Mint dependency direction to runtime
jeremi Aug 5, 2026
c3cc27b
refactor(evidence): share the loopback harness in the client deployme…
jeremi Aug 5, 2026
41ba5a0
test(evidence): pin the token provider's media type and cache boundaries
jeremi Aug 5, 2026
a72a819
test(evidence): describe both abandoned service tasks alike
jeremi Aug 5, 2026
da9af0d
feat(evidence): bind the Evidence client for Node
jeremi Aug 5, 2026
9ad48f3
feat(evidence): surface TokenError's own kind on mapped errors
jeremi Aug 5, 2026
d0acad5
fix(evidence): catch panics at the Node binding's sync entry points
jeremi Aug 5, 2026
1c07fd2
feat(evidence): give Node callers structured error properties
jeremi Aug 5, 2026
7c6c2b1
fix(ci): keep a binding-only change out of the Evidence tutorial gate
jeremi Aug 5, 2026
1713367
fix(evidence): close the node binding's client.js bypass
jeremi Aug 5, 2026
996f346
feat(evidence): bind the Evidence client for Python
jeremi Aug 5, 2026
7cd007b
fix(evidence): tighten Python binding safety, docs, and idempotency
jeremi Aug 5, 2026
a368fd6
test(evidence): sharpen the Python binding's concurrency and canary c…
jeremi Aug 5, 2026
d5a6c83
test(evidence): tighten GIL-release measurement window
jeremi Aug 5, 2026
96aa127
test(evidence): set the Mint audit rotation threshold in the client f…
jeremi Aug 5, 2026
7ed38e0
chore(evidence): align the Node binding's package version with the wo…
jeremi Aug 5, 2026
30e6cb0
fix(evidence): keep subject bindings out of Debug renderings
jeremi Aug 5, 2026
2833fc3
fix(evidence): withhold base URL userinfo from the client config Debug
jeremi Aug 5, 2026
76f3bfa
fix(evidence): refuse an unusable asOfMillis through the Node error e…
jeremi Aug 5, 2026
4fa92a0
fix(evidence): correct the Python binding's error and panic documenta…
jeremi Aug 5, 2026
f22d107
docs: state the client boundary and the binding checks in the guidance
jeremi Aug 5, 2026
1663230
docs(evidence): name the syscall layers the portability gate denies
jeremi Aug 5, 2026
10a84bc
docs(evidence): cover the client crates in the Evidence gates and inv…
jeremi Aug 5, 2026
1c1fd0e
docs(site): complete the evidence-contracts job enumeration
jeremi Aug 5, 2026
07ba8c6
fix(relay): correct and test the SP DCI response schema contract
jeremi Aug 5, 2026
f400f54
feat(evidence): publish relying-party clients with development builds
jeremi Aug 6, 2026
86ce809
fix(evidence): search the verifier dependency tree without ripgrep
jeremi Aug 6, 2026
b4ab790
test(evidence): assert the development build's client packages
jeremi Aug 6, 2026
2d542eb
test(evidence): look up stub routes through a map
jeremi Aug 6, 2026
e3e7e17
fix(evidence): mark the Python client package as typed
jeremi Aug 6, 2026
ebfa7d0
fix(evidence): select the binding job from reverse dependents
jeremi Aug 6, 2026
0ab3134
fix(evidence): refuse an over-specified Node token config
jeremi Aug 6, 2026
4fb3344
fix(evidence): honor only the problem codes the contract registers
jeremi Aug 6, 2026
67ec1b3
fix(evidence): withhold a single definition for an ambiguous requirement
jeremi Aug 6, 2026
dbe5d14
fix(evidence): spend a cached client credential on a monotonic deadline
jeremi Aug 6, 2026
751b443
fix(evidence): bound the local verification policy the client writes
jeremi Aug 6, 2026
8be40f9
feat(evidence): let a caller ask whether the verifier can use a key set
jeremi Aug 6, 2026
177f745
fix(evidence): bound the Python binding's value conversion
jeremi Aug 6, 2026
4f61fac
fix(evidence): judge the client's configuration where the decision is…
jeremi Aug 6, 2026
af2aa00
test(evidence): cover the Python package shape a wheel installs
jeremi Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions .github/scripts/ci_changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,14 @@
"registry-manifest-core",
),
"relay": ("registry-relay",),
"evidence": ("registry-evidence", "registry-evidencectl"),
"evidence": (
"registry-evidence",
"registry-evidence-client",
"registry-evidence-client-node",
"registry-evidence-client-py",
"registry-evidence-verifier",
"registry-evidencectl",
),
"mint": ("registry-mint",),
"developer-tools": (
"registry-config-report",
Expand Down Expand Up @@ -71,9 +78,21 @@
}
)

# Binding crates (the Node and Python relying-party SDKs today; more may join
# them) stay in EVIDENCE_PACKAGES and the `evidence` shard, because their own
# source is covered by check-source-neutrality.sh, and that is what makes
# `evidence_contracts` run the neutrality check against them. A binding-only
# change does not, on its own, replay the docs Evidence tutorials: it touches
# none of a tutorial's shell commands or fixtures, so it is excluded here.
EVIDENCE_BINDING_PACKAGES = frozenset(
{"registry-evidence-client-node", "registry-evidence-client-py"}
)

# The gate also builds and runs `mint`, because one tutorial serves assertions
# to a caller holding a real Mint-issued token.
EVIDENCE_TUTORIAL_PACKAGES = EVIDENCE_PACKAGES | frozenset(SHARDS["mint"])
EVIDENCE_TUTORIAL_PACKAGES = (EVIDENCE_PACKAGES - EVIDENCE_BINDING_PACKAGES) | frozenset(
SHARDS["mint"]
)

ROOT_RUST_INPUTS = {
"Cargo.lock",
Expand Down Expand Up @@ -463,6 +482,11 @@ def classify(
for path in paths
)
editors = complete or any(path.startswith("editors/") for path in paths)
# Reverse dependents, not changed paths: both bindings are Cargo path
# dependents of the SDK and the verifier, so a change to either can move
# the native surface or the error envelope the packages wrap without
# touching a file inside a binding crate.
client_bindings = complete or bool(affected & EVIDENCE_BINDING_PACKAGES)

tutorial_infrastructure = any(
path
Expand Down Expand Up @@ -545,6 +569,7 @@ def classify(
"docs": docs,
"docs_archives": docs_archives,
"editors": editors,
"client_bindings": client_bindings,
"registryctl_tutorial": registryctl_tutorial,
"evidence_tutorial": evidence_tutorial,
}
Expand Down
34 changes: 34 additions & 0 deletions .github/scripts/test_ci_changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,40 @@ def test_evidence_code_and_product_contracts_select_its_shards_and_drift_gate(se
{"evidence", "mint"},
)

def test_binding_only_change_runs_contracts_but_not_the_tutorial_job(self) -> None:
# A Node-binding-only change has no bearing on any tutorial's shell
# commands or fixtures, so it must not replay them; but the binding's
# own source neutrality still needs the contracts gate to run.
outputs = classify(
self.workspace,
("crates/registry-evidence-client-node/src/lib.rs",),
)
self.assertFalse(outputs["evidence_tutorial"])
self.assertTrue(outputs["evidence_contracts"])
self.assertTrue(outputs["client_bindings"])
self.assertEqual(
{entry["name"] for entry in outputs["rust_matrix"]["include"]},
{"evidence"},
)

def test_an_sdk_or_verifier_change_also_runs_the_binding_job(self) -> None:
# Both bindings are Cargo path-dependents of the SDK and the verifier,
# so either can change the native surface or the error envelope the
# packages wrap. Selecting the job from changed paths alone would skip
# the npm suite, the type-drift check, and the Python unittest suite for
# exactly the changes most able to break them.
for path in (
"crates/registry-evidence-client/src/client.rs",
"crates/registry-evidence-verifier/src/lib.rs",
):
with self.subTest(path=path):
outputs = classify(self.workspace, (path,))
self.assertTrue(outputs["client_bindings"])
self.assertIn(
"registry-evidence-client-node", outputs["rust_packages"]
)
self.assertIn("registry-evidence-client-py", outputs["rust_packages"])

def test_current_contract_gates_replace_the_retired_notary_gate(self) -> None:
workflow = Path(".github/workflows/ci.yml").read_text(encoding="utf-8")
self.assertIn("\n evidence-contracts:\n", workflow)
Expand Down
40 changes: 40 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ jobs:
docs: ${{ steps.filter.outputs.docs }}
docs_archives: ${{ steps.filter.outputs.docs_archives }}
editors: ${{ steps.filter.outputs.editors }}
client_bindings: ${{ steps.filter.outputs.client_bindings }}
registryctl_tutorial: ${{ steps.filter.outputs.registryctl_tutorial }}
evidence_tutorial: ${{ steps.filter.outputs.evidence_tutorial }}
steps:
Expand Down Expand Up @@ -460,6 +461,9 @@ jobs:
- name: Enforce Evidence source-product neutrality
run: products/evidence/scripts/check-source-neutrality.sh

- name: Enforce Evidence verifier portability
run: products/evidence/scripts/check-verifier-portability.sh

relay-contracts:
name: Relay API contracts
needs: changes
Expand Down Expand Up @@ -1155,6 +1159,41 @@ jobs:
cargo check --locked --target wasm32-wasip2 --manifest-path editors/zed/Cargo.toml
cmp LICENSE editors/zed/LICENSE

client-bindings:
name: Evidence client bindings
needs: changes
if: needs.changes.outputs.client_bindings == 'true'
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
with:
fetch-depth: 0
submodules: false

- name: Setup Node
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
with:
node-version: 22.12.0
cache: npm
cache-dependency-path: crates/registry-evidence-client-node/package-lock.json

- name: Build and test the Node binding
working-directory: crates/registry-evidence-client-node
run: |
npm ci
npm run build:debug
npm test
npm run check:types
cmp ../../LICENSE LICENSE

- name: Build and test the Python binding
working-directory: crates/registry-evidence-client-py
run: |
cargo build --locked -p registry-evidence-client-py --lib --features registry-evidence-client-py/extension-module
python3 -m unittest discover -s tests/python -v
cmp ../../LICENSE LICENSE

ci-result:
name: CI result
if: always()
Expand All @@ -1173,6 +1212,7 @@ jobs:
- evidence-tutorials
- docs
- editor-extensions
- client-bindings
runs-on: ubuntu-24.04
env:
CI_JOB_RESULTS: ${{ toJSON(needs) }}
Expand Down
Loading
Loading