Skip to content

feat(kernel): ship the recurring Gmail draft delegation proof (#130) - #178

Merged
George-RD merged 3 commits into
mainfrom
change/ship-recurring-gmail-draft-proof
Aug 14, 2026
Merged

George-RD merged 3 commits into
mainfrom
change/ship-recurring-gmail-draft-proof

Conversation

@George-RD

@George-RD George-RD commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Closes #130.

The first complete vertical delegation proof: a recurring Gmail draft now runs end to end in the runtime — propose → evaluate → review → activate → scope-match → create one real draft → receipt → controls — and falls back before effect on erasure, drift, budget, pause, expiry, revocation, an unresolved counterparty, or a fenced retry.

What shipped

  • Counterparty erasure is a store-level admission predicate (D-167). The committed erased_counterparties marker is read before admission (api/scoped_admission.rs:222, api/actions.rs:554) and again inside the same BEGIN IMMEDIATE that selects, reserves, and claims a fired token (store/standing_rules_scoped.rs:137-144, store/standing_rules_fired_token.rs:82-96). The erasure transaction sweeps generic reviewed-scope Counterparty values across every persisted standing rule, including owner-review-created rows with no learned_artifacts provenance. A digest check cannot substitute: erasure leaves the reviewed-scope digest unchanged.
  • Repeated-approval evidence is typed (D-168). DelegationEvidence::repeated_approvals replaces the raw (artifact_id, action_id) audit-row count, grouped by complete context-class digest and deduplicated on decision_event_id. The old count is removed, not left beside it.
  • Miner reviews bind their exact evaluation (D-169). The miner reaches owner review only through the shared artifact.propose evaluation core and only on a passing receipt; the review carries an evaluation_binding re-verified inside the activation transaction (store/activation.rs:199-235), not in a preflight-only check.
  • Owner approval mints a fresh activation grant (D-170) rather than inheriting the miner's attenuated envelope.
  • Lifecycle refusals surface as refusals (D-171), never as successful or replayed decisions.
  • email.send joined the catalog's non-delegable data, characterized at all three readers.
  • The three-column reachability census is now a shipping precondition (D-172).

Review

Two independent adversarial reviewers ran over the diff plus the OpenSpec artifacts before this PR.

Correctness/security lens — APPROVE_WITH_NITS. The one merge-blocking class (activation-transaction guarantees) is clean on all four sub-questions: the empty-verdict-set hole in reject_stale_eval_verdicts is unreachable because presence and exact identity are strictly upstream in both the preflight and the transaction; a non-pass bound verdict refuses at both layers; comparison is against the review's immutable binding rather than its own bytes; and the early tx.commit() carries only the refusal audit. The fresh owner grant is genuinely composed with no fallback to the source grant. The erasure read is inside the reservation transaction, and the marker insert and the sweep are the same transaction, so there is no window. claim_pending_draft_write has no TOCTOU (BEGIN IMMEDIATE takes the write lock before the existence check). Its four findings are all FOLLOW-UP-ISSUE and are filed: #173, #174, #175, #176.

Simplicity/scope/spec-fidelity lens — REQUEST_CHANGES, now addressed. Every finding was verified against source and fixed in this PR:

  • Six cited test names did not exist. Two are now real, mutation-verified tests: catalog_email_send_is_non_delegable (dropping email.send from with_non_delegable moves the refusal to the policy-deny axis and the test fails) and unresolved_counterparty_falls_back_via_action_api (deleting the guard still yields ApprovalRequired, so the test binds on the guard's own audit reason — a reason-free assertion survives and is not evidence). Four were renamed or fabricated citations, corrected to the existing tests.
  • The scoped reservation transactional recheck census row is now recorded UNPROVEN / latent instead of crediting the pre-transaction check's test twice. The recheck is landed and read-verified, but no production-entering test can reach it while the earlier check refuses first on the same identity; reaching it needs a marker committed between the two reads, which has no test seam today. Filed as Add test seams for the two UNPROVEN in-transaction erasure rechecks and the Telegram callback pending-write fence #177 with the Telegram callback fence row.
  • A dropped concurrency clause was restored to the standing-rules MODIFIED body, dropped Test: anchors were restored to the retained reflection-miner scenario, and a scenario duplicated from an untouched sibling requirement was removed from the responsibility-contract delta — canon must not carry the same normative statement twice.
  • A duplicated retry-fence requirement was collapsed: the normative home is the standing-rules requirement "Pending Gmail writes MUST fence retries before budget reservation" (predicate: a matching pending row, matching store/pending_draft.rs), and digest-bound-draft-approval now cross-references it instead of asserting a narrower DeliveryUnknown predicate. Scenario count unchanged at 18.
  • Drifted api/actions.rs citations were re-derived, design.md's module path for verify_miner_evaluation_binding was corrected, D-167 and D-168 were corrected where they overstated a single call site and misdescribed the removed predicate, and the activation-grant and lifecycle-refusal work is now disclosed in proposal.md.

Deliberately open task rows

Three rows in tasks.md land open and disclosed:

  1. email.create_draft action-API regression proving it never falls back to action-keyed consult_standing_rule_gate — no named test exists; the production guard is present but this control is unproven.
  2. Before/after scenario-and-body diff record — no separate diff artifact is stored in the change.
  3. Capability-map regeneration — explicitly a post-archive obligation, done in the follow-up archive PR.

Verification

./scripts/check.sh ship-recurring-gmail-draft-proofAll checks passed. (fmt, clippy -D warnings, workspace tests, file sizes, claims register, OMP ceremony, strict OpenSpec validation).

The three named proof tests pass by exact name: scoped_allow_returns_responsibility_receipt (positive: one real draft against the mocked Gmail endpoint plus a responsibility receipt rather than an approval prompt), erased_counterparty_scoped_admission_falls_back_to_owner_approval (fallback), pending_delivery_unknown_fences_scoped_retry_before_reservation (control).

CI fails in seconds with a GitHub Actions billing/spending-limit error; that is not a code signal. Local gates plus the two reviewer passes are the effective gate.


Summary by cubic

Ships the first end-to-end reusable Gmail draft delegation path and hardens admission, activation, and lifecycle handling. Previously, reusable drafts lacked store-level erasure checks, evaluation-binding enforcement, and retry fencing; now the runtime admits, scopes, drafts, and falls back with durable receipts and fences.

  • Counterparty erasure is a store-level admission predicate read before admission and again inside the reservation transaction; selection falls back to owner approval, and startup sweeps erase-reviewed counterparts across persisted rules.
  • Repeated-approval evidence is typed and deduplicated by decision event; the old raw count is removed.
  • Miner-originated reviews bind the exact artifact.propose evaluation; activation re-verifies the immutable binding and mints a fresh owner grant instead of inheriting the miner’s.
  • Lifecycle refusals surface as refusals; pause/resume return typed outcomes and concurrent lifecycle intents write a single transition audit.
  • Catalog marks email.send as non-delegable; the propose path refuses it before any review surface exists.
  • Scoped admission for email.create_draft adds unresolved/erased-counterparty fallbacks and returns a ResponsibilityReceipt on allow; draft writes use a stable request fingerprint to fence retries, treat timeouts as delivery-unknown with a durable pending row, fence subsequent identical requests before reservation, and notify the owner.
  • Activation commits compose the owner-approval transition and the evaluated activation to avoid partial state; injected failures keep review-required state. Audit append is modularized; verdict-staleness checks run at activation. Tests add evaluation-binding mutations and an audit-append fault injector.
  • Decision log records D‑167..D‑172 and OpenSpec artifacts and tests are aligned.

Rollout and review

  • Migration: adds pending_draft_writes.request_fingerprint (no backfill). Legacy pending rows do not fence; only new writes are fenced.
  • Reviewer focus: store/activation.rs (transactional evaluation-binding recheck and fresh grant), api/scoped_admission.rs (unresolved/erased-counterparty checks and admission receipt), and store/pending_draft.rs (fingerprint and retry fence). action_catalog.rs now treats email.send as non-delegable.

Written for commit 6ac963a. Summary will update on new commits.

Review in cubic

Cover action catalog and scoped admission, approval and owner-review pipelines, miner runtime and artifact stores, plus regression coverage and OpenSpec bookkeeping.
Replace fabricated capability and census test names with the existing owner-path tests, and close the verified process and evidence checklist rows.
Complete the first vertical reusable-delegation proof: counterparty erasure
becomes a store-level admission predicate consulted inside the reservation
transaction and swept across every persisted standing rule; repeated-approval
evidence becomes typed and decision-event-deduplicated; a miner proposal
reaches owner review only through the shared evaluation core carrying an
immutable binding re-verified inside the activation transaction, which mints a
fresh owner grant instead of reusing the miner's; lifecycle refusals surface as
refusals; and email.send joins the catalog's non-delegable data.

Record D-167..D-172. Address a pre-merge adversarial review pass:
- add catalog_email_send_is_non_delegable and
  unresolved_counterparty_falls_back_via_action_api, both mutation-verified
- correct six fabricated/renamed test citations in the reachability census
- mark the scoped reservation transactional recheck UNPROVEN rather than
  crediting the pre-transaction check's test twice (D-172)
- restore a dropped concurrency clause and dropped Test anchors in the
  MODIFIED spec bodies, and drop a scenario duplicated from an untouched
  requirement
- refresh drifted api/actions.rs citations and disclose the activation-grant
  and lifecycle-refusal work in the proposal
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 160 files, which is 60 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 41476be3-eb6a-4bb6-947e-cae41befffa7

📥 Commits

Reviewing files that changed from the base of the PR and between 8a2afeb and 6ac963a.

📒 Files selected for processing (160)
  • .raw/openspine-decision-log.md
  • crates/openspine-kernel/src/action_catalog.rs
  • crates/openspine-kernel/src/action_catalog_tests.rs
  • crates/openspine-kernel/src/api/actions.rs
  • crates/openspine-kernel/src/api/artifact_propose.rs
  • crates/openspine-kernel/src/api/artifact_propose_miner_binding_tests.rs
  • crates/openspine-kernel/src/api/artifact_propose_miner_grant_tests.rs
  • crates/openspine-kernel/src/api/artifact_propose_miner_grouping_tests.rs
  • crates/openspine-kernel/src/api/eval_gate_production_tests.rs
  • crates/openspine-kernel/src/api/mod.rs
  • crates/openspine-kernel/src/api/model_swap_fault_tests.rs
  • crates/openspine-kernel/src/api/scoped_admission.rs
  • crates/openspine-kernel/src/api/scoped_admission_outcome_tests.rs
  • crates/openspine-kernel/src/api/scoped_admission_tests.rs
  • crates/openspine-kernel/src/overlay_startup_tests/integrity.rs
  • crates/openspine-kernel/src/pipeline/approval.rs
  • crates/openspine-kernel/src/pipeline/approval_draft.rs
  • crates/openspine-kernel/src/pipeline/artifact_activation.rs
  • crates/openspine-kernel/src/pipeline/mod.rs
  • crates/openspine-kernel/src/pipeline/owner_review.rs
  • crates/openspine-kernel/src/pipeline/owner_review_commands.rs
  • crates/openspine-kernel/src/pipeline/owner_review_decision.rs
  • crates/openspine-kernel/src/pipeline/owner_review_lifecycle_adapter_tests.rs
  • crates/openspine-kernel/src/pipeline/owner_review_telegram.rs
  • crates/openspine-kernel/src/pipeline/owner_review_tests.rs
  • crates/openspine-kernel/src/pipeline/post_approval.rs
  • crates/openspine-kernel/src/pipeline/tests/approval.rs
  • crates/openspine-kernel/src/pipeline/tests/approval_draft_reconcile_tests.rs
  • crates/openspine-kernel/src/pipeline/tests/effect_paths.rs
  • crates/openspine-kernel/src/reflection_miner_runtime.rs
  • crates/openspine-kernel/src/reflection_miner_runtime/binding_hooks.rs
  • crates/openspine-kernel/src/reflection_miner_runtime/scheduled.rs
  • crates/openspine-kernel/src/store/activation.rs
  • crates/openspine-kernel/src/store/audit_append.rs
  • crates/openspine-kernel/src/store/audit_support.rs
  • crates/openspine-kernel/src/store/audit_support_tests.rs
  • crates/openspine-kernel/src/store/eval_verdict_currency.rs
  • crates/openspine-kernel/src/store/eval_verdict_store.rs
  • crates/openspine-kernel/src/store/learned_artifacts.rs
  • crates/openspine-kernel/src/store/learned_artifacts_tests.rs
  • crates/openspine-kernel/src/store/migrations.rs
  • crates/openspine-kernel/src/store/mod.rs
  • crates/openspine-kernel/src/store/pending_draft.rs
  • crates/openspine-kernel/src/store/proposed_artifacts.rs
  • crates/openspine-kernel/src/store/reflection_miner_support.rs
  • crates/openspine-kernel/src/store/standing_rules_activation_tests.rs
  • crates/openspine-kernel/src/store/standing_rules_fired_token.rs
  • crates/openspine-kernel/src/store/standing_rules_lifecycle.rs
  • crates/openspine-kernel/src/store/standing_rules_lifecycle_tests.rs
  • crates/openspine-kernel/src/store/standing_rules_pause_tests.rs
  • crates/openspine-kernel/src/store/standing_rules_scoped.rs
  • crates/openspine-schemas/src/action.rs
  • crates/openspine-schemas/src/owner_review.rs
  • crates/openspine-schemas/src/owner_review_tests.rs
  • crates/openspine-schemas/src/reflection_miner.rs
  • crates/openspine-schemas/src/reflection_miner_payload.rs
  • crates/openspine-schemas/src/reflection_miner_tests.rs
  • crates/openspine-schemas/tests/responsibility_review_support/mod.rs
  • crates/openspine-shell/src/agents/main_assistant/tests.rs
  • graphify-out/.graphify_labels.json
  • graphify-out/2026-08-08/.graphify_labels.json
  • graphify-out/2026-08-08/GRAPH_REPORT.md
  • graphify-out/2026-08-08/graph.json
  • graphify-out/2026-08-08/manifest.json
  • graphify-out/2026-08-14/.graphify_labels.json
  • graphify-out/2026-08-14/GRAPH_REPORT.md
  • graphify-out/2026-08-14/cost.json
  • graphify-out/2026-08-14/graph.json
  • graphify-out/2026-08-14/manifest.json
  • graphify-out/GRAPH_REPORT.md
  • graphify-out/cache/ast/v0.9.10/053e0955a7f8bebedd502ddb497b7994433198f9eb261758104ccf67ca90c8c4.json
  • graphify-out/cache/ast/v0.9.10/0a615a6eaa6ca3841fb18320b6477477313923992b236ac58e43cd32114b126f.json
  • graphify-out/cache/ast/v0.9.10/0afd5035d5009cf0bfa34fa9d6f9cdeeacca2e1a8cef5025a5ec0dbd19c87434.json
  • graphify-out/cache/ast/v0.9.10/0bd012c9d9f2bd4df43e3b6a38137f343acfca41b10874faf2c0cc776bdf8b6f.json
  • graphify-out/cache/ast/v0.9.10/0ff3564f1e8bf2ffdad9448fe605f5f7df2e64853e622918465054ab0d2d8307.json
  • graphify-out/cache/ast/v0.9.10/13a98e984e87e68c6f1161426f649459c3325272eecb65cef9c9c3b2d2782c43.json
  • graphify-out/cache/ast/v0.9.10/1db621a5e0cf31cf2950e76b43f7c7781b1cfe442acf1e1040e828747d6c17c0.json
  • graphify-out/cache/ast/v0.9.10/1ee40ff8bfc5981c4a79c58f1bf0dd757e997795a122111167a747198a3f3105.json
  • graphify-out/cache/ast/v0.9.10/210ed62adedaf65e3b6ed1e0a6faf9797c0d83e0a3bfcb2bdcf2486f27932c0d.json
  • graphify-out/cache/ast/v0.9.10/214035a21a9a69be9fc25bff11c0da6bc457f0556928acbb66d5f7096f5c65c8.json
  • graphify-out/cache/ast/v0.9.10/21f6e50e88df4f61b38f1022c9f1bd58cd23a4eb74c2d5f411bbd3c9c3fd3678.json
  • graphify-out/cache/ast/v0.9.10/26d8954548db7735ff3ed4bb8ca976ce3dcb052296f7fe5a6406e6d94f93a18d.json
  • graphify-out/cache/ast/v0.9.10/28882843b82f5023bf129cf7bde1d6d4b7c72c0b17b8308127542da521e1d035.json
  • graphify-out/cache/ast/v0.9.10/2a4e9b5dfa24a753d87cd51122c1c36a302b2888a08637ad9acf9a32d4f796a7.json
  • graphify-out/cache/ast/v0.9.10/2ad09a352dced2da2f6a845578dbdee992608ed6cf663f0634571b163476a9df.json
  • graphify-out/cache/ast/v0.9.10/2f37b3429ea8a1b2b79092b666048c9a999362167bc391d5767f0f1e2f369905.json
  • graphify-out/cache/ast/v0.9.10/36cbf0c8978ab7b32532be2981c0f9c49c2b79daa3b4721960c406e082d68103.json
  • graphify-out/cache/ast/v0.9.10/36da04a8663f8c91048109cb9e58fe265f2f0d5e1999afe6089b37a121e038aa.json
  • graphify-out/cache/ast/v0.9.10/3bec45e274f05aa41801617c97765b2336935e655ca42565ec2b88c7372ab57b.json
  • graphify-out/cache/ast/v0.9.10/3d10d611ab7753c4eca84ec06b33469e1863a6bd6f2055145405c751efc6818a.json
  • graphify-out/cache/ast/v0.9.10/451cb235150b7713338c0212485b494b22c6316863cb64eeb3f9488821550bf1.json
  • graphify-out/cache/ast/v0.9.10/45f26f64a0f8dff1d02f51682f12abefcdbcc111a04c7b17c475e11fbeaa3c9b.json
  • graphify-out/cache/ast/v0.9.10/49a5205fd24bfbec9e4d5e1c8d50279d225935ef1f9d3581259cade9c79c89ca.json
  • graphify-out/cache/ast/v0.9.10/4a1b9d2a8eeb82bc9c5aa537900bd08fb4ad345f808a3524ca695e3e0d482871.json
  • graphify-out/cache/ast/v0.9.10/4d6c75812ef43071601c577f2024de663609f59859a831fd0aeae2cbf024ea0d.json
  • graphify-out/cache/ast/v0.9.10/55bb5d59ff6eb9e836437fe474fc9373cb8c1208ccf91e85cf222052e7f7ad94.json
  • graphify-out/cache/ast/v0.9.10/55dda25e773648a2fc6b7e27fb3eeb78761b40e7bb22484438d9028ff24bcd2e.json
  • graphify-out/cache/ast/v0.9.10/5618ca4eb65383fd4488a982a5c6e6cc0523ffd80e4c442c7b9f6c6eff4328d3.json
  • graphify-out/cache/ast/v0.9.10/56c5fb7975378d55cf7aab855f1c8bde8242bcca87a4e5916151c962fd2cab51.json
  • graphify-out/cache/ast/v0.9.10/595a59fbda604e5fcb2998cec7c8ae139fe93aa33d427eb4378fd415ec6e00c1.json
  • graphify-out/cache/ast/v0.9.10/5d5929e6a8e8d9be6fb183e3593db335169e80c96ea9cfbbc9bb67729c348b0c.json
  • graphify-out/cache/ast/v0.9.10/5ea41c3c6527f64da52987c325521f96b61b986de03decb8cb4db5e869da9212.json
  • graphify-out/cache/ast/v0.9.10/631ea767583b338327d0ca11b91de0f4b492e50540928ebec68ab1231750b4d3.json
  • graphify-out/cache/ast/v0.9.10/668ab9ca53ab651851a5bf7c135d69e24bbc3832ccb9a9e9c70149b474bb3712.json
  • graphify-out/cache/ast/v0.9.10/6efe14a325209d783a173154be60a207c5fb01ebbfa8a121da3a5b94ba229533.json
  • graphify-out/cache/ast/v0.9.10/6fa4a5208a5fe912b40ccf57756041de5cee61877d4f9a302bc25474d7eb53fb.json
  • graphify-out/cache/ast/v0.9.10/7494473323525ccce271b129dc7ca1cf14962ab129b192ac1baddb8fd8475de3.json
  • graphify-out/cache/ast/v0.9.10/7944b804a4cc232c44a54536cbf7c31be09738c7a81720a0e988129039fd725a.json
  • graphify-out/cache/ast/v0.9.10/7afca2aec7bf4992d9cb7ff99a3c6457b454c27f99381adfb734529e8c71f6d1.json
  • graphify-out/cache/ast/v0.9.10/7b90cd8bd32ab3278ce66d66cade153aead653ccb2d366e131d20fb51cb984c4.json
  • graphify-out/cache/ast/v0.9.10/7bb62d61cee0a78dbf1a749188028c639a3ffe7d0ad3e1539925096e7380e7bf.json
  • graphify-out/cache/ast/v0.9.10/81d22ae525064b4b49283384e7fe94a3765ff114c1fd0f83d1ddb3e3e9122066.json
  • graphify-out/cache/ast/v0.9.10/847153b2684a96143ab051c5ff82d2aa85619c91376f2a8d7c095dd9124597bc.json
  • graphify-out/cache/ast/v0.9.10/8afb2d5b7cb212121617ee4fe0c5aa5efba4f73df7e9d0fd8b53d43e0b6af3f2.json
  • graphify-out/cache/ast/v0.9.10/8b540a26bdafbfebfe0a16a9475dd8a69e623729023fa370015c269c354a89e9.json
  • graphify-out/cache/ast/v0.9.10/91cb917ab08e849c7bee173f906a17ada17297a08a0a2e432f2d76d45826dfd1.json
  • graphify-out/cache/ast/v0.9.10/96356119344ba306415fd771c80f01d3f1987da0e1368e86b81cab4208653761.json
  • graphify-out/cache/ast/v0.9.10/99b813537f6fa1b06b88ce44cb8f6564cb82ebb049d8a4e8844c3af02b0c796d.json
  • graphify-out/cache/ast/v0.9.10/9d25afef7630d38b6acb620df6ae81f4a2fd146b1605e0e34deafe5f4d4b890f.json
  • graphify-out/cache/ast/v0.9.10/9f789f478f5f445b2b463e88d5a9299002bb941663ad88ccece73847cf76b6ec.json
  • graphify-out/cache/ast/v0.9.10/9fac36ed286149d65991719b6f68a665e7dd225387139d79e96b957525c4ea65.json
  • graphify-out/cache/ast/v0.9.10/a36c9d2d4fd4ba35905cef3a7ee581efe43d879318308f9cbc7a0290f0352d12.json
  • graphify-out/cache/ast/v0.9.10/a5ec347ffb24fde2bffa7258327833e03f406e2beee6dbd78b5b709c32eecfc1.json
  • graphify-out/cache/ast/v0.9.10/a9509da0aea629c2fda2b64cd4899ab413712edd4ebb33357b22384ce6101fbd.json
  • graphify-out/cache/ast/v0.9.10/a97e7d080c970e78de072861400d35a6e383595b163b36d1a7ff727853328385.json
  • graphify-out/cache/ast/v0.9.10/a9a5107bd0c880a3562f4176aa259331a5554166d04d5de8232e3a7150bdae96.json
  • graphify-out/cache/ast/v0.9.10/af155b49523f8df58a530c4b7975f3ce7ed7927e30df8a0cb3a5e2c6410b6f75.json
  • graphify-out/cache/ast/v0.9.10/b05130a9985e88da19e682d092be0de3b5b71fc7ebd4c450d2b6b20d223f30f9.json
  • graphify-out/cache/ast/v0.9.10/b679d4c0148b86db291a72e73d526011250ead268b5135fa03b7e71db8f17189.json
  • graphify-out/cache/ast/v0.9.10/bfc11c937d2c3a8a1ad42e1eb12a7e8fdb89a81fbe88dc2dd4cd290b7d412a01.json
  • graphify-out/cache/ast/v0.9.10/c221f7f8362394d19a1ded82a2ef12f7a4f17aaea0986f7428ac67dc2bccccca.json
  • graphify-out/cache/ast/v0.9.10/c54a053a07e9993d6a349e8855b3a3a5b2ba771e0f8611a339bc77daffffe992.json
  • graphify-out/cache/ast/v0.9.10/cb165f05d33b5218af7d1b44204e03be0e7b05c533683f6787c8b2d9dac7a4ec.json
  • graphify-out/cache/ast/v0.9.10/cf03e2f85f68bfe093d65d0be5ce0b37ec06b50725caaa2a5a62a3d5149182ad.json
  • graphify-out/cache/ast/v0.9.10/cf58d414eed37a6feaf6c34d0920e4b6f6e4db53420c38e46d33ff42d0939705.json
  • graphify-out/cache/ast/v0.9.10/d0979b8db912db66b5c5575389aeb26d6d881fd3839e2373bfafd706c861bde6.json
  • graphify-out/cache/ast/v0.9.10/d5467cf99d67a3f2060e75851651e6d61c8b5e4dc8a799efb9b12e336ffa47ef.json
  • graphify-out/cache/ast/v0.9.10/d6a229b43e5cd68c0b66727fc66e29daf9960823102d353bd5a2f1ea06f70f7a.json
  • graphify-out/cache/ast/v0.9.10/d9a90be444b5749c5ac4575930ece0071b6fc88ebdd2b999cfa0239375912769.json
  • graphify-out/cache/ast/v0.9.10/de22c1a745e8b9551b2b95d253c2fc60f40ca75812688747ddd01ba175d39ad8.json
  • graphify-out/cache/ast/v0.9.10/de460987a011f808aac13a8feaa873184ea504ca634bb370448f104f767e69b6.json
  • graphify-out/cache/ast/v0.9.10/dfd9ceef87218a624cc903358f136632ba3470e7d7f5c510d2370e56939f8dc1.json
  • graphify-out/cache/ast/v0.9.10/e05f3630925b339817d08e06c982c0dcd73f453181c2f9257bdbdef277d6dda7.json
  • graphify-out/cache/ast/v0.9.10/e5d61a4880299103f9f430de77ddf38a5088597c094062babf880350f3a605d9.json
  • graphify-out/cache/ast/v0.9.10/ee36ca96807d177ffda01f2beab1c90f05fc26595cb6b3be80f754ae6b71e95b.json
  • graphify-out/cache/ast/v0.9.10/f0101e3798b2a9d2375e5a011d260770c1121738d8d8a1114bd4794ae2d235d5.json
  • graphify-out/cache/ast/v0.9.10/fa039a316ce7a3fb2b8dbe130a8f4b370e10ad36db6629e908ea3df82b5ef7fd.json
  • graphify-out/cache/ast/v0.9.10/fd4d9f9c1b384041e8f8376f4493e288b4113a885fb454e368f02aea163cdc42.json
  • graphify-out/cache/stat-index.json
  • graphify-out/graph.json
  • graphify-out/manifest.json
  • openspec/changes/ship-recurring-gmail-draft-proof/.openspec.yaml
  • openspec/changes/ship-recurring-gmail-draft-proof/design.md
  • openspec/changes/ship-recurring-gmail-draft-proof/proposal.md
  • openspec/changes/ship-recurring-gmail-draft-proof/specs/digest-bound-draft-approval/spec.md
  • openspec/changes/ship-recurring-gmail-draft-proof/specs/gate-action-api/spec.md
  • openspec/changes/ship-recurring-gmail-draft-proof/specs/reflection-miner/spec.md
  • openspec/changes/ship-recurring-gmail-draft-proof/specs/responsibility-contract/spec.md
  • openspec/changes/ship-recurring-gmail-draft-proof/specs/standing-rules/spec.md
  • openspec/changes/ship-recurring-gmail-draft-proof/tasks.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@George-RD
George-RD merged commit a2ead82 into main Aug 14, 2026
2 checks passed
@George-RD
George-RD deleted the change/ship-recurring-gmail-draft-proof branch August 14, 2026 10:29
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.

Ship recurring Gmail drafts as the first complete delegation proof

1 participant