Repository navigation
feat(antd, sdks): SHA-256 from uploads and on manifest entries (DO NOT MERGE until the ant-client release with #229) - #347
Nic-dorman wants to merge 6 commits into
Conversation
…ies (V2-1564) WIP: SDK stubs and docs follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…them (V2-1564) Swift, Elixir, Python, Dart and Ruby stubs regenerated on Linux with each script's pinned tools; only data/files/upload change. Kotlin proto copies synced. OpenAPI and llms docs gain the sha256 fields. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…6 work This keeps the SHA-256 work stacked on V2-1570, which now sits on the pointer API (#326). The merge had no conflicts. The ant-core dev pin below still applies to the whole tree, so the pointer code is built against it here as well. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ds (V2-1564) The sha256 fields added to data.proto, files.proto and upload.proto were regenerated for the other SDKs, but not in antd-rust's committed generated code, so its proto drift test failed (Check (antd-rust)). Regenerated with `ANTD_REGEN_PROTO=1 cargo test --test proto_drift`, using protoc 25.3. The only change is the `sha256` field on PutPublicDataResponse, PutDataResponse, FinalizeUploadResponse, PutFileResponse and PutFilePublicResponse. The gRPC mock server in grpc_tests.rs builds those responses as struct literals, so they now set `sha256: String::new()`. antd-rust's models don't expose sha256 yet. That's part of the open "other SDKs read sha256" follow-up. fmt, clippy -D warnings, cargo doc and cargo test (154 lib tests plus the drift test) are clean. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings up #325's final ant-cli-v0.3.11 repin via #326 and #346. antd/Cargo.toml and antd/Cargo.lock conflicted on the ant-core and ant-protocol pins; both keep this branch's side, the DEV PIN on WithAutonomi/ant-client#229 with its ant-protocol [patch], because the SHA-256 change needs #229 and ships with it. No other conflicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hermes review handoff — ant-sdk #347Review record: Linked Linear ticket: V2-1564. The PR head was read again before posting and still matches the reviewed revision. Required whole-PR panel coverage remains incomplete; this post is not approval. Posting-time upstream check: ant-client#229 is OPEN at WithAutonomi/ant-sdk #347 — bounded reviewRecommendation: HOLD — DO NOT MERGE; disclosed release gates and incomplete panel. This is an advisory review comment, not a formal GitHub APPROVE/REQUEST_CHANGES review or permission to merge.
Feature reviewAt the reviewed development pin, the SHA-256 value is propagated through the daemon's upload responses over REST/gRPC and the Go typed client, and recorded/reported on manifest entries. Local tests pass, including manifest and hash round-trips. No new blocking implementation defect was confirmed in this delta. This is not a whole-SDK feature-parity claim: the PR explicitly excludes non-Go hand-written REST client models; generated fields do not establish that Rust/Python or other typed clients return the new value. Hard release gates
Source: Lines 1 to 35 in 10dc29b Explicit limits
Execution and CI evidence
Actual original panel participationThe design was two independent roles (correctness and adversarial) for each of GLM 5.3/OpenRouter, local Qwen 3.8 27B, and local DS4 Flash. Production evidence was split into complete named scopes, so a role/model required multiple receipts to cover a whole PR. A receipt is not an extra independent model.
UNCERTAIN is unresolved, not approval. Missing, truncated and timed-out seats do not agree. These counts include complete UNCERTAIN opinions and therefore do not mean complete substantive sign-off. No whole-PR six-seat consensus exists. Recommendations without a verified defect remain provisional. Scope-by-scope receipts
Changed-file scope and classification manifest{
"pr": 347,
"head": "10dc29b4f0eba65273f99cb75e4e95b818024498",
"base": "4cf292a4761fe07e0db82ba270c177382a4ef7b5",
"changed_file_count": 52,
"files": [
{
"path": "antd-dart/lib/src/generated/antd/v1/data.pb.dart",
"classification": "generated",
"scope": null
},
{
"path": "antd-dart/lib/src/generated/antd/v1/data.pbjson.dart",
"classification": "generated",
"scope": null
},
{
"path": "antd-dart/lib/src/generated/antd/v1/files.pb.dart",
"classification": "generated",
"scope": null
},
{
"path": "antd-dart/lib/src/generated/antd/v1/files.pbjson.dart",
"classification": "generated",
"scope": null
},
{
"path": "antd-dart/lib/src/generated/antd/v1/upload.pb.dart",
"classification": "generated",
"scope": null
},
{
"path": "antd-dart/lib/src/generated/antd/v1/upload.pbjson.dart",
"classification": "generated",
"scope": null
},
{
"path": "antd-elixir/lib/antd/v1/data.pb.ex",
"classification": "generated",
"scope": null
},
{
"path": "antd-elixir/lib/antd/v1/files.pb.ex",
"classification": "generated",
"scope": null
},
{
"path": "antd-elixir/lib/antd/v1/upload.pb.ex",
"classification": "generated",
"scope": null
},
{
"path": "antd-go/client.go",
"classification": "production",
"scope": "sha-go"
},
{
"path": "antd-go/client_test.go",
"classification": "tests",
"scope": null
},
{
"path": "antd-go/grpc_client.go",
"classification": "production",
"scope": "sha-go"
},
{
"path": "antd-go/grpc_client_test.go",
"classification": "tests",
"scope": null
},
{
"path": "antd-go/manifest.go",
"classification": "production",
"scope": "sha-go"
},
{
"path": "antd-go/manifest_test.go",
"classification": "tests",
"scope": null
},
{
"path": "antd-go/models.go",
"classification": "production",
"scope": "sha-go"
},
{
"path": "antd-go/proto/antd/v1/data.pb.go",
"classification": "generated",
"scope": null
},
{
"path": "antd-go/proto/antd/v1/files.pb.go",
"classification": "generated",
"scope": null
},
{
"path": "antd-go/proto/antd/v1/manifests.pb.go",
"classification": "generated",
"scope": null
},
{
"path": "antd-go/proto/antd/v1/upload.pb.go",
"classification": "generated",
"scope": null
},
{
"path": "antd-kotlin/lib/src/main/proto/antd/v1/data.proto",
"classification": "production",
"scope": "sha-go"
},
{
"path": "antd-kotlin/lib/src/main/proto/antd/v1/files.proto",
"classification": "production",
"scope": "sha-go"
},
{
"path": "antd-kotlin/lib/src/main/proto/antd/v1/upload.proto",
"classification": "production",
"scope": "sha-go"
},
{
"path": "antd-py/src/antd/_proto/antd/v1/data_pb2.py",
"classification": "generated",
"scope": null
},
{
"path": "antd-py/src/antd/_proto/antd/v1/data_pb2.pyi",
"classification": "generated",
"scope": null
},
{
"path": "antd-py/src/antd/_proto/antd/v1/files_pb2.py",
"classification": "generated",
"scope": null
},
{
"path": "antd-py/src/antd/_proto/antd/v1/files_pb2.pyi",
"classification": "generated",
"scope": null
},
{
"path": "antd-py/src/antd/_proto/antd/v1/upload_pb2.py",
"classification": "generated",
"scope": null
},
{
"path": "antd-py/src/antd/_proto/antd/v1/upload_pb2.pyi",
"classification": "generated",
"scope": null
},
{
"path": "antd-ruby/lib/antd/v1/data_pb.rb",
"classification": "generated",
"scope": null
},
{
"path": "antd-ruby/lib/antd/v1/files_pb.rb",
"classification": "generated",
"scope": null
},
{
"path": "antd-ruby/lib/antd/v1/upload_pb.rb",
"classification": "generated",
"scope": null
},
{
"path": "antd-rust/src/generated/antd.v1.rs",
"classification": "generated",
"scope": null
},
{
"path": "antd-rust/src/grpc_tests.rs",
"classification": "tests",
"scope": null
},
{
"path": "antd-swift/Sources/AntdSdk/Proto/antd/v1/data.pb.swift",
"classification": "generated",
"scope": null
},
{
"path": "antd-swift/Sources/AntdSdk/Proto/antd/v1/files.pb.swift",
"classification": "generated",
"scope": null
},
{
"path": "antd-swift/Sources/AntdSdk/Proto/antd/v1/upload.pb.swift",
"classification": "generated",
"scope": null
},
{
"path": "antd/Cargo.lock",
"classification": "lock",
"scope": null
},
{
"path": "antd/Cargo.toml",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/openapi.yaml",
"classification": "docs",
"scope": null
},
{
"path": "antd/proto/antd/v1/data.proto",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/proto/antd/v1/files.proto",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/proto/antd/v1/manifests.proto",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/proto/antd/v1/upload.proto",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/src/grpc/service.rs",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/src/manifests.rs",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/src/rest/data.rs",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/src/rest/files.rs",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/src/rest/manifests.rs",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/src/rest/upload.rs",
"classification": "production",
"scope": "sha-server"
},
{
"path": "antd/src/types.rs",
"classification": "production",
"scope": "sha-server"
},
{
"path": "llms-full.txt",
"classification": "docs",
"scope": null
}
],
"scopes": [
{
"pr": 347,
"scope": "sha-server",
"head": "10dc29b4f0eba65273f99cb75e4e95b818024498",
"base": "4cf292a4761fe07e0db82ba270c177382a4ef7b5",
"evidence": "/Users/studio1/.hermes/cache/scratch/ant-sdk-review-evidence/347/panel-evidence/sha-server.txt",
"bytes": 34463,
"files": [
"antd/Cargo.toml",
"antd/proto/antd/v1/data.proto",
"antd/proto/antd/v1/files.proto",
"antd/proto/antd/v1/manifests.proto",
"antd/proto/antd/v1/upload.proto",
"antd/src/grpc/service.rs",
"antd/src/manifests.rs",
"antd/src/rest/data.rs",
"antd/src/rest/files.rs",
"antd/src/rest/manifests.rs",
"antd/src/rest/upload.rs",
"antd/src/types.rs"
]
},
{
"pr": 347,
"scope": "sha-go",
"head": "10dc29b4f0eba65273f99cb75e4e95b818024498",
"base": "4cf292a4761fe07e0db82ba270c177382a4ef7b5",
"evidence": "/Users/studio1/.hermes/cache/scratch/ant-sdk-review-evidence/347/panel-evidence/sha-go.txt",
"bytes": 14476,
"files": [
"antd-go/client.go",
"antd-go/grpc_client.go",
"antd-go/manifest.go",
"antd-go/models.go",
"antd-kotlin/lib/src/main/proto/antd/v1/data.proto",
"antd-kotlin/lib/src/main/proto/antd/v1/files.proto",
"antd-kotlin/lib/src/main/proto/antd/v1/upload.proto"
]
}
]
}Linear review comment: https://linear.app/autonominetwork/issue/V2-1564/ant-core-antd-sha-256-of-uploaded-content-computed-during-encryption#comment-e90784b9 |
Draft. DO NOT MERGE. This is blocked on WithAutonomi/ant-client#229, which adds the SHA-256 in ant-core. #229 merged on 2026-10-16 (ant-client
a7cb0d0), but it is not in a release yet: it is not in ant-core 0.13.0. Do not merge this until an ant-client release ships #229 (expected next week, likely ant-core 0.14). #326 and #346, which this was stacked on, are now in main, so this targets main directly.Temporary pin.
antd/Cargo.tomlpins ant-core to #229's commit2eace73. It also adds a[patch.crates-io]that points ant-protocol at rev718f606, mirroring ant-clientmain. Before this merges:[patch].Stack. This is stacked on #346 (manifest endpoints), which sits on #326 (pointer API) and #325 (repin). Merge order: #325 → #326 → #346 → this PR. Linear: V2-1564.
What
sha256(hex) is returned on the data, file and finalize upload responses, over REST and gRPC./v1/manifests/buildas an optional input on each entry, and comes back out of/v1/manifests/decode. The ADR-0006 owner approved it as an optional field within format version 1.sha256fields.ec696b4's message says "WIP: SDK stubs and docs follow". e60a349 is that follow-up.
Not in this PR
sha256yet. Their generated gRPC stubs already carry it.Verified
Before the restack:
go vet, and golangci-lint v1.64.8.On this branch after merging #346, so the pointer code is built against the dev pin too:
-D warnings,cargo doc, andcargo test --locked. All 148 tests pass, so the pointer code builds and passes against the dev pin as well.go vet,go test, and golangci-lint v1.64.8.CI note. This PR inherits the same two red checks as #346 (Security audit and Third-party notices) until the stack below it picks up #325's fixes.
🤖 Generated with Claude Code