Skip to content

Commit eae59ed

Browse files
fix(verify): distinguish an unreadable diff from trigger no_match (#340)
* fix(verify): distinguish an unreadable diff from trigger no_match `verify --preview` collapsed every diff-acquisition failure into one message, then evaluated the trigger catalog against the empty inputs that failure left behind — publishing `skip_reason: "no_match"` with the rationale "nothing in this PR signals a tool-surface change" about a PR it had never read. The control result stayed fail-closed, but the explanation invited exactly the wrong conclusion. On a workspace with no manifest the failure was not reported at all: both diff-failure branches were gated on `manifest_present`, so a shallow or blobless clone of an un-adopted repository — the normal shape of first contact — fell through to "Shipgate is not configured in this workspace", with the Git error visible nowhere but `base_notes`. Three changes, at the three layers the defect actually spans. Diff acquisition is classified rather than flattened. `not_attempted`, `refs_missing`, `merge_base_missing`, `objects_missing`, `metadata_limit_exceeded`, `body_limit_exceeded`, `git_timeout`, and `git_failed` are read off Git's own diagnostic (stderr is now piped and drained under a small cap instead of discarded) and travel on a new `verifier.json` `diff_status` block with a bounded, path-redacted excerpt, the precise repair, and whether fetching can perform it. Metadata and body are collected separately, so a body that cannot be read no longer discards the changed paths that were read successfully — a blobless clone answers `--name-status` in full, and those paths are exactly what says a PR touches an agent surface. The trigger evaluator gained the state it was missing. `input_status` and `evaluation_status`, with `should_run`, `run_shipgate`, `skip`, and `skip_reason` all `null` when the inputs were not fully read. The asymmetry is deliberate: rule matching is monotone in the evidence, so a run verdict reached from partial evidence stays sound and is still published, while any skip verdict is withheld. The stop block, which reasons over the very path evidence that is missing, is reported as not evaluable. And an unreadable diff now outranks every adoption route in preview, manifest or not, routing `merge_base_missing`/`objects_missing` to deepening history or hydrating partial-clone objects rather than to review. Trigger catalog schema 0.2 -> 0.3; verifier schema 0.6 -> 0.7 (v0.6 stays a frozen, readable reference). `contract_version` and every other schema counter are unchanged. Closes #308 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(verify): address review — split unrelated histories, keep partial evidence Four contract inconsistencies from the engineering review on #340. **Unrelated histories were routed into an unrecoverable fetch loop.** Git reports two different failures identically as "no merge base": a shallow checkout that truncated a merge base which does exist, and two roots that share no ancestor at all. Only the first is repairable by fetching, and the second was being sent to `fetch_base` forever. `git rev-parse --is-shallow-repository` discriminates them exactly, so the reason splits: `merge_base_missing` (shallow — deepen, `fetch_repairable: true`) and the new `unrelated_histories` (no fetch can create an ancestor — confirm the base ref, routed to a human). A failed shallow probe is neither and stays `git_failed` rather than asserting a cause it cannot establish. A regression test deepens a real shallow clone and proves the diff then reads clean, so the remediation is the one that actually works. **Partial worktree evidence was collected and then dropped.** When `working_tree_context` raised, the handler recorded the classified reason but never merged the paths the failed collector had already read, so `base_notes` said the paths were collected while `changed_files` was empty and a changed `tools/new_mcp.json` lost its path-rule match. The paths and any text now merge into the accumulators before the artifact is built. The untracked-path inventory also moves ahead of the body read: it is cheap metadata independent of the body, and a brand-new capability file appears in no `git diff` at all, so collecting it afterwards meant a body failure dropped it entirely. **Preview could contradict its own published verdict.** Partial evidence can still carry a sound run verdict — a matched path rule needs no diff body — and the evaluator publishes it deliberately. The failure branch nevertheless printed "no relevance verdict was reached" as both `headline` and `control.reason` next to `should_run: true`. It now branches on the trigger result and says relevance is established while the full diff still needs recovering. **The agent-facing surfaces omitted that exception.** SKILL.md (all three copies), the relevance prompt (all four), and AGENTS.md said every incomplete diff implies `not_evaluated`/`null`, which would have consumers override a valid run verdict. They now state the monotonicity rule that STABILITY.md already documented, and carry the new reason token. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(verify): make diff_status enforced, and consistent with its own routing Four contract inconsistencies from the second engineering review on #340. **`diff_status` was documented as always emitted and enforced nowhere.** Both the model and `_build_verifier` defaulted it to `None`, so a current `verifier_schema_version: "0.7"` payload could drop the input-health block entirely and still validate — indistinguishable from one that read its diff cleanly, which is the single claim this field exists to prevent. It is now a required, non-null field on the model and in the generated v0.7 schema, and `_build_verifier` requires its caller to supply one. The nullable representation is confined to the compatibility path: a pre-v0.7 artifact normalizes to `VerifierDiffStatus.unknown()`, a new fourth completeness value that names exactly what such an artifact recorded — nothing. Like every value other than `complete` it withholds permission to read a negative trigger verdict. `fetch_repairable` is now also structurally checked against the reason, so no artifact can advertise a fetch as the repair for a failure a fetch cannot touch. **The repair action was derived incrementally, not from the reported status.** When the committed diff failed fetch-repairably and the worktree then failed deterministically, `_least_complete` selected the worktree failure for `diff_status` while an `or` preserved the earlier `fetch_base` action — an artifact carrying `fetch_repairable: false` beside an authorized fetch, which is the loop the classification exists to prevent. Failures now accumulate with their repair targets and `_worst_diff_failure` selects one, breaking ties toward the failure a fetch cannot repair; the action and the headline are both derived from that single selection. **The failed-verification headline contradicted the control route.** The branch supplied no headline override, so `_verifier_headline` mapped every failed/unknown scan to "human review required" while control said `agent_action_required` with `next_action: fetch_base` and `human_review.required: false`. Both now come from the same classified failure. **Not every run verdict is attributable to diff paths.** In an adopted repository `TRIGGER-EXISTING-MANIFEST-PRESENT` force-runs on the manifest alone, with `changed_files: []`, and the preview headline nevertheless claimed the paths it read showed a capability surface. It now separates rules matched on the change set from the force-run rule, and the skill mirrors, prompts, AGENTS.md, STABILITY.md, and the agent contract all point readers at `matched_rules` before attributing the verdict.
1 parent 23c4931 commit eae59ed

53 files changed

Lines changed: 5029 additions & 213 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.well-known/agents-shipgate.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@
180180
"agent_boundary_result_schema_path": "docs/agent-boundary-result-schema.v1.json",
181181
"report_schema_version": "0.34",
182182
"packet_schema_version": "0.12",
183-
"verifier_schema_version": "0.6",
183+
"verifier_schema_version": "0.7",
184184
"verify_run_schema_version": "shipgate.verify_run/v3",
185185
"verification_plan_schema_version": "shipgate.verification_plan/v1",
186186
"verification_unit_result_schema_version": "shipgate.verification_unit_result/v1",
@@ -279,7 +279,7 @@
279279
"host_grants_inventory_schema_version": "0.2",
280280
"host_grants_baseline_schema_version": "0.2",
281281
"host_grants_drift_schema_version": "0.2",
282-
"trigger_catalog_schema_version": "0.2",
282+
"trigger_catalog_schema_version": "0.3",
283283
"capability_standard_version": "0.5",
284284
"governance_benchmark_catalog_schema_version": "0.2",
285285
"governance_benchmark_result_schema_version": "0.2",
@@ -441,7 +441,7 @@
441441
"agent_result": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/agent-result-schema.v2.json",
442442
"agent_boundary_result": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/agent-boundary-result-schema.v1.json",
443443
"codex_boundary_result": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/codex-boundary-result-schema.v2.json",
444-
"verifier": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/verifier-schema.v0.6.json",
444+
"verifier": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/verifier-schema.v0.7.json",
445445
"verify_run": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/verify-run-schema.v3.json",
446446
"verification_plan": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/verification-plan-schema.v1.json",
447447
"verification_unit_result": "https://raw.githubusercontent.com/ThreeMoonsLab/agents-shipgate/main/docs/verification-unit-result-schema.v1.json",

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ agents-shipgate trigger --base origin/main --head HEAD --json
315315
agents-shipgate trigger --list-rules --json
316316
```
317317

318-
The command emits a stable JSON verdict: `should_run` (alias of `run_shipgate`), `force_run`, `dry_run_recommended`, `skip_reason`, `matched_rules`, `changed_files`, and `diff_tokens`. The developer entry point `python -m agents_shipgate.triggers shipgate.yaml prompts/refund.md` is preserved.
318+
The command emits a stable JSON verdict: `should_run` (alias of `run_shipgate`), `force_run`, `dry_run_recommended`, `skip_reason`, `matched_rules`, `changed_files`, `diff_tokens`, plus `input_status` and `evaluation_status` (catalog schema `0.3`). When the diff could not be read in full, a *skip* verdict is withheld: `evaluation_status` is `not_evaluated` and `should_run`/`run_shipgate`/`skip`/`skip_reason` are `null`, so an unread diff is never reported as `no_match`. A *run* verdict is still published, because rule matching is monotone — evidence that already matched cannot be un-matched by the bytes that are missing — and it arrives as `evaluation_status: evaluated` with `should_run: true`. That evidence may be a rule matched on the change set or `force_run` from a manifest that is present regardless of the diff, so read `matched_rules` before attributing it. Branch on `evaluation_status`, not on `should_run` alone. The developer entry point `python -m agents_shipgate.triggers shipgate.yaml prompts/refund.md` is preserved.
319319

320320
**Stop conditions.** Stop and do not run `init` only when **all** of these hold:
321321

CHANGELOG.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,44 @@
22

33
## Unreleased
44

5+
- **An unreadable PR diff is no longer reported as "nothing here is
6+
agent-related."** `verify --preview` collapsed every diff-acquisition failure
7+
into one message, then evaluated the trigger catalog against the empty inputs
8+
that failure left behind — publishing `skip_reason: "no_match"` with the
9+
rationale *"nothing in this PR signals a tool-surface change"* about a PR it
10+
had never read. The top-level control result stayed fail-closed
11+
(`merge_verdict: "unknown"`), but the explanation invited exactly the wrong
12+
conclusion, and on an unconfigured workspace the failure was not reported at
13+
all: both diff-failure branches were gated on a manifest being present, so a
14+
shallow or blobless clone of an un-adopted repository — the normal shape of
15+
first contact — fell through to *"Shipgate is not configured in this
16+
workspace"* with the Git error visible nowhere but `base_notes`. Three
17+
things changed. Diff acquisition is now classified rather than flattened:
18+
`not_attempted`, `refs_missing`, `merge_base_missing`,
19+
`unrelated_histories`, `objects_missing`, `metadata_limit_exceeded`,
20+
`body_limit_exceeded`, `git_timeout`, and `git_failed` are read off Git's own
21+
diagnostic — including the two causes Git reports identically as "no merge
22+
base", a shallow checkout that deepening repairs versus two roots that no
23+
fetch can ever join — and travel on the new
24+
`verifier.json` `diff_status` block together with a bounded, path-redacted
25+
excerpt and the precise repair — deepen history, hydrate partial-clone
26+
objects (verification sets `GIT_NO_LAZY_FETCH=1`, so Git will not fetch them
27+
implicitly), or take it to a human when fetching cannot help. Metadata and
28+
body are collected separately, so a diff whose body cannot be read no longer
29+
discards the changed paths that were read successfully; a blobless clone
30+
answers `--name-status` in full, and those paths are exactly what says a PR
31+
touches an agent surface. And the trigger evaluator gained the state it was
32+
missing: `input_status` and `evaluation_status`, with `should_run`,
33+
`run_shipgate`, `skip`, and `skip_reason` all `null` when the inputs were not
34+
fully read. The asymmetry is deliberate — rule matching is monotone in the
35+
evidence, so a *run* verdict reached from partial evidence stays sound and is
36+
still published, while any *skip* verdict is withheld. Trigger catalog schema
37+
`0.2 → 0.3` (nullable verdict fields, the two new fields, and the new
38+
`next_action.kind: "input_required"`); verifier schema `0.6 → 0.7`
39+
(`diff_status`; v0.6 remains a frozen reference and is still readable).
40+
`contract_version`, `report_schema_version`, and every other schema counter
41+
are unchanged.
42+
543
- **Google ADK repositories that share one tool between agents can be scanned
644
again.** Binding the same `FunctionTool` to a coordinator and its sub-agents
745
is the canonical ADK multi-agent shape — it is what `google/adk-samples`

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ artifacts — in read order:
652652

653653
- **`agents-shipgate-reports/verification-receipt.json`** — the **first artifact a coding agent validates**: a terminal content-addressed closure over the exact request (including `verification-input.diff`), worker result, decision, and artifact set. It is written last; use `agents-shipgate verification reproduce` to validate every referenced hash.
654654
- **`agents-shipgate-reports/agent-handoff.json`** — the compact `shipgate.agent_handoff/v6` object. Lead with `control.state`, then `gate.merge_verdict`; it projects the same request, decision, and authorization evaluation and does not introduce a second verdict.
655-
- **`agents-shipgate-reports/verifier.json`** — the **authoritative PR/control evidence substrate** (`verifier_schema_version: "0.6"`). A coding agent switches on `control.state`, then reads `authorization`, `merge_verdict` (`mergeable | human_review_required | insufficient_evidence | blocked | unknown`), `can_merge_without_human`, `control.next_action`, and `fix_task` when producing reviewer evidence for an agent-capability PR. Only an accepted signed authorization evaluation may expose an exact reviewed command; the release verdict remains unchanged. Local control comes from `shipgate check --format agent-boundary-json` and `shipgate.agent_boundary_result/v1`. See [`docs/agent-contract-current.md`](docs/agent-contract-current.md) for the field contract.
655+
- **`agents-shipgate-reports/verifier.json`** — the **authoritative PR/control evidence substrate** (`verifier_schema_version: "0.7"`). A coding agent switches on `control.state`, then reads `authorization`, `merge_verdict` (`mergeable | human_review_required | insufficient_evidence | blocked | unknown`), `can_merge_without_human`, `control.next_action`, and `fix_task` when producing reviewer evidence for an agent-capability PR. Only an accepted signed authorization evaluation may expose an exact reviewed command; the release verdict remains unchanged. Local control comes from `shipgate check --format agent-boundary-json` and `shipgate.agent_boundary_result/v1`. See [`docs/agent-contract-current.md`](docs/agent-contract-current.md) for the field contract.
656656
- **`agents-shipgate-reports/verify-run.json`** — the `shipgate.verify_run/v3` projection embedding the exact verification plan, executor, unit-result IDs, decision ID, outcome, and artifact paths. Its deprecated `run_id` is an exact alias of `request_id`.
657657
- **`agents-shipgate-reports/attestation.json`** + **`agents-shipgate-reports/org-evidence-bundle.json`** — optional organization-governance projections over the same verifier/report artifacts. They are ledger inputs for platform teams, not release gates; `report.json.release_decision.decision` remains the decision engine.
658658
- **`agents-shipgate-reports/host-grants.json`** + **`agents-shipgate-reports/org-status.json`** — optional fleet-governance artifacts from `audit --host --out` and `org status --json`, useful for host-grant drift, policy-pack pin state, and exception hygiene.

STABILITY.md

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,42 @@ for reproducible CI.
1313

1414
---
1515

16+
<a id="migration-note-unreleased-diff-status"></a>
17+
18+
## Migration Note: unreleased — diff input health
19+
20+
Verifier schema `0.6 → 0.7` and trigger catalog `0.2 → 0.3`. `contract_version`
21+
stays at `19`; no CLI surface changed.
22+
23+
`verifier.json` gains a top-level `diff_status` block that reports whether the
24+
compared change set was actually read: `completeness` (`complete` / `partial` /
25+
`unavailable`), a `reason` token (`not_attempted`, `refs_missing`,
26+
`merge_base_missing`, `unrelated_histories`, `objects_missing`,
27+
`metadata_limit_exceeded`, `body_limit_exceeded`, `git_timeout`,
28+
`git_failed`), a bounded path-redacted `detail`, the
29+
`remediation`, and `fetch_repairable`. Verifier v0.6 remains a frozen reference
30+
and its artifacts still parse.
31+
32+
The trigger evaluator gains `input_status` and `evaluation_status`, and
33+
`should_run`, `run_shipgate`, `skip`, and `skip_reason` become nullable.
34+
**Consumers that switch on `should_run` must handle `null`**: it means the diff
35+
was not read in full, so no verdict exists. Treating `null` as falsy is safe —
36+
it routes to "do not claim this PR is irrelevant" — but reporting it as "skip"
37+
is not. `next_action.kind` gains `"input_required"`; treat unrecognized kinds as
38+
"no command is authorized".
39+
40+
Before this change, a shallow clone with no reachable merge base and a partial
41+
clone with unfetched blobs both surfaced as one message, and the trigger then
42+
evaluated the empty inputs those failures left behind and reported
43+
`skip_reason: "no_match"` — "nothing in this PR signals a tool-surface change" —
44+
about a PR the verifier never read. On a workspace without `shipgate.yaml` the
45+
failure was not surfaced at all: preview routed to "Shipgate is not configured
46+
in this workspace". Both are fixed, and a diff whose body cannot be read now
47+
keeps the changed paths that were collected successfully instead of discarding
48+
them.
49+
50+
---
51+
1652
<a id="migration-note-0-16-0b7"></a>
1753

1854
## Migration Note: 0.16.0b7
@@ -595,6 +631,9 @@ Stable JSON fields:
595631
control contract vocabulary.
596632
- `verifier_schema_version` — schema version for
597633
`agents-shipgate-reports/verifier.json`.
634+
- `trigger_catalog_schema_version` — schema version of the published trigger
635+
catalog (`docs/triggers.json`) and, with it, of the run/skip verdict the
636+
evaluator emits.
598637
- `verify_run_schema_version` — schema version for
599638
`agents-shipgate-reports/verify-run.json`.
600639
- `human_authorization_request_schema_version`,
@@ -1300,17 +1339,38 @@ release decision. That action may be `detect`/`initialize` for
13001339
relevant unconfigured repos, or `verify` for configured repos. Use it as the
13011340
first touch on a repo or PR before committing to a full scan.
13021341

1303-
`verifier.json` is governed by [`docs/verifier-schema.v0.6.json`](docs/verifier-schema.v0.6.json).
1304-
Verifier v0.1 through v0.5 remain frozen references. It remains an orchestration artifact: `release_decision.decision` in
1342+
`verifier.json` is governed by [`docs/verifier-schema.v0.7.json`](docs/verifier-schema.v0.7.json).
1343+
Verifier v0.1 through v0.6 remain frozen references. It remains an orchestration artifact: `release_decision.decision` in
13051344
`report.json` is still the only release gate. Release and merge fields remain
13061345
mirrors or deterministic projections of report data; the v0.6 authorization
1307-
evaluation is an operational overlay that cannot change them. Stable additive
1346+
evaluation and the v0.7 `diff_status` block are operational overlays that
1347+
cannot change them. Stable additive
13081348
fields a consumer may read:
13091349

13101350
- `control` — the schema-enforced `complete | agent_action_required |
13111351
human_review_required` operational projection. The same serialized object is
13121352
emitted by verifier, handoff, and verify-run.
13131353
- `execution``"not_run" | "succeeded" | "skipped" | "failed"`.
1354+
- `diff_status` (v0.7+) — how completely the compared change set was read, and
1355+
why not when it was not. `completeness` is `"complete" | "partial" |
1356+
"unavailable"`; `reason` is `null` exactly when `completeness` is
1357+
`"complete"`, and otherwise one of `not_attempted`, `refs_missing`,
1358+
`merge_base_missing`, `unrelated_histories`, `objects_missing`,
1359+
`metadata_limit_exceeded`, `body_limit_exceeded`, `git_timeout`,
1360+
`git_failed`. `merge_base_missing` and `unrelated_histories` are
1361+
deliberately distinct: the first is a shallow checkout that truncated a
1362+
merge base which does exist, and deepening restores it; the second is two
1363+
roots with no common ancestor, which no fetch can create — `fetch_repairable`
1364+
is the field to branch on. `detail` is a bounded, path-redacted excerpt of
1365+
Git's own diagnostic; `remediation` names the repair; `fetch_repairable`
1366+
says whether making refs or objects available locally can fix it.
1367+
**`"complete"` is the only value that licenses reading a negative `trigger`
1368+
result.** Anything else means the evidence the verdict would rest on was
1369+
missing — it is never evidence that a PR is unrelated to agent capabilities.
1370+
`null` means the artifact predates v0.7 and carries no input-health
1371+
evidence, which a consumer must treat as unknown, never as complete. New
1372+
`reason` values may be added additively; treat an unrecognized reason as
1373+
"the diff was not read in full".
13141374
- `static_analysis_only`, `runtime_behavior_verified`, and
13151375
`static_verdict_disclaimer` — locked to `true`, `false`, and the canonical
13161376
static-only disclaimer. When an embedded release decision is present, the
@@ -1357,7 +1417,17 @@ fields a consumer may read:
13571417
context, not as the controller's primary verdict.
13581418
- `mode``"advisory"` / `"strict"` / `"skipped"` / `"preview"`.
13591419

1360-
`verifier.json` also carries `trigger` (the run/skip evaluation), `base_status`,
1420+
`verifier.json` also carries `trigger` — the run/skip evaluation, catalog
1421+
schema `0.3`. Read `trigger.evaluation_status` before `trigger.should_run`:
1422+
when it is `"not_evaluated"`, `should_run`, `run_shipgate`, `skip`, and
1423+
`skip_reason` are all `null` because the diff was not read in full (see
1424+
`diff_status`), and `next_action.kind` is `"input_required"`. `skip_reason` is
1425+
one of `stop_conditions`, `skip_rule`, `dry_run_only`, `no_match` — and
1426+
`no_match` is never emitted for inputs that were not fully read. A `run`
1427+
verdict *is* still published from partial evidence: rule matching is monotone,
1428+
so more evidence can only add matches. `matched_rules` says what carried it —
1429+
a `force_run` match rests on the manifest being present, not on anything the
1430+
diff showed. It also carries `base_status`,
13611431
`head_status`, `base_ref`, `head_ref`, `changed_files`, `base_notes`, the full
13621432
embedded `release_decision`, and an `artifacts` map
13631433
(`{verifier_json, pr_comment, report_json, report_markdown, report_sarif,

adoption-kits/claude-code-skill/.agents-shipgate-kit-metadata.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"e45f9d385f0e7744a5731694f337952682e1849e97be2d0a488ca3cff9db5792",
3737
"98ba22d7518ae4635ed109fd187323da0541281061dd4f259ac7fdb950c7b185",
3838
"02e780f5a1506d948e4c1d77f6ee4c6b4193227a4fd2ced081847d1fb2e5fbd0",
39-
"bc5cd31a5c4d4f6a1ebf6a04db3f80480e7cc5f9ab2b7a6f7e3f62e8ddfc3937"
39+
"bc5cd31a5c4d4f6a1ebf6a04db3f80480e7cc5f9ab2b7a6f7e3f62e8ddfc3937",
40+
"58ea3b6bba89078ec54d6b5493ffebf9250d9619fbacef5090285b009e58cdcd"
4041
],
4142
"prompts/add-shipgate-to-repo.md": [
4243
"ea3c37cfbbd42c40d164abfe21d468a3a5550d5384125f94a53c947dea6b4b2a",
@@ -83,7 +84,8 @@
8384
"8d1540095101cd7ff3aec4ba998ced5c135cdbdb71637ad0c4e5d42fc6ec9ab7",
8485
"a8ee5f93cab1017c623075c39c1c5bdc639855c37e588e1c9190ab963bb50446",
8586
"8f408aed05cb85e06c9f8bb13ee189131eeccfa66fa2c1119e802c43ae97f19c",
86-
"686ab73c76936dee6290716d197c97bf77893534654157dc01274e7aeb32fde7"
87+
"686ab73c76936dee6290716d197c97bf77893534654157dc01274e7aeb32fde7",
88+
"370a81cf1c35212584702ca89c5476f3cd6c19aaaf8b4bb9f57c18476f0d13ef"
8789
]
8890
},
8991
"bootstrap_legacy_sha256": {

0 commit comments

Comments
 (0)