oh-agent/skill-add 0.1.0 —— 信任证据
信任证据(L3)—— 四层、四档、徽章×字段满射,以及每一条的离线复核动作。审读这一步不需要人上网页:同一份东西 agent 用一个调用就能取。
索引快照
- 快照版本
- 4
- 新鲜度
- fresh
- 过期时刻
- 2026-08-20T03:09:26Z
- 已签名
- 是
- 签名公钥 id
- 26a3d5d8e2be69dc8eb32bde563f761f
- 信任锚文档(字节面键)
- trust-root/sha256/7b/7b9223430a0b48f7d8a9423561611b24676770fbd356f460fb54e60a1b0d015c.json
快照是已签名的字节面对象(ADR-0003 D1.4):离线消费方 GET 到它与信任锚文档之后,可以在没有本站、没有 typed 面的条件下自己复核整棵目录。本页只是它的一次投影。
四层证据
| 层 | 档 | 怎么自己复核(离线) |
|---|---|---|
| T1 完整性 | attested | GET the object at byte_plane_object and recompute sha256 locally |
| T2 来源 | absent | GET the publisher bundle and the trust-anchor document, then verify the certificate chain and the pinned (identity, issuer) pair offline |
| T3 认证档 | attested | re-run the ruleset named in attested.certification.predicate.policy.ruleset against the same bytes and compare; the digest pins which rules were run |
| T4 后果 | absent | read the four axes from the declared block; if verify is declared, run its read-back yourself |
每一层都带一个可跑的复核动作:一个不能被独立复核的信任表述是徽章,不是证据(AN-4)。这些动作都不需要本站 —— 拿到字节面目录就能跑。
四档证据(结构分离,永不混排)
declared —— 作者自述
非权威 —— 发布者自己写的,Depot 原样承载、未做任何核实
publisher self-declared; carried verbatim and never synthesised (AN-5)
provenance
{
"party": "3p",
"publisher": "oh-agent",
"signature_state": "unsigned"
}consequence(后果四轴)
null
attested —— Depot 背书
权威 —— Depot 跑出来并签过,可离线复核(字段与复核动作见下)
publication(Depot 副署)
{
"byte_plane_key": "attestations/sha256/9d/9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d/depot-publication.v1.dsse",
"predicate": {
"artifact": {
"id": "oh-agent/skill-add",
"kind": "skill",
"version": "0.1.0"
},
"byte_plane": {
"artifact_object": "objects/sha256/9d/9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d",
"record_object": "objects/sha256/94/94b53b4e1c02bcee4d97a97ecf1c37292d3667cb4e1c12eb84e6d5367260ef6d",
"trust_anchors": "trust-root/sha256/7b/7b9223430a0b48f7d8a9423561611b24676770fbd356f460fb54e60a1b0d015c.json"
},
"components": [],
"digest": {
"sha256": "9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d"
},
"publisher": {
"declared": "oh-agent",
"identity_verified": false,
"oidc_issuer": null,
"signer_identity": null,
"signer_policy_version": null,
"transparency_log": null
},
"received_at": "2026-08-13T03:09:26Z",
"signature_state": "unsigned",
"snapshot_version": 4
},
"predicate_type": "https://atd.run/attestation/depot-publication/v1",
"signed_by": {
"key_id": "103846a1976f0a64e714c0c0ab4d08fe",
"key_provenance": "operator-supplied",
"role": "countersign"
},
"subject": {
"digest": {
"sha256": "9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d"
},
"name": "oh-agent/skill-add@0.1.0"
}
}certification(认证档流水线)
{
"byte_plane_key": "attestations/sha256/9d/9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d/depot-certification.v1.dsse",
"predicate": {
"aggregate_component_evidence_tier": null,
"artifact": {
"byte_plane_object": "objects/sha256/9d/9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d",
"digest": {
"sha256": "9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d"
},
"id": "oh-agent/skill-add",
"kind": "skill",
"version": "0.1.0"
},
"cert_tier": "Profile-Authored",
"cert_tier_evidence_grade": "attested",
"components": [],
"consequence_gap": {
"by_kind": {
"skill": {
"consequence_absent": 1,
"consequence_declared": 0,
"units": 1
}
}
},
"criteria": [
{
"id": "core/wire-conformance",
"method": "atd-conformance --category discovery + --category effect",
"state": "not_applicable",
"tier": "Profile-Core",
"why": "no unit of this artifact exposes an ATD wire of its own (the criterion measures a server); the artifact is consumed through the adopter's runtime"
},
{
"id": "authored/authoring-lint",
"method": "depot ingest lint: profile 8.6 SK3/SK4 + the F6 criteria applied to the declared consequence group + the static scan word list",
"state": "pass",
"tier": "Profile-Authored"
},
{
"id": "authored/device-conformance",
"method": "atd-conformance --category device",
"state": "not_applicable",
"tier": "Profile-Authored",
"why": "no unit of this artifact exposes an ATD wire of its own (the criterion measures a server); the artifact is consumed through the adopter's runtime"
},
{
"id": "certified/adopter-ci-discovery-conformance",
"method": "discovery conformance running in the adopter's own CI",
"state": "not_evaluated",
"tier": "Profile-Certified",
"why": "by definition this runs in the adopter's CI, outside the depot; the depot MUST NOT attest it (ADR-0003 D4.2)"
},
{
"id": "certified/adopter-validation-issue",
"method": "adopter-validation issue closed-verified",
"state": "not_evaluated",
"tier": "Profile-Certified",
"why": "a human governance act in the adopter's tracker; outside the depot and never attestable by it (ADR-0003 D4.2; AN-7 names the human step)"
}
],
"findings": [],
"policy": {
"profile_version": "atd-discovery-profile as pinned by this build's upstream rev (see Cargo.lock)",
"ruleset": {
"rules": [
{
"id": "SK3",
"source": "atd-discovery-profile §8.6 (description present, <= ~1024 chars)"
},
{
"id": "SK4",
"source": "atd-discovery-profile §8.6 (name unique within one source)"
},
{
"id": "skill-frontmatter",
"source": "oh-cli scan_skill_md (ADR-0004 D2.1 production leg)"
},
{
"id": "F6-reversibility",
"source": "atd doctor --authoring F6, applied to the declared consequence group"
},
{
"id": "F6-side-effect-scope",
"source": "atd doctor --authoring F6"
},
{
"id": "F6-verifiability-class",
"source": "atd doctor --authoring F6"
},
{
"id": "verify-answered",
"source": "ADR-0030 (open_loop is an answer, not an absence)"
},
{
"id": "static-scan",
"source": "oh-agent#127 skill-import-check word list (ADR-0004 D2.1)"
},
{
"id": "consequence-gap",
"source": "atd-discovery-profile W10 + PRD M5 (per-kind gap quantification)"
}
]
},
"ruleset_digest": "62d680c0599dba4526cd6dbf1491d28e5d5d90f1b94ec530c558e452695f8e68"
},
"time_verified": "2026-08-13T03:09:26Z",
"verifier": {
"id": "atd-depot",
"version": {
"atd_conformance": null,
"atd_doctor": null,
"depot": "0.0.0"
},
"version_absent_why": {
"atd_conformance": "requires a live server; ADR-0002 D2.5 excludes sandboxing and dynamic behaviour analysis, so the depot MUST NOT attest it (ADR-0003 D4.2) — a publisher-run report of this check is `declared`, never `attested`",
"atd_doctor": "the depot does not invoke `atd doctor` on an artifact: that lint eats a ToolDefinition, which an artifact does not have. The depot applies the same F6 criteria to the declared consequence group instead, and records those rules in policy.ruleset (see depot-server publish::lint)"
}
}
},
"predicate_type": "https://atd.run/attestation/depot-certification/v1",
"signed_by": {
"key_id": "5af107687c5e2ba81bd7baf5de02089f",
"key_provenance": "operator-supplied",
"role": "certification"
},
"subject": {
"digest": {
"sha256": "9deb4641aaf7f497cd4c849383d5982130ffc09e09661492ede23a5d123d7f2d"
},
"name": "oh-agent/skill-add@0.1.0"
}
}community —— 第三方
非权威 —— 第三方提交;MVP 期没有这个通道,因此这一块恒空
no third-party submission channel exists in the MVP; this block is present and empty rather than omitted, so that an empty non-authoritative region is distinguishable from one that was never rendered (ADR-0002 D3.8)
条目数:0
absent —— 缺席
缺席 —— 没有这一层证据;缺席被计数,不被推断、不被填默认值
- 缺席的层数
- 2
- 哪些层
- ["t2_provenance","t4_consequence"]
an absent layer is rendered as absent and counted; the depot never infers, defaults or summarises one into existence (AN-5)
撤回与有害判定(状态位)
撤回(yank)
未撤回 —— 这条索引记录上没有撤回状态位。
有害判定
无有害判定 —— 没有任何一方在此断言过这份字节有害。
两个状态位住在被签名的索引快照里(可变状态的唯一住处,ADR-0003 D1.4),自由文本理由住在字节面上一份写入即不可变的声明文档里。离线复核两步:验快照签名 → 取声明文档重算 sha256。
撤回可逆:恢复之后,下一份快照里这个对象就不在了——不留 lifted_at,也不留「已失效」标记;历史住在那两份永不删除的声明文档里。
徽章 × 字段满射表
| 信任表述 | 值 | 支撑它的字段(JSON Pointer) | 复核动作 |
|---|---|---|---|
t1_integrity | attested | /artifact/t1/grade/artifact/t1/digest/sha256/artifact/t1/byte_plane_object | GET the object and recompute sha256 |
t2_provenance | absent | /artifact/t2/grade/artifact/t2/signature_state/artifact/t2/signer | verify the publisher bundle against the pinned (identity, issuer) |
signature_state | unsigned | /artifact/t2/signature_state/artifact/attested/publication/predicate/publisher/identity_verified/artifact/attested/publication/signed_by/key_id | verify the depot publication attestation with the key named in the trust-anchor document |
cert_tier | Profile-Authored | /artifact/t3/cert_tier/artifact/attested/certification/predicate/criteria/artifact/attested/certification/predicate/policy/ruleset_digest | re-run the pinned ruleset and compare the per-criterion states |
t3_cert_evidence | attested | /artifact/t3/grade/artifact/attested/certification/signed_by/key_id | verify the certification attestation's DSSE signature offline |
t4_consequence | absent | /artifact/t4/grade/artifact/declared/consequence | read the four axes from the declared block and, if verify is declared, run the read-back |
key_provenance | operator-supplied | /artifact/attested/publication/signed_by/key_provenance/artifact/attested/certification/signed_by/key_provenance | compare the key_id against the depot_keys records in the trust-anchor document |
snapshot_freshness | fresh | /artifact/snapshot/freshness/artifact/snapshot/expires_at | compare expires_at against your own clock; a mirror that froze an old snapshot shows stale here |
snapshot_signed | 是 | /artifact/snapshot/signed/artifact/snapshot/key_id/artifact/snapshot/trust_anchors_object | verify the snapshot's detached signature over its signing bytes with the snapshot key |
yank_state | 未著录(absent) | /artifact/yank/artifact/snapshot/signed | verify the snapshot signature, then re-hash the statement object |
harm_state | 未著录(absent) | /artifact/harm/artifact/snapshot/signed | same two steps; a harm verdict is evidence, never an enforcement action |
gap_count | 2 | /artifact/absent/count/artifact/absent/layers | count the layers whose grade is absent and compare |
这张表就是 AN-4 的验收面:每个信任表述都要指得到同一份响应里解析得到的字段。门禁的 surjection 族逐 kind 跑的正是它。
attestation 体(要点名 predicateType 才给)
| predicateType | 有没有 | 取它的调用 |
|---|---|---|
https://slsa.dev/provenance/v1 | 否 | depot:trust.evidence {"id":"oh-agent/skill-add","predicate_type":"https://slsa.dev/provenance/v1","version":"0.1.0"} |
https://atd.run/attestation/depot-publication/v1 | 是 | depot:trust.evidence {"id":"oh-agent/skill-add","predicate_type":"https://atd.run/attestation/depot-publication/v1","version":"0.1.0"} |
https://atd.run/attestation/depot-certification/v1 | 是 | depot:trust.evidence {"id":"oh-agent/skill-add","predicate_type":"https://atd.run/attestation/depot-certification/v1","version":"0.1.0"} |
an attestation body is only returned when the caller names its predicate_type; there is deliberately no default, so a query can never pass merely because some other attestation happened to be attached (ADR-0003 D2.6)