# MISAKA PALW Receipt Protocol V1 本書は `runtime-palw` の現行 Rust 実装を wire protocol の正本として記述する。ここにない production 承認、決済連携、attestation を Receipt から推論してはならない。実装と本書が 一致しない場合は Receipt を発行しない。 ## 1. Primitive types - `Hash32`、commitment、ID、`NetworkId`: 固定 32 byte - `u16` / `u32` / `u64` / `i64`: big endian。`i64` は two's-complement - `bool`: `u8(0)` または `u8(1)` - enum: variant tag `u8` の後に variant 固有 payload - Ed25519 public key: 32 byte、signature: 64 byte、algorithm tag: `0` - `Option`: `u8(0)`、または `u8(1) || encode(T)` `NetworkId` は UTF-8 名ではなく `Hash32` である。consensus encoding へ `usize`、float、map、 JSON text、platform enum、暗黙の default を直接入れない。 Receipt、scheduler message、future beacon、canary precommit、bond/external authority evidenceのEd25519 verificationは`verify_strict`を使う。small-order/weak public keyはworker signer、scheduler、beacon、bond、 external authorityのregistry recordとして拒否し、key IDが一致してもauthorization identityとして扱わない。 ## 2. Canonical encoding ```text LP(x) = u64be(len(x)) || x bytes(x) = LP(x) string(s) = LP(utf8(s)) vector(xs) = u64be(count(xs)) || encode(xs[0]) || ... ``` 固定長 hash は LP を付けず 32 byte を直接書く。struct は本書に記した順で field を連結する。 decoder は未知の version/tag、truncated/trailing bytes、invalid UTF-8、非canonical bool/option、 上限超過を拒否し、decode 後の再encodeが入力と一致しなければ拒否する。現行 reader の blob 上限は 64 MiB、item count 上限は 16,777,216 である。 ## 3. Domain-separated hash ```text H(tag, part_0, ..., part_n) = SHA3-256( LP("MISAKA/PALW") || LP(utf8(tag)) || u16be(schema_version) || LP(part_0) || ... || LP(part_n) ) ``` part count 自体は入らないが、すべての part が LP されるため partition は曖昧にならない。 raw concatenation と domain の流用は禁止する。core V1 が使用する domain は次のとおり。 ```text model-artifact-leaf/v1 model-artifact-node/v1 model-profile/v1 runtime-class/v1 runtime-manifest/v1 shape-profile/v1 cu-ruleset/v1 job-request/v1 assignment/v1 signer-key/v1 prompt/v1 output/v1 owner/v1 job-nullifier/v1 execution-nullifier/v1 schedule-init/v1 schedule-step/v1 schedule-final/v1 gemm-trace-scheme/v1 gemm-trace-init/v1 gemm-trace-step/v1 gemm-trace-final/v1 receipt-body/v1 receipt-id/v1 receipt-signature/v1 replica-match/v1 pair-id/v1 future-beacon/v1 audit-policy/v1 audit-selection/v1 audit-challenge/v1 audit-replay-result/v1 audit-replay-submission/v1 work-ticket/v2 local-maturity-basis/v2 canary/v1 canary-precommit/v1 durable-slash-offense/v2 bond-release/v1 bond-funding-attestation/v1 slash-appeal/v1 slash-decision/v1 slash-default-uphold/v1 external-escrow/v1 external-payment-command/v1 external-funding-attestation/v1 external-demand-weight-grant/v1 external-terminal-confirmation/v1 llama-cuda-dispatch/v1 cuda-kernel-entry/v1 verification-bundle-receipt/v1 verification-bundle-public/v1 verification-bundle-aad/v1 verification-bundle-aead-key/v1 verification-bundle-id/v1 ``` `request/v1` は generic helper `commit_request` に残るが、署名済み `JobRequestV1` の ID には 使用しない。job request の唯一の domain は `job-request/v1` である。deterministic policy と Qwen Metal profile はさらに `lora-set/v1`、`control-vector-set/v1`、 `thinking-policy/v1`、`workspace-policy/v1`、`thread-policy/v1`、 `qwen-native-observer-mapping/v1` 等の artifact domain を runtime identity の内側で使う。 ## 4. Artifact and model identity artifact は slash-separated relative path の辞書順で処理する。空、absolute、末尾 `/`、空要素、 `.`、`..`、backslash、非UTF-8、重複、symlink、非regular file は拒否する。 ```text leaf_i = H( "model-artifact-leaf/v1", utf8(relative_path_i), u64be(file_size_i), file_bytes_i ) ``` file は streaming hash するが上式と同じ framing である。各 level の leaf/node が奇数なら 末尾を複製し、`H("model-artifact-node/v1", left, right)` で二分木を作る。artifact は空に できない。 `ModelProfile` canonical order: 1. `architecture: string` 2. `base_repository: string` 3. `immutable_revision: string` 4. `topology: u8` (`0=Dense`, `1=MixtureOfExperts`) 5. `tokenizer: string` 6. `weight_artifact_root: Hash32` 7. `tokenizer_artifact_root: Hash32` 8. `chat_template_digest: Hash32` 9. `special_tokens_digest: Hash32` 10. `hidden_size: u32` 11. `attention_heads: u32` 12. `kv_heads: u32` 13. `head_dim: u32` 14. `layer_count: u32` 15. `intermediate_size: u32` 16. `rope: string` 17. `rope_theta: u64` 18. `rope_scaling_millionths: u64` 19. `native_context_tokens: u32` 20. `vocabulary: u32` 21. `precision: string` ```text model_profile_id = H("model-profile/v1", encode(ModelProfile)) ``` 全 string、artifact hash、次元、RoPE integer parameter は nonzero/nonempty でなければならない。 `hidden_size / attention_heads == head_dim`、`attention_heads % kv_heads == 0` も検査する。 Q4 GGUF は fixed inference artifact であり、学習済み base revision と量子化 artifact の双方を profile に bind する。 ## 5. Runtime class, deterministic policy, and manifest `BackendKind` canonical encoding: - `0=CUDA`: `cuda_version, driver_version, cublas_version, sm_architecture`(各 string)、 `cublas_policy_digest: Hash32` - `1=Metal`: `metal_version, driver_build, gpu_family, language_version`(各 string)、 `metallib_digest: Hash32` - `2=CPU`: `isa_class, blas_version`(各 string)、`affinity_policy_digest: Hash32` `TraceCapability`: `0=None`, `1=GraphFallback`, `2=KernelSketch`。 `RuntimeClass` canonical order: 1. `backend: BackendKind` 2. `runtime_version: string` 3. `runtime_source_repository: string` 4. `runtime_source_commit: string` 5. `runtime_binary_digest: Hash32` 6. `dirty_patch_digest: Hash32` 7. `operating_system: string` 8. `host_architecture: string` 9. `device_class: string` 10. `accelerator_api: string` 11. `compiler_version: string` 12. `build_flags_digest: Hash32` 13. `kernel_binary_digest: Hash32` 14. `kernel_algorithm_digest: Hash32` 15. `accelerator_count: u32` 16. `tensor_parallel: u32` 17. `split_policy: string` 18. `quantization: string` 19. `kv_cache_precision: string` 20. `flash_attention: bool` 21. `tensor_repack: bool` 22. `context_size: u32` 23. `batch_size: u32` 24. `micro_batch_size: u32` 25. `thread_count: u32` 26. `trace_capability: TraceCapability` 27. `deterministic_policy: DeterministicPolicy` `DeterministicPolicy` の nested canonical order は `temperature_millionths:u32, top_p_millionths:u32, top_k:u32, batch_size:u32, tensor_parallel:u32, parallel_sequences:u32, context_shift_enabled:bool, speculative_decoding_enabled:bool, dynamic_fit_enabled:bool, random_seed:u64, kernel_graph_id:Hash32, quantization_artifact_id:Hash32, lora_adapters_digest:Hash32, control_vectors_digest:Hash32, thinking_policy_digest:Hash32, workspace_policy_digest:Hash32, thread_policy_digest:Hash32` である。 V1 strict policy は temperature 0、top-p 1,000,000、top-k 0、batch/tensor-parallel/ parallel-sequences各1、context shift/speculative/dynamic fit無効を要求する。 ```text runtime_class_id = H("runtime-class/v1", encode(RuntimeClass)) ``` Qwen Metal profile の `kernel_graph_id` は pinned llama.cpp commit、 `qwen_adapter_mapping_id_v1()`、native graph variant、prefill/decode serialization policyを まとめて hash する。したがって graph-to-CU mapping の変更も runtime class を変更する。 `ShapeProfile` canonical order は `batch_size:u32, max_context_tokens:u32, max_decode_tokens:u32, max_prefill_tokens:u32`。batch は1、各上限は nonzero、prefill/decode 各上限は context 以下とする。 `RuntimeManifest` canonical order: 1. `manifest_version: u16` (=1) 2. `model_profile: ModelProfile` 3. `runtime_class: RuntimeClass` 4. `shape_profile: ShapeProfile` 5. `model_artifact_digest: Hash32` 6. `model_artifact_size: u64` 7. `runtime_device_digest: Hash32` 8. `loaded_libraries_digest: Hash32` 9. `environment_allowlist_digest: Hash32` 10. `build_provenance_digest: Hash32` 11. `schedule_schema_version: u16` (=1) 12. `trace_schema_version: u16` (=1) 13. `cu_ruleset_id: Hash32` 14. `trace_scheme_id: Hash32` `model_artifact_digest == model_profile.weight_artifact_root`、batch/context、CU ruleset を相互検査し、 `runtime_manifest_hash = H("runtime-manifest/v1", encode(RuntimeManifest))` とする。 現行Qwen Metal issuanceはtokenizer、observer、host/source identity childのinherited environmentを消去し、 `LANG=C`、`LC_ALL=C`だけを設定する。host/source identity helperはabsolute executable pathを使い、この exact mapを`environment_allowlist_digest`へbindする。親processの追加environmentはcompute childへ継承しない。 ## 6. Scheduler-signed request and assignment `JobClass`: `0=SelfLocal`, `1=SelfReplicated`, `2=ExternalReplicated`。 `EvidenceLevel`: `0=Wrapper`, `1=RuntimeObserved`, `2=GemmTraced`。replicated class は `GemmTraced` を要求する。 `ExecutionConstraintsV1` order: 1. `model_profile_id: Hash32` 2. `runtime_class_id: Hash32` 3. `shape_profile_id: Hash32` `JobRequestV1` canonical order: 1. `version: u16` (=1) 2. `network_id: Hash32` 3. `scheduler_job_id: Hash32` 4. `job_class: JobClass` 5. `prompt_commitment: Hash32` 6. `shared_output_nonce: Hash32` 7. `constraints: ExecutionConstraintsV1` 8. `required_evidence_level: EvidenceLevel` 9. `issued_epoch: u64` 10. `expires_epoch: u64` 11. `external_escrow_reference: Option` `ExternalReplicated` は nonzero escrow reference が必須、それ以外は `None` が必須。 ```text request_commitment = H("job-request/v1", encode(JobRequestV1)) ``` `AssignmentV1` canonical order: 1. `version: u16` (=1) 2. `network_id: Hash32` 3. `request_commitment: Hash32` 4. `scheduler_job_id: Hash32` 5. `job_class: JobClass` 6. `replica_slot: u8` 7. `worker_credential_id: Hash32` 8. `runtime_instance_id: Hash32` 9. `assignment_id: Hash32` 10. `issued_epoch: u64` 11. `expires_epoch: u64` ```text assignment_commitment = H("assignment/v1", encode(AssignmentV1)) ``` assignment は network/request/job/class を request と一致させ、validity interval を request 内へ 包含させる。Self Local は slot 0、replicated は slot 0/1 のみ。 request/assignment envelope は同じ orderを使う。 ```text u16be(envelope_version=1) || LP(canonical_body) || scheduler_key_id:Hash32 || u8(signature_algorithm=0) || signature:64-byte ``` signature message はそれぞれ `request_commitment` / `assignment_commitment` そのもの。 `scheduler_key_id = H("signer-key/v1", scheduler_public_key)`。network-scoped registry は key の valid-from/through、revocation、message epoch、weak-key rejectionを検査し、signatureはstrict Ed25519で 検証する。miner が job ID、nonce、slot、assignment IDを自己生成したものは authorization record に ならない。現行local Receipt CLIが自己生成するscheduler key/snapshotはfixture boundaryであり、 production scheduler/governance authorizationを表さない。 ## 7. Prompt, output, owner, and nullifiers prompt text は commit しない。tokenizerの正確な prompt token列を次で commit する。 ```text PromptTokens = u64be(count) || concat(u32be(token_id_i)) prompt_commitment = H( "prompt/v1", network_id, scheduler_job_id, shared_output_nonce, PromptTokens ) ``` `StopReason`: - `0=EndOfSequence(u32 eos_token_id)` - `1=LengthLimit` - `2=ContextLimit` - `3=StopSequence(Hash32 stop_sequence_digest)` `Cancelled` variant は存在しない。cancelled execution から Receipt を発行しない。現行request schemaにはstop-sequence list fieldがないため、`StopSequence` digestが特定requestの設定へbindして いるかをverifierが別途検査する実装もまだない。 ```text CanonicalOutput = u64be(token_count) || concat(u32be(generated_token_id_i)) || encode(stop_reason) output_commitment = H( "output/v1", network_id, job_nullifier, shared_output_nonce, CanonicalOutput ) ``` k=2 の両slotは signed request の同じ nonceを使う。nonce、prompt IDs、output IDs、owner salt は Receipt bodyへ載せず、stateless verifier への private opening とする。 ```text owner_commitment = H( "owner/v1", network_id, owner_salt, owner_ed25519_public_key ) signer_key_id = H("signer-key/v1", owner_ed25519_public_key) job_nullifier = H( "job-nullifier/v1", network_id, scheduler_job_id, request_commitment, u8(job_class) ) execution_nullifier = H( "execution-nullifier/v1", job_nullifier, assignment_id, u8(replica_slot), worker_credential_id, runtime_instance_id ) ``` owner commitment に worker credential は含めない。registry の `SignerRecord` が public key、 owner commitment、worker credential の対応を供給する。owner salt は registry recordにも含めない。 ## 8. Canonical operations and CU `DType`: `0=Fp32`, `1=Fp16`, `2=Bf16`, `3=Int8`, `4=Int4`。 `QuantizationClass`: `0=None`, `1=Q4K`, `2=Q4KM`, `3=Q5KM`, `4=Q8_0`, `5=Iq4Xs`, `255=Artifact(Hash32)`。 `GemmShape` order は `m:u32, n:u32, k:u32, batch:u32, dtype:DType, quantization:QuantizationClass`。 `ComputeOperation` wire tags と payload: | Tag | Variant | Canonical payload order | |---:|---|---| | 0 | `Gemm` | `GemmShape` | | 1 | `Attention` | `query_tokens:u32, key_value_tokens:u32, heads:u32, head_dim:u32, batch:u32, causal:bool` | | 2 | `LayerNorm` | `elements:u32, batch:u32` | | 3 | `RmsNorm` | `elements:u32, batch:u32` | | 4 | `Rotary` | `tokens:u32, heads:u32, head_dim:u32` | | 5 | `ExpertRoute` | `tokens:u32, experts:u32, top_k:u32` | | 6 | `KvCacheRead` | `bytes:u64` | | 7 | `KvCacheWrite` | `bytes:u64` | | 8 | `Silu` | `elements:u64` | | 9 | `ElementwiseMultiply` | `elements:u64` | | 10 | `Softmax` | `elements:u64` | | 11 | `ElementwiseAdd` | `elements:u64` | | 12 | `TensorCopy` | `bytes:u64` | | 13 | `EmbeddingLookup` | `elements:u64` | Dense modelでは `ExpertRoute` を拒否する。Qwen adapter mapping V1 は `MUL_MAT`、`RMS_NORM`、 `ROPE`、`SET_ROWS`、`SOFT_MAX`、`GLU`、`MUL`、`CONT`、`ADD`、`GET_ROWS` を上記 operationへ 変換し、`VIEW/RESHAPE/PERMUTE`だけを layout metadata として除外する。その他は fail-closed。 `ComputeUnitRules::v1()` は全variantを integer-only、checked `u128`、明示ceil、minimum 1で 再計算する。ruleset descriptor の hash が `cu_ruleset_id`。observer申告の cost は受け取らない。 ## 9. Ordered operation schedule `ExecutionPhase`: `0=Prefill`、`1=Decode(u32 step)`。 `ScheduledOperation` canonical order: 1. `index: u64`(0から連続) 2. `phase: ExecutionPhase` 3. `layer_id: Option`(`None` は global LM head 等) 4. `operation: ComputeOperation` ```text s0 = H("schedule-init/v1", job_nullifier, shape_profile_id, cu_ruleset_id) si = H("schedule-step/v1", s(i-1), u64be(i), encode(event_i)) schedule_root = H("schedule-final/v1", sn, u64be(event_count)) ``` index、chain、decode stepの単調性、model layer range、Dense/MoE制約を verifier が再検査する。 挿入、削除、並べ替えはCU合計が同じでもrootを変える。 ## 10. GEMM trace `TraceEvidenceKind` の wire tag は `0=Absent`, `1=GraphFallback`, `2=KernelSketch`。 `trace_scheme_id_v1` は `H("gemm-trace-scheme/v1", fixed_scheme_descriptor)` である。 `AccumulatorSketch` は `i64be lane[4]`。`TileIndex` は `m:u32, n:u32, k:u32`。 `GemmTraceEvent` canonical order: 1. `index: u64` 2. `schedule_index: u64` 3. `kernel_sequence: u64` 4. `tile_linear_index: u32` 5. `tile_count: u32` 6. `evidence_kind: TraceEvidenceKind` 7. `phase: ExecutionPhase` 8. `layer_id: Option`(`None` は global LM head) 9. `kernel_id: Hash32` 10. `shape: GemmShape` 11. `tile: TileIndex` 12. `accumulator_sketch: [i64;4]` ```text t0 = H("gemm-trace-init/v1", job_nullifier, trace_scheme_id) ti = H("gemm-trace-step/v1", t(i-1), u64be(i), encode(trace_event_i)) trace_root = H( "gemm-trace-final/v1", tn, u64be(trace_event_count), u64be(gemm_group_count) ) ``` 各scheduled GEMMは1つのcontiguous groupとなる。groupのschedule indexは狭義増加、全event index/ kernel sequenceは0から連続、group内metadataは一致、kernel IDはnonzero、全groupで evidence kindを 混在させない。`GraphFallback` は各GEMM exactly 1 synthetic tile、`KernelSketch` は1個以上の native tileを許す。trace group数はschedule内GEMM数と一致し、各eventのschedule index、phase、 optional layer、shapeを元scheduleと照合する。 現行 Qwen Metal adapter が発行できる trace は `GraphFallback` だけであり、CUDA claimへ昇格しない。 CUDA C ABIは既存final-output V1 recordに加え、declared origin、accumulator stage/dtype、sketch scheme、 reduction segment、producer variant IDを持つexact 184-byte V2 wire recordを定義する。Rustのstrict decoder/binderは全unfiltered record streamをexpected launch sequence、schedule、tile/segment order、exact MMVQ/flash-attention dispatch、CUDA runtime manifestへbindする。raw `ProducerAccumulator`はtransport上の declared tagにすぎず、`BoundCudaTranscriptV1`はdiagnostic typestateである。 さらにadditive V3は452-byte recordと、FA-off attentionのQK-score MMVF、masked/scaled softmax、 value-aggregation MMVFからなるcanonical 3-sublaunch grouping、strict schedule/runtime binderを実装する。 別のauthority layerはsigned attestationをnetwork/job/execution/assignment、runtime class/manifest、 producer integration、operation schedule、full unfiltered transcriptへexact bindし、public raw constructorを 持たない`AuthorityBoundCudaTranscriptV2`を作る。そこからproducer-accumulator GEMMだけを `AuthorityBoundCudaReceiptEvidenceV2`へdeterministically射影する。attention final-output recordはsigned full-transcript commitmentに残すがGEMM evidenceへは昇格しない。 `ComputeReceiptV1`にはauthority provenance commitmentがないため、V1 builderはCUDA `KernelSketch`の発行を拒否し、workerがV1 bodyを手組み・署名してもverifierが拒否する。standaloneの true FP32 producer-accumulator採取primitiveはRTX 4060 Ti sm_89でdevice suite 7/7と20/20同一 diagnostic fingerprintを確認した。最終grouped suiteは8/8である。vendored llama.cppのQ4_K/Q6_K MMVQと FA-off QK/softmax/PV producerも接続済みで、same-backend Qwen 1-token diagnostic E2Eは361/361 record、 3回同一fingerprint、5 work-class rejectionを確認した。ただしproduction Receipt authorityではない。 現行deterministic profileはFA-offで、legacy V2が表すattention dispatchは `LlamaFlashAttention`だけである。この非互換に対するV3 sublaunch/grouping schema/binderは実装済みだが、 実eager-attention 3-stage hook、361-launch実機E2E、release manifest、Receipt/Bundle/SQLite V2も 実装・検証済みである。live callbackへのauthority-derived canonical expected table接続は未完了である。public headerは `PALW_CUDA_TRACE_PRODUCTION_CAPABLE=0`、`PALW_CUDA_PRODUCER_VENDOR_RUNTIME_INTEGRATED=0`、 `PALW_CUDA_PRODUCER_RECEIPT_MAPPING_AVAILABLE=0`、`PALW_CUDA_PRODUCER_PRODUCTION_CAPABLE=0`で、production CMake optionもfailするため、R32は`In progress`でもproduction CUDA `KernelSketch` Receiptを発行してはならない。 ## 11. Compute Receipt and signature `ComputeReceiptV1` は正確に30 fieldで、canonical orderは次のとおり。 1. `receipt_version: u16` (=1) 2. `network_id: Hash32` 3. `request_commitment: Hash32` 4. `scheduler_job_id: Hash32` 5. `signed_assignment_id: Hash32`(assignment body の `assignment_id`) 6. `replica_slot: u8` 7. `model_profile_id: Hash32` 8. `runtime_class_id: Hash32` 9. `runtime_manifest_hash: Hash32` 10. `shape_profile_id: Hash32` 11. `cu_ruleset_id: Hash32` 12. `trace_scheme_id: Hash32` 13. `trace_evidence: TraceEvidenceKind` 14. `operation_schedule_commitment: Hash32` 15. `schedule_event_count: u64` 16. `canonical_compute_units: u64` 17. `prefill_tokens: u32` 18. `decode_tokens: u32` 19. `output_commitment: Hash32` 20. `gemm_trace_root: Hash32` 21. `trace_event_count: u64` 22. `owner_commitment: Hash32` 23. `worker_credential_id: Hash32` 24. `job_nullifier: Hash32` 25. `execution_nullifier: Hash32` 26. `job_class: JobClass` 27. `evidence_level: EvidenceLevel` 28. `timestamp: u64`(informational only) 29. `issued_epoch: u64` 30. `expires_epoch: u64` body-local evidence invariants: - `Wrapper`: schedule count、trace count、CUは0、trace kindはAbsent - `RuntimeObserved`: schedule countとCUはnonzero、trace countは0、trace kindはAbsent - `GemmTraced`: schedule count、trace count、CUはnonzero、trace kindはnon-Absent - replicated class: evidence levelはGemmTraced trace無しでも `gemm_trace_root` は zero ではなく、同jobで初期化した empty trace root である。 ```text body_id = H("receipt-body/v1", network_id, encode(body)) receipt_id = H("receipt-id/v1", network_id, encode(body)) signature_message = H("receipt-signature/v1", network_id, encode(body)) ``` `SignedReceiptV1` canonical order: ```text u16be(envelope_version=1) || LP(encode(body)) || signer_key_id:Hash32 || u8(signature_algorithm=0) || ed25519_signature:64-byte ``` 現行 `receipt_id` は署名byteを含まず、同じbodyなら同じIDである。signature は worker keyで上記 messageを署名する。verifier は signer registry、scheduler-derived assignment authorization、 manifest、private prompt/output opening、schedule/CU/traceをすべて照合する。signer registryはnonzero owner/credentialとnon-weak keyだけを受け、Receipt signatureはstrict Ed25519で検証する。 ## 12. Stateless verification and durable acceptance stateless path: 1. signed envelope と body をstrict canonical decode 2. body structure、network、assignment epoch 3. scheduler署名検証済み authorization recordとの全binding 4. worker signer key、owner commitment、credential、Receipt signature 5. model/runtime/manifest/shape/CU/trace identity 6. job/execution nullifier再導出 7. token shape bounds 8. schedule、CU、traceをwitnessから再計算 9. prompt/output private openingとtoken countを再計算 型は `UnverifiedReceipt -> StatelesslyVerifiedReceipt`。その後 `StateStore::accept` が SQLite transactionで replay/cardinality keyを予約した場合だけ `AcceptedReceipt` になる。Matcher と canary submission は `AcceptedReceipt` を要求する。first acceptance時のstateless `verified_at_epoch`をdurable `accepted_at_epoch`として保存する。restart後の`restore_accepted`は新しい stateless verification epochとoriginal acceptance epochを区別し、canonical signed Receiptとauthorized runtime instanceがstored rowとexact一致するときだけtypestateを復元する。stored acceptanceはbody issued/expiry内かつcurrent `verified_at_epoch`以下でなければならず、rollbackを拒否する。 durable storeはapplication ID `PALW`、schema version 4、foreign keys、WAL、`synchronous=FULL`を要求する。 exact table set/column order/foreign-key count/indexに加え、non-internal `sqlite_master`の全 `(type,name,tbl_name,sql)`をcanonical encodeしたSHA3-256 fingerprintをcompiled goldenと照合する。 旧schemaのsilent migrationとobjectを持つunclaimed DBは拒否する。receiptのaccepted epoch、pairのmatched epoch、signed future beaconのclaimed epoch、audit replayのissued/accepted epochは8-byte big-endian BLOBとして保存する。beacon verification時のcaller current epochは別columnへ固定せず、restore時の current `AcceptedReceipt.verified_at_epoch`でregistry validity/revocationとともに再検証する。 ## 13. Replica matching `MatchProjectionV1` canonical order: 1. `job_nullifier` 2. `request_commitment` 3. `job_class` 4. `model_profile_id` 5. `runtime_class_id` 6. `runtime_manifest_hash` 7. `shape_profile_id` 8. `cu_ruleset_id` 9. `canonical_compute_units` 10. `prefill_tokens` 11. `decode_tokens` 12. `operation_schedule_commitment` 13. `schedule_event_count` 14. `output_commitment` 15. `trace_scheme_id` 16. `trace_evidence` 17. `gemm_trace_root` 18. `trace_event_count` network、scheduler job ID、assignment/slot、owner/credential/runtime instance/execution nullifier、 evidence level、timestamp/epoch、signature はprojectionに入らない。ただしjob nullifierとrequest commitmentはnetwork-boundであり、durable pair保存時には両memberのnetworkをexplicitに照合する。 2 Receipt は未失効、slot集合`{0,1}`、異なるexecution、signer key、credential、owner、assignment、 runtime instanceでなければならない。pairing `current_epoch`は両bodyのissued epoch、両receiptのoriginal accepted epochとcurrent stateless verified epoch以上、両expiry以下でなければならない。 ```text match_commitment = H("replica-match/v1", encode(projection)) pair_id = H( "pair-id/v1", network_id, min(execution_nullifier_a, execution_nullifier_b), max(execution_nullifier_a, execution_nullifier_b), match_commitment ) ``` `MatchedReplicaPair` はpairing呼出し時の`current_epoch`をprivate `matched_epoch`として保持する。 このepochはprojection/pair IDには入らないが、Self Replicated用のpublic maturity constructorが `MatureEvidence.mature_epoch`へ封入する。durable pair recordのcanonical bytesには`matched_epoch`を 含め、memberのstored issued/accepted/expiry epochと再照合する。 ## 14. Audit, Work Ticket, canary, bond, and external identities `FutureBeaconV1` canonical orderは`version:u16 (=1), network_id:Hash32, epoch:u64, value:Hash32`。`beacon_id = H("future-beacon/v1", encode(body))`。signed envelopeは次のorderである。 ```text u16be(envelope_version=1) || LP(encode(FutureBeaconV1)) || authority_key_id:Hash32 || u8(signature_algorithm=0) || ed25519_signature:64-byte ``` signature messageは`beacon_id`。network-scoped authority registryはbeacon epochのvalidity、verification epoch時点のrevocation、key ID、weak keyを検査し、strict Ed25519成功後だけraw constructorを持たない `VerifiedFutureBeacon`へ昇格する。claimed beacon epochはverification epoch以下でなければならない。 future audit selection: ```text sample = H( "audit-selection/v1", network_id, receipt_id, u64be(beacon_epoch), beacon ) selected iff sample_as_big_endian_u256 < selection_threshold:Hash32 challenge_id = H( "audit-challenge/v1", network_id, receipt_id, sample ) ``` `AuditRecord::new`はexact `AcceptedReceipt`を受け、network、receipt ID、body issued epoch、durable accepted epoch、scheduler job、job nullifier、request commitmentをbindする。beacon epochはissued epochと accepted epochの両方より後でなければならない。v1 policyはselection threshold `2^252`(一様digestの 1/16)、response window 2 epoch、challenge window 5 epochの固定値で、全値を`audit-policy/v1` IDへ commitする。 `StateStore::store_audit_selection`はpolicy ID、original issued/accepted epoch、canonical signed beacon、 beacon ID/value/authority key ID、challenge/deadlineまたはnon-selected mature epochを保存する。restore時は current authority registryでsigned beaconを再検証し、sample/challenge/deadlineを再計算する。 selected replayはdistinctな`StatelesslyVerifiedReceipt`をaudit専用にacceptする。same network/job/requestを 要求し、receipt/execution/assignment/runtime instance/signer key/worker credential/owner commitmentはoriginal と異ならなければならない。replay issued epochはbeaconより後、durable replay accepted epochはissued/ current stateless verified epoch以上かつdeadline以下である。`VerifiedReplayVerdict`が両 `MatchProjectionV1`を比較してresult commitmentとmatch outcomeを作るため、callerはraw `projection_matches:bool`を注入できない。 selected pathはaudit replay identityの一回予約、terminal mismatchまたはpass、pass時のSelf Local maturity sourceを1 SQLite transactionで確定する。non-selected pathもwindow maturityとsourceを1 transactionで確定する。beacon delivery/finality、auditor assignment、model re-execution、opening配送は このwire/state coreの外部service boundaryである。 `restore_audit`はnon-replay state/terminalをrestoreするが、selected pass/mismatch terminalは `AuditReplayRequired`で拒否する。この場合は`restore_selected_audit_with_replay`を使い、durable audit state/challenge、stored canonical replay、全identity/epochを照合する。さらにprojection verdictを再計算し、 match bit、submission commitment、completed epochをstored terminal outcomeへexact比較する。 `WorkTicketV2` のIDを除くcanonical body orderは次のとおり。 1. `version:u16 (=2)` 2. `network_id:Hash32` 3. `source_id:Hash32` 4. `maturity_basis_id:Hash32` 5. `weight_grant_id:Option` 6. `job_class:JobClass` 7. `weight_policy_version:u32` 8. `canonical_compute_units:u64` 9. `weight_bps:u32` 10. `weighted_compute_units:u64` 11. `issued_epoch:u64` ```text weighted_CU = ceil(CU * weight_bps / 10_000) ticket_id = H("work-ticket/v2", network_id, encode(ticket_body_without_ticket_id)) ``` V1 default weight は Self Local challenge 2,500、audit pass 5,000、replicated 10,000、external demand bonus最大5,000 bps。これは算術/型変換の実装値であり、production network admission の 証明ではない。 `MatureEvidence` はwire objectではなく、fieldと低水準constructorを非公開にしたtyped gateである。 生成経路、`maturity_basis_id`、`mature_epoch`は次の3つだけ。 - Self Local: exact `AcceptedReceipt + AuditRecord::Mature`。domain `local-maturity-basis/v2`で audit basis/epochをbindし、audit stateが保持するmature epochを使う - Self Replicated: `MatchedReplicaPair`。pair IDをmaturity basis、pairのmatched epochを使う - External Replicated: authority-verified terminal settlement。confirmation IDをmaturity basis、authority- signed grant IDを必須weight grant、confirmation epochをmature epochとして使う `StateStore::register_mature_evidence(&MatureEvidence)` はstored receipt/pairのnetwork、class、CUとopaque evidenceを照合し、Self Localではstored durable auditのstate/basis/epochも照合する。External evidenceは このAPIから拒否し、後述のsettlement transactionだけが登録できる。primary Self Local audit pathと Self Replicated pathは、source登録と同じtransactionで必要な1件/2件のactive assignment bondを`Mature` releaseし、`mature_source_assignments`へrelease IDをlinkする。unbonded/不足/terminal lockならtransactionを rollbackする。ticket issuerもjob classのrequired replica数とlink数を再検査する。 `issue_work_ticket` は `issued_epoch >= mature_epoch` を要求し、SQLite ticket pathも保存epochに対して 同じ条件を検査してから1 sourceをatomicに消費する。既消費sourceの通常pathは`SourceAlreadyConsumed`、 External settlementのexact replayはstored ticketを返す。 canary expected projection commitment: ```text H("canary/v1", network_id, canary_id, request_commitment, u64be(opening_epoch), canary_salt, encode(expected_match_projection)) ``` `CanaryPrecommitBodyV1`は `version, network_id, canary_id, scheduler_job_id, request_commitment, signed_assignment_id, worker_credential_id, expected_commitment, created_epoch, receipt_deadline_epoch, opening_epoch, opening_deadline_epoch` をcanonical encodeし、 `precommit_id = H("canary-precommit/v1", encode(body))`をschedulerがEd25519署名する。strict envelopeは body、scheduler key ID、algorithm、signatureを持つ。scheduler registryのnetwork、key validity/revocation、 strict signatureと、exact signed request/assignment/worker bindingを検査した後だけ `VerifiedCanaryPrecommit`になる。External Replicated canaryはv1で禁止する。 windowは `assignment.issued <= created <= receipt_deadline <= assignment.expires < opening_epoch <= opening_deadline`。canary markerはReceiptにない。verified precommitはactive bonded assignmentとcanonical signed envelopeをschema-v4 DBへ保存する。`accept_canary`はbonded normal Receipt acceptanceと `ReceiptSubmitted`を同じtransactionでcommitする。valid opening passはterminalだけをcommitし、valid commitmentのprojection mismatchはtyped `CanaryFailure` slashをatomicに適用する。receipt deadline経過は worker faultでslashし、receipt受理後のopening deadline経過はscheduler faultとしてworkerをslashしない。 passとOpeningMissingではassignment bondをactiveのまま保持する。pending canaryがあるsourceのmaturityは 拒否し、terminal後はmature epochをcanary completion epoch以上へ遅延する。Self Localでは遅延後のepochで `local-maturity-basis/v2`も再計算する。その後のmaturity transactionがbondを`Mature` releaseしてsourceへ linkするため、canary terminal単独ではWork Ticketを発行できない。 in-memory helperのslash offense: ```text Evidence = u64be(unique_sorted_count) || concat(sorted_unique_evidence_id) offense_id = H( "slash-offense/v1", network_id, worker_credential_id, assignment_id, u8(reason), u32be(policy_version), Evidence ) ``` reason tagは `1=InvalidManifest`, `2=AuditMismatch`, `3=Equivocation`, `4=DuplicateExecution`, `5=CanaryFailure`, `6=AuditTimeout`。 durable slashはcaller-selected attachment集合ではなくcrate-private `TypedSlashEvidence`のprimary proofを authority identityに使う。 ```text offense_id = H( "durable-slash-offense/v2", network_id, worker_credential_id, assignment_id, u8(reason), primary_proof_id, u32be(policy_version) ) ``` audit mismatch/timeoutとcanary mismatch/receipt timeoutはproof IDをstate transition自身から導出して、 slash claim、derived allocation、assignment remainder、pending appeal bucket、health eventを同じtransactionで 更新する。claimはinitial assignment amountからreason別bpsをceilしたimmutable targetを持つ。v1の Equivocation追加penaltyは0である。複数claimを単純加算せず、finalized(signed/default uphold)targetの max-envelopeを先に割り当て、pending claimはそのenvelopeを超えるextensionだけを受ける。同じassignmentへの late equal/weaker claimのallocationは既存envelopeに覆われるなら0、stronger claimはdeltaだけとなる。 reverse後も全claimから再計算するため、ingestion順序でslash総額は変わらない。standard policyのappeal windowはdurable `applied_epoch`から100 epoch。nonappealed slashはinclusive deadlineの後だけfinalizeする。 typed proofが示す`fault_event_epoch`とstoreがclaimを受理する`applied_epoch`は別で、 `locked_epoch <= fault_event_epoch <= applied_epoch`とaccount transition epochの単調性を要求する。 partial claimのremainderはactive lockとして残る。pendingまたはuphold/default-final claimを持つassignmentは maturity/Work Ticketの根拠にならない。全claim解決後、audit mismatch/ timeout terminalはclaimがreverseされても残額を`SlashResolved` releaseする。canary mismatch/receipt-timeout terminalはmatching `CanaryFailure` claimがuphold/default-finalの場合だけ同releaseを許し、External refundも release terminalになる。reversed canary claimだけではreleaseしない。未使用または acceptedだがunpairedのSelf Replicated assignmentだけは、pending canary/slashがなくsigned expiryを過ぎた 場合に`Expired` releaseできる。paired、Self Local、その他used assignmentはこのexpiry bypassを持たない。 pendingで全targetをallocateしたstate 2にもdistinct late claimを保存できるが、fully finalized/exhaustedの state 3は新claimを拒否する。terminal epoch/proofは全immutable claimをoffense ID順に並べ、各effective epochの maxと完全なterminal fact setから導出する。audit/canary terminalとExternal prepared/terminal stateは 後出しclaimのcutoffであり、特にExternal `SettlementPrepared`または`RefundPrepared`以後は新しい non-replay slashを受けない。 bond funding、slash appeal、slash decisionはそれぞれversion 1 canonical bodyとsigned envelopeを持つ。 funding bodyはnetwork/worker/funding event/asset/exact amount/finalized epoch、appeal bodyはnetwork/worker/ offense/assignment/appeal ID/submitted epoch、decision bodyはnetwork/appeal/offense/outcome/decided epochを bindする。network-scoped bond authority registryはkey validity/revocation、funding/appeal/decision capability、 weak key、strict Ed25519を検査し、raw constructorを持たないverified typestateだけをstoreへ渡す。 appeal submissionはstored pending slashとinclusive appeal deadlineを照合する。signed `submitted_epoch`と registry verification epochの両方が`applied_epoch..=appeal_deadline`内でなければならず、後者をdurable `accepted_epoch`として保存する。decision deadlineは`accepted_epoch + 100`である。authority-signed `Uphold`/`Reverse`はsigned `decided_epoch`とdecision verification/acceptance epochの両方がdeadline以下で だけ受理し、claim statusを更新してassignment全claimのallocationをatomicに再計算する。期限を過ぎても decisionがなければ`finalize_stale_slash_appeal(current_epoch > decision_deadline)`がdomain-separated default decisionを作ってdeterministically upholdする。offenseごとのappealは1件だけで、first stored signed/default decisionが勝つ。stored canonical appeal/decisionのexact replayは期限後もidempotent、distinct second appealやconflicting later decisionはfatalである。 `ExternalEscrowTermsV1` canonical order は `version:u16, network_id, escrow_nonce, funding_authorization_id, prompt_commitment, ExecutionConstraintsV1, required_reward:u64, demand_bonus_amount:u64, demand_bonus_bps:u32, protocol_fee:u64, failure_reserve:u64, issued_epoch:u64, expires_epoch:u64`。 ```text escrow_reference = H("external-escrow/v1", encode(terms)) ``` external authorityはnetwork-scoped Ed25519 keyにfunding、demand-weight、terminal capabilityを分離する。 key validity/revocation、weak key、strict signatureを検査し、次のraw constructorを持たないtypestateを作る。 - `VerifiedFundingAttestation`: escrow reference、funding authorization ID、asset、exact finalized amount/epoch - `VerifiedDemandWeightGrant`: escrow/funding attestation、grant/policy/asset、funded bonus amount/bps、 issued/expiry interval(v1 bonus上限5,000 bps) - `VerifiedTerminalConfirmation`: escrow、payment command、rail confirmation、asset、exact settlement/refund distribution、confirmed epoch schema-v4 durable external pathはexact funding+grantから`Funded` escrowを作り、scheduler-signed External request、typed k=2 pair、stable payment commandへ進む。settlement confirmationはcommand/distribution/ pair/asset/epochを照合し、terminal state、maturity source、両worker assignment bondのrelease/link、 `WorkTicketV2` insert、source consumptionを一SQLite transactionでcommitする。refund commandはstate 1..3 (`Funded|Assigned|EvidenceReady`)からterms expiry後に作成でき、pairの有無を問わない。refund confirmationは terminalとeligible assignment bond releaseを一SQLite transactionでcommitし、maturity/ticketを作らない。 pending slash claimを持つbondは解決までreleaseせず、解決後に残額だけをreleaseできる。exact confirmation replayは idempotentで、逆terminal、amount、identityのconflictを拒否する。 settlement commandを`SettlementPrepared`へcommitする同じ`BEGIN IMMEDIATE` transactionで、pair両assignmentが active state 0かつpending/upheld/default-final slash claimなしであることをpreflightする。 `SettlementPrepared`と`RefundPrepared`(state 4/5)はどちらもnon-replayのlate slashを拒否するため、 terminal準備とslashの順序で結果が変わらない。 これはexternal authorityが「rail上のfinality」を正しく署名するというtrust boundaryである。crateは payment railを操作せず、rail transactionとSQLite commitのdistributed atomicityを主張しない。 ## 15. Encrypted verification bundle and restart restoration `VerificationBundleV1`はcanonical Receiptのprivate openingをrestart後もstrict verifyするためのartifactで、 Receipt wire format自体は変更しない。audit keyはcaller-owned raw 32 bytes、nonzeroで、bundleには含めない。 public sectionのcanonical order: 1. `version:u16 (=1)` 2. `receipt_binding:Hash32` 3. `receipt_id:Hash32` 4. `verification_epoch:u64` 5. scheduler key snapshot: `network_id, verifying_key, valid_from_epoch, valid_through_epoch, revoked_at_epoch:Option` 6. `LP(RuntimeManifest canonical bytes)` 7. `LP(portable ExecutionEvidence canonical bytes)`(schedule/CU/trace witness) worker public keyはpublic sectionへ置かない。private sectionのcanonical order: 1. `LP("MISAKA/PALW/PRIVATE-OPENING")`, `version:u16 (=1)`, `public_digest:Hash32` 2. `LP(SignedJobRequestV1)`, `LP(SignedAssignmentV1)` 3. worker `verifying_key`, `owner_commitment`, `worker_credential_id` 4. `output_nonce`, `u64be(prompt_token_count)`, `u32be(prompt_token_id_i)*` 5. `LP(CanonicalOutput)`(generated token IDsとstop reason) 6. `owner_salt` private signing-key seedはどのsectionにもserializeしない。 ```text receipt_binding = H("verification-bundle-receipt/v1", canonical_signed_receipt) public_digest = H("verification-bundle-public/v1", canonical_public_section) aead_key = H("verification-bundle-aead-key/v1", raw_audit_key) aad = H( "verification-bundle-aad/v1", "XCHACHA20-POLY1305;KEY=256;NONCE=192;TAG=128", receipt_binding, public_digest, nonce, canonical_public_section ) ``` envelope canonical order: ```text LP("MISAKA/PALW/VERIFICATION-BUNDLE") || u16be(version=1) || u16be(cipher=1) || receipt_binding || public_digest || nonce:24-byte || LP(canonical_public_section) || LP(XChaCha20-Poly1305 ciphertext_and_tag) ``` nonceはOS CSPRNGのnonzero 192-bit値、AEAD keyは256 bit、tagは128 bit。envelopeは64 MiB、public sectionは48 MiB、private plaintextは16 MiBを上限とし、strict decode/re-encode、receipt/public binding、 AEAD authenticationを検査する。 ```text bundle_id = H("verification-bundle-id/v1", canonical_complete_envelope) ``` local restart pathはembedded scheduler/worker snapshotsを使ってcomplete stateless verificationを再実行し、 既存schema-v4 DB rowのcanonical Receipt/runtime instance/original acceptance epochへexact restoreする。 missing DB rowを新規acceptしない。これはlocal continuity modeであり、embedded snapshotはthird-party network authorityではない。 bundle public sectionのhistorical `verification_epoch`はoriginal acceptance時点をbindする。 `verify_bundle_and_restore_at_epoch`はcaller-selected current epochがhistorical値以上であることを要求し、 同じbundle/openingをfresh epochで再検証したうえでoriginal durable acceptance epochを保持してrestoreする。 ただし、このlocal APIはembedded snapshotsを使うためbundle作成後のrevocationを学習できない。future audit restoreではcurrent epochをbeacon以上にする。rollbackは拒否する。現行 `palw-verify-bundle` CLIはhistorical default pathで、fresh epoch overrideはlibrary APIだけが公開する。 external stateless pathはexpected network、independent scheduler registry、independent signer registry、 approved manifest hashを必須にし、embedded snapshotとのexact equalityも検査する。default APIはhistorical epoch、`verify_bundle_stateless_at_epoch_with_trust`はrollbackしないcaller-selected fresh epochで検証する。 DB reservationを行わず、network acceptanceを主張しない。production restartではcurrent external trust rootsと 既存DB continuityを同時に検査する`verify_bundle_and_restore_at_epoch_with_trust`を使う。 Receipt CLIは`--prompt-stdin --audit-key-file RAW_32_BYTE_KEY`を必須とし、`--prompt TEXT`を受けない。 key fileはoutput directory外のowner-owned single-link regular file、mode `0400`/`0600`、exact 32 bytesで なければならない。issuance output directoryは`0700`、Receipt/公開JSON/completion markerは`0644`、 bundle/DBは`0600`。DB WALを`TRUNCATE` checkpointしてmain DBを`fsync`し、各artifactを`fsync`した後、 `misaka.palw.receipt-set.v2` markerへ`receipt_id`、`bundle_id`、公開JSON bytesのSHA-256を記録して最後に 書き、directoryを`fsync`する。local verifier CLIは`--public-json`も必須とし、protected artifactsが同じ owned `0700` directoryにexpected filename/modeで存在すること、marker、typed公開JSON `misaka.palw.public-receipt.v2`全体を検査する。 保持する`artifacts`と`observer_summary`はauthenticated bundle manifest/evidenceから再構成してexact照合し、 extra JSON fieldはobjectの全階層で拒否する。 marker-lastはpartial setをcompleteとして受理しないためのgateであり、cross-file atomic transactionでも authenticity proofでもない。markerはunkeyed plain textなのでsame-owner writerはJSONとmarkerを一緒に 置換できるが、改変JSONはReceipt/bundleとの照合に失敗する。canonical Receipt/authenticated bundleだけが protocol authorityである。 ## 16. Security and issuance boundary trace root は approved observer が報告したeventへのcommitmentであり、単独のproof of executionでは ない。intended production safety modelはpinned build、signed assignment、independent replica、future audit、bond/slashing、durable uniquenessを組み合わせるが、個別primitive/state machineの存在はそれらが operationally統合済みであることを意味しない。 schema-v4 coreはscheduler-signed canary precommit、authority-signed bond funding/appeal/decision、durable assignment lock/release/slash/health、authority-signed external funding/grant/terminalを実装する。bonded receipt acceptance、audit/canaryのtyped slash、maturity時bond release/link、WorkTicketV2 gate、External terminalから maturity/ticketまでのlocal atomic transactionも実装済みである。 ただしproduction scheduler/network transport、governance-backed scheduler/worker/beacon/bond/external key distribution、finalized beacon delivery、independent auditor execution/opening delivery、実payment railと authority serviceはこのrepositoryにない。署名済みfunding/terminalは外部factのauthenticated statementで あり、crate単体が実collateralやrail movementを独立証明するものではない。railとSQLiteはdistributed atomic transactionではない。durable slashへ自動接続済みのproofはaudit mismatch/timeoutとcanary mismatch/receipt timeoutで、invalid-manifest、equivocation、duplicate-executionのproduction proof constructor/orchestrationは未統合である。legacy in-memory `BondLedger`/`CanaryRecord`/`ExternalEscrow` helperの raw mutation APIをproduction authority pathとして使ってはならない。 現時点で実モデルReceiptを発行できるのはApple Metal `GraphFallback` runtime classである。CUDAは RTX 4060 Ti sm_89 / CUDA Toolkit 13.3.1 / nvcc 13.3.73で固定Qwen 37/37 layer offload、graph observer 6/6、standalone true-accumulator primitiveの最終grouped device suite 8/8とproducer 20/20同一fingerprintに 加え、vendored MMVQ/FA-off attention same-backend 1-token diagnostic E2Eで361/361 recordと3回同一 fingerprintを実測済みである。exact entry/cubin/DSO release manifest、Receipt/RuntimeManifest/Request/ Assignment V2、暗号化Bundle V2、SQLite V2も実装・検証済みである。これはproduction `KernelSketch` acceptanceではなく、authority-derived canonical IDを使うlive callbackとauthority governanceは未完了である。 V1 builder/verifierとproduction macro/CMake gateはfail closedを維持するため、 これらが完了するまでproduction CUDA Receipt/Work Ticketを発行しない。TEE attestationやZK/VCは 実装範囲外である。