Skip to content

feat(antd, sdks): SHA-256 on uploads and manifests; ant-core 0.14.0 - #347

Merged
Nic-dorman merged 11 commits into
mainfrom
nic/v2-1564-antd-sha256
Oct 23, 2026
Merged

Nic-dorman merged 11 commits into
mainfrom
nic/v2-1564-antd-sha256

Conversation

@Nic-dorman

@Nic-dorman Nic-dorman commented Oct 15, 2026 •

Copy link
Copy Markdown
Member

Ready for review. WithAutonomi/ant-client#229, which adds the SHA-256 in ant-core, shipped in ant-cli-v0.3.12 / ant-core 0.14.0 (2026-10-23). This PR now pins that release, and is the main content of antd 0.17.0; the version bump follows in a separate PR stacked on this one. Linear: V2-1564.

What

  • antd: repinned to ant-cli-v0.3.12 (ant-core 0.14.0), with ant-protocol =5.0.1. The dev pin on 2eace73 and the ant-protocol [patch.crates-io] are gone. Compared with main, the lock changes only:

    • ant-core 0.13.0 → 0.14.0
    • ant-protocol 5.0.0 → 5.0.1
    • saorsa-core 0.29.1 → 0.29.2
    • saorsa-transport 0.38.1 → 0.38.2
    • annotate-snippets 0.12.16 → 0.12.17

    The repin also brings in ant-core 0.14's hot-record read spreading (ADR-0023, ant-client#225) and rustls 0.23.46 (ant-client#232).

  • antd, sha256 on uploads: sha256 (hex) is returned on the data, file and finalize upload responses, over REST and gRPC.

  • antd, sha256 on manifests: /v1/manifests/build takes an optional sha256 on each entry, and /v1/manifests/decode returns it. The ADR-0006 owner approved it as an optional field within format version 1. A non-hex value, or one that isn't 32 bytes, is a 400.

  • antd-go: the matching fields (antd >= 0.17.0).

  • antd-rust:

    • ManifestEntryInput::sha256 / with_sha256 and ManifestEntryInfo::sha256, over REST and gRPC.
    • The committed gRPC code is regenerated. It had missed the manifests.proto fields, so proto_drift was failing.
    • The mock tests cover the new fields.
  • Stubs:

    • Python, Ruby, Dart and Elixir are regenerated on dev2 with each SDK's regen script, at the generator versions proto-drift pins.
    • Swift is regenerated with the package's plugins. dev2's older protoc-gen-swift drops nonisolated, so those modifiers are restored by hand.
    • The Go stubs are regenerated and the Kotlin proto copies synced.
  • Docs: OpenAPI and the llms docs gain the sha256 fields.

Not in this PR

  • The other SDKs' hand-written REST models (Python, JS, C# and so on) don't read sha256 yet. Their generated gRPC stubs already carry it. This is a follow-up fan-out.

Verified

Live devnet on dev2: an ant-node v0.23.1 devnet (small preset), with antd release-built from this branch.

  • REST uploads: POST /v1/data and /v1/data/public (300 KB and 700 B), and /v1/files and /v1/files/public (5 MB). Each returned sha256 equals sha256sum of the input.
  • gRPC uploads: DataService.Put / PutPublic and FileService.Put, through the branch's Python stubs. Each hash matches hashlib.sha256.
  • Manifest round trip:
    • Built a manifest with private, public and no-hash entries, then decoded it both with resolve: true and from its link. sha256 came back on the right entries and stayed absent on the no-hash one.
    • Non-hex and 16-byte values are 400s, and uppercase hex comes back lowercase.
  • Official ant v0.3.12 binary:
    • ant manifest download of the built manifest wrote all three files, and their hashes match.
    • With file.bin's sha256 zeroed, it refused that file ("SHA-256 mismatch"), left nothing on disk for it, and exited 1.

Local runs:

  • antd: cargo fmt --check, clippy with -D warnings, cargo doc, and cargo test --locked (155 passed).
  • antd-rust: clippy with -D warnings, and cargo test --locked --all-features, including proto_drift.
  • antd-go: go vet and go test.

dev2, on the regenerated stubs: Python 584 passed, Ruby 212 runs with 0 failures, Dart 248 passed. Elixir's tests didn't run on dev2: OTP 25 there can't compile the locked cowlib. CI's proto-drift job checks the Elixir stubs.

🤖 Generated with Claude Code

Nic-dorman and others added 3 commits October 15, 2026 12:43
…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>
Nic-dorman and others added 3 commits October 15, 2026 15:35
Brings up the CI fixes already on the repin branch (#325): rustls 0.23.46 from main (#344, RUSTSEC-2026-0346..0349) and the notices generator reading .licenses/ (c226153, for granit-parser). No conflicts.

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>
@dirvine

dirvine commented Oct 16, 2026 •

Copy link
Copy Markdown
Member

Hermes review handoff — ant-sdk #347

Review record: WithAutonomi/ant-sdk#347@10dc29b4f0eba65273f99cb75e4e95b818024498

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 fa5e49c567f75e069ed8543c332392c44c38feba. Tests in this report cover #347's recorded dependency pin, not a different upstream head.

WithAutonomi/ant-sdk #347 — bounded review

Recommendation: 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.

  • PR: feat(antd, sdks): SHA-256 on uploads and manifests; ant-core 0.14.0 #347
  • Reviewed head: 10dc29b4f0eba65273f99cb75e4e95b818024498.
  • Reviewed diff base (merge base): 4cf292a4761fe07e0db82ba270c177382a4ef7b5.
  • GitHub target branch revision captured initially: 4cf292a4761fe07e0db82ba270c177382a4ef7b5.
  • Local checkout is clean and matches the reviewed head. The live head was read again before report generation and still matches.
  • Changed-file inventory: 52 files. Full changed-production patch coverage manifests are included with the evidence. Documentation, tests, generated stubs and locks are classified separately; a production-scope panel is not a review of all SDK builds.

Feature review

At 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

  1. feat(upload, manifest): report the uploaded file's SHA-256 and record it on manifest entries (V2-1564) ant-client#229 must merge and ship in an ant-core release. At the read used for this report it is still OPEN at fa5e49c567f75e069ed8543c332392c44c38feba, while feat(antd, sdks): SHA-256 on uploads and manifests; ant-core 0.14.0 #347 pins older commit 2eace7374d0642376e799458a4fb9e63c2b7cc4c. These are different revisions. Tests here cover the latter exact pin, not the current upstream PR head.
  2. Repin ant-core to the actual release that contains ci(ffi): cross-platform Python wheels + PyPI publishing #229. Do not assume an anticipated version number is published or includes the feature.
  3. Remove the temporary ant-protocol [patch.crates-io] override at 718f60682bb3704b68fbba0bea34f2a0416fa876, resolve the intended locked graph, and check it explicitly.
  4. Review and retest that final dependency graph. The current temporary graph moves ant-core 0.13.0 to 0.11.0, ant-protocol 5.0.0 to 4.0.0, and also moves Saorsa dependencies backwards. This is disclosed development choreography, not a new hash-code defect; it is still a hard reason not to merge the temporary pin.
  5. Resolve feat(antd, antd-go, antd-rust): pointer API with ownership transfer #326's cancellation defect in the lower stack, complete the required review coverage, and revalidate the final heads.
  6. Respect the documented order build(antd): repin ant-core 0.13.0 (ant-cli-v0.3.11) #325 → feat(antd, antd-go, antd-rust): pointer API with ownership transfer #326 → feat(antd, antd-go): ADR-0006 manifest endpoints: build, decode and link #346 → feat(antd, sdks): SHA-256 on uploads and manifests; ant-core 0.14.0 #347; remove draft/DO NOT MERGE only after the release gates are met. Do not merge feat(antd, sdks): SHA-256 on uploads and manifests; ant-core 0.14.0 #347 into the lower pointer branches merely because Cargo.toml merges without a textual conflict: that silently changes their dependency graph.

Source:

ant-sdk/antd/Cargo.toml

Lines 1 to 35 in 10dc29b

[package]
name = "antd"
version = "0.15.0"
edition = "2021"
license = "MIT OR Apache-2.0"
[dependencies]
ant-core = { git = "https://github.com/WithAutonomi/ant-client", rev = "2eace7374d0642376e799458a4fb9e63c2b7cc4c" } # DEV PIN, DO NOT MERGE: WithAutonomi/ant-client#229 (V2-1564, SHA-256 of uploads + manifest entries) on top of main 225a676 (= the 2026-10-15 train content). Repin to the first ant-core release that ships #229 before merge.
self_encryption = "0.36.0"
evmlib = "0.10.0" # must track ant-core's transitive evmlib (via ant-protocol) to avoid a second copy in the graph
ant-protocol = "=4.0.0" # resolved through the [patch.crates-io] below to the revision ant-client main pins; any other source would fork PaymentQuote/StorageCommitment in the graph
axum = { version = "0.8", features = ["macros"] }
tower-http = { version = "0.6", features = ["cors", "limit", "trace"] }
tonic = "0.12"
prost = "0.13"
tokio = { version = "1", features = ["full"] }
tokio-stream = { version = "0.1", features = ["net"] }
dirs = "6"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
hex = "0.4"
bytes = "1"
base64 = "0.22"
blake3 = "1"
rmp-serde = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
clap = { version = "4", features = ["derive", "env"] }
thiserror = "2"
futures = "0.3"
rand = "0.8"
postcard = { version = "1.1.3", features = ["use-std"] }
toml = "0.8"
zeroize = "1" # pointer owner key seeds are wiped after the key pair is derived
. Upstream: WithAutonomi/ant-client#229.

Explicit limits

  • A manifest hash is a creator-supplied claim. Build/decode round-trip is not proof that the referenced content has that hash.
  • No paid upload through the daemon's new path ran in this review. Comparison of a daemon-returned hash with an independently computed plaintext hash remains an integration gate, not a claimed result.
  • Non-Go hand-written client support and package-version/release-document alignment remain follow-up scope. The typed Rust API still drops the new hash field; do not advertise all-SDK parity.
  • The PR body's old note about red CI is stale relative to the exact-head rollup observed in this report; the current check totals below are the evidence.

Execution and CI evidence

  • Parent-run cargo test --locked, daemon: test result: ok. 148 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.38s
  • Parent-run cargo test --locked, Rust SDK (each result is a separate test binary/doc-test group):
    • test result: ok. 154 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s
    • test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    • test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
    • test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
    • test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s
  • Local Go tests and go vet passed. Go race tests were not run for this head; do not transfer feat(antd, antd-go, antd-rust): pointer API with ownership transfer #326 race coverage to it.
  • Formatting: changed hand-written Rust sources passed edition-correct checks. The generated Rust formatting difference also reproduces on the base; it is inherited.
  • The first daemon build failed because a shared target contained stale generated protobuf outputs from another worktree. After cargo clean -p antd, the saved fresh-proto daemon run exited 0. The failed first run is retained, not reported as a passing command. Per-worktree targets should be used for future stack validation.
  • Exact-head GitHub checks at final read: {'SUCCESS': 18, 'SKIPPED': 2}. This is observed CI, distinct from local execution.
  • No paid upload, live-network pointer operation, full daemon payment E2E, browser/mobile SDK build, or complete lint/security reproduction ran locally. Unit tests and loopback probes do not establish these gates.

Actual original panel participation

The 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.

  • GLM 5.3 / OpenRouter: 0/4 scoped role receipts returned complete structured opinions; verdicts {}; missing {'Incomplete termination; unavailable seat': 4}.
  • local Qwen 3.8 27B: 4/4 scoped role receipts returned complete structured opinions; verdicts {'APPROVE': 4}; missing {}.
  • local DS4 Flash: 0/4 scoped role receipts returned complete structured opinions; verdicts {}; missing {'TimeoutError': 4}.

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

  • sha-go / correctness: glm: Incomplete termination; unavailable seat; qwen: APPROVE; ds4: TimeoutError
  • sha-go / adversarial: glm: Incomplete termination; unavailable seat; qwen: APPROVE; ds4: TimeoutError
  • sha-server / correctness: glm: Incomplete termination; unavailable seat; qwen: APPROVE; ds4: TimeoutError
  • sha-server / adversarial: glm: Incomplete termination; unavailable seat; qwen: APPROVE; ds4: TimeoutError
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

@Nic-dorman
Nic-dorman changed the base branch from nic/v2-1570-antd-manifest-endpoints to main October 16, 2026 14:33
@Nic-dorman Nic-dorman changed the title feat(antd, sdks): SHA-256 from uploads and on manifest entries (DO NOT MERGE: dev pin on ant-client#229) feat(antd, sdks): SHA-256 from uploads and on manifest entries (DO NOT MERGE until the ant-client release with #229) Oct 16, 2026
Nic-dorman and others added 5 commits October 23, 2026 10:00
ant-cli-v0.3.12 is the first ant-client release with the SHA-256 work
(ant-client#229), so the dev pin on 2eace73 and the ant-protocol
[patch.crates-io] go. ant-protocol moves to =5.0.1, ant-core's transitive
version. Against main the lock changes only ant-core 0.13.0 -> 0.14.0,
ant-protocol 5.0.0 -> 5.0.1, saorsa-core 0.29.1 -> 0.29.2,
saorsa-transport 0.38.1 -> 0.38.2 and annotate-snippets 0.12.16 -> 0.12.17.

The sha256 fields first ship in antd 0.17.0, not 0.16.0, so the antd-go
and OpenAPI notes now say so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…code

The committed gRPC code missed the manifests.proto sha256 fields
(ManifestEntryInput.sha256, ManifestEntryInfo.sha256), so proto_drift
failed and the build broke on the new field. Regenerate it and carry
sha256 through ManifestEntryInput (with_sha256) and ManifestEntryInfo over
both REST and gRPC, unset on the wire when not given and None when the
daemon sends none. The mock REST and gRPC build tests now cover it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Python, Ruby, Dart and Elixir via each SDK's regen script at its pinned
generator versions; nothing outside manifests changes. Swift via the
package's protoc-gen-swift, with the `nonisolated` modifiers that dev2's
older plugin drops restored, so only the sha256 code changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Nic-dorman Nic-dorman mentioned this pull request Oct 23, 2026
@Nic-dorman Nic-dorman changed the title feat(antd, sdks): SHA-256 from uploads and on manifest entries (DO NOT MERGE until the ant-client release with #229) feat(antd, sdks): SHA-256 on uploads and manifests; ant-core 0.14.0 Oct 23, 2026
@Nic-dorman
Nic-dorman marked this pull request as ready for review October 23, 2026 09:48

@MaidSafe-Hermes MaidSafe-Hermes left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — APPROVE

No actionable defects found in the SHA-256 upload-response and manifest changes at this revision. The REST and gRPC upload/finalize handlers forward the hash returned by ant-core; manifest claims are validated, preserved as optional metadata, and exposed on decode. The source protobuf changes are additive, and the pinned ant-core uses named manifest serialization and verifies the recorded hash on extraction.

Coverage

2/2 seats reviewed (sol-1 gpt-6.1-sol xhigh; glm-1 z-ai/glm-5.3). sol-1 returned APPROVE. glm-1 returned UNCERTAIN; I checked its remaining concerns against the exact source and execution evidence rather than treating that as agreement. In particular, the suspected Rust serde-attribute placement is correct: each attribute precedes its sha256 field in antd-rust/src/manifests.rs:241-246,284-289; the SDK tests also compile and pass. The shared finalize path carries the result hash to both transports.

Validation and limits

  • GitHub CI: applicable daemon, SDK, generated-proto drift and security checks completed successfully. Go race detection and Go security scanning were skipped.
  • cargo test --locked --manifest-path antd-rust/Cargo.toml: 170 unit tests and two live-manifest/pointer tests passed. The full command exited 101 because tests/proto_drift.rs could not run without protoc.
  • cargo test --locked --manifest-path antd/Cargo.toml could not reach compilation/tests because the build script could not find protoc.
  • git diff --check passed.

This is a code-review verdict only; it does not authorize merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants