# drive-plugin-chunks spec delta — DTP-25 (inline-sig) ## ADDED Requirements ### Requirement: Inline hint signed over fileId ‖ bytes `FileLocation.storageHints` entries with `kind: 'inline'` SHALL be `{ kind: 'inline'; bytes: Uint8Array; sig: Uint8Array }` where `sig = Ed25519-sign(driveSecretKey, fileId ‖ bytes)`. The drive SHALL verify the signature before returning `bytes`; failure SHALL throw `CHUNKS.INLINE_SIG_INVALID`. The verifier SHALL be Ed25519 over the canonical concatenation exposed by `inlineSigningInput(fileId, bytes)`. A tampered signature, tampered bytes, replay onto a different `fileId`, or signature produced under a different key SHALL all reject with `CHUNKS.INLINE_SIG_INVALID`. The `verifyInlineHint` function SHALL accept an optional `VerifyEd25519Fn` parameter so engine-substitution scenarios where a native verifier throws (rather than returning false) compose cleanly. When the injected verifier throws, the implementation SHALL wrap the exception as `CHUNKS.INLINE_SIG_INVALID` with the original error attached as `cause`. **Verified by:** `tests/inline-file-sig.test.ts`::"inline file with valid sig reads successfully" AND "inline file with bad sig throws INLINE_SIG_INVALID" AND "sig bound to fileId — replay onto a different fileId rejects" AND "byte tamper rejects with INLINE_SIG_INVALID" AND "rejects under a different public key" AND "verify catch arm wraps a throwing verifier". ### Requirement: Legacy inline hints accepted with rewrite-on-write Drives reading old-format inline entries (no `sig` field) SHALL accept them via the `LegacyInlineHint` shape and SHALL emit a `drive:inline:legacy` warning event. `isLegacyInlineHint(hint)` SHALL discriminate the two wire shapes (legacy vs signed). On the next write that touches such a hint, `upgradeLegacyInlineHint(legacy, fileId, driveSecretKey)` SHALL produce a signed `InlineHint` so the upgrade lands at-rest and subsequent reads no longer trigger the legacy warning. **Verified by:** `tests/inline-file-sig.test.ts`::"old-format inline reads with warning AND rewrites with sig on next write" AND "isLegacyInlineHint distinguishes signed from legacy hints". ### Requirement: Canonical signing input exposed `inlineSigningInput(fileId: Uint8Array, bytes: Uint8Array)` SHALL return `concat(fileId, bytes)` as a freshly-allocated `Uint8Array`. Any consumer that wants to re-derive the bytes that are signed (for auditing, alternate-keypath signing, or cross-checking against a hardware signer) SHALL use this function. **Verified by:** `tests/inline-file-sig.test.ts`::"inlineSigningInput is the canonical fileId ‖ bytes concatenation".