Owned event types
events.iterate.com/project/createdBirth certificate for this project processor.payload: { config }consumed by 1events.iterate.com/project/custom-domain-add-requestedA custom domain should be provisioned and routed to this project.payload: { hostname }consumed by 1events.iterate.com/project/custom-domain-cloudflare-observedCloudflare custom-hostname status observed for a project custom domain.payload: { cloudflareHostnameId?, error?, hostname, hostnameStatus?, ownershipVerification?, ssl…emitted by 1 · consumed by 1events.iterate.com/project/custom-domain-direct-observedThe hostname routes to this project directly: a platform-owned apex served by worker routes plus an operator-primed hostname-directory registration, with no Cloudflare-for-SaaS custom hostname behind it. Appended by platform operators, never by this processor; recording it keeps the settings UI honest without starting any provisioning lifecycle — add/refresh/remove requests for a direct hostname are inert.payload: { hostname }consumed by 1events.iterate.com/project/custom-domain-provision-failedCustom-domain provisioning failed before an observed Cloudflare status.payload: { error, hostname }emitted by 1 · consumed by 1events.iterate.com/project/custom-domain-refresh-requestedRefresh Cloudflare status for a custom domain.payload: { hostname }consumed by 1events.iterate.com/project/custom-domain-remove-requestedA custom domain should be removed from this project.payload: { hostname }consumed by 1events.iterate.com/project/custom-domain-removedA custom domain was removed from Cloudflare and routing KV.payload: { hostname }emitted by 1 · consumed by 1events.iterate.com/project/egress-rules-configuredReplace the project's egress approval rules wholesale. Every outbound request is matched against the ordered list at the Project DO's egress decision point (first match wins, no match allows): a `hold` verdict parks the request until a human grants or rejects it on this stream, `deny` refuses it outright.payload: { rules }consumed by 1events.iterate.com/project/human-approval-grantedA human approved a held egress request. When the project has active approval keys, `keyId` + `signature` (raw 64-byte r‖s ECDSA P-256 over the canonical approval.v1 message, base64) are required and verified before the request is released.payload: { approvalRequestEventOffset, keyId?, signature? }events.iterate.com/project/human-approval-key-addedEnroll a public key whose holder may grant held egress requests. Once any active key exists, grants MUST carry a valid ECDSA P-256 signature over the canonical approval message (approval.v1) — unsigned grants are ignored. Rejections never require a signature.payload: { keyId, publicKey, label? }consumed by 1events.iterate.com/project/human-approval-key-revokedRevoke an enrolled approval key; signatures from it stop being accepted.payload: { keyId }consumed by 1events.iterate.com/project/human-approval-rejectedA held egress request was refused — by a human, or automatically when its hold expired. Rejections are deliberately unsigned: deny is the fail-safe direction.payload: { approvalRequestEventOffset, reason }events.iterate.com/project/human-approval-requestedAn outbound request matched a `hold` rule and is parked at the egress door awaiting a human. Everything is placeholder form — getSecret(...) references, never material. The requested event's offset IS the held request's identity: grants and rejections reference it as approvalRequestEventOffset.payload: { method, url, headers, body?, secretPaths?, ruleKey, ruleDescription?, streamContext?,…consumed by 1events.iterate.com/project/human-approval-settledWhat actually happened after a granted request was released: the upstream status, or the delivery failure. Approval and outcome are separate facts — audits want both.payload: { approvalRequestEventOffset, status?, error? }events.iterate.com/project/onboarding-completedThe project owner completed the onboarding agent flow.payload: { agentPath }consumed by 1events.iterate.com/project/readyThe project bootstrap saga completed and its default worker is ready.payload: {}emitted by 1 · consumed by 1
Consumes
Consumes * — every event on the stream reaches this processor's reducer, with these types named explicitly:
events.iterate.com/project/egress-rules-configuredReplace the project's egress approval rules wholesale. Every outbound request is matched against the ordered list at the Project DO's egress decision point (first match wins, no match allows): a `hold` verdict parks the request until a human grants or rejects it on this stream, `deny` refuses it outright.events.iterate.com/project/human-approval-key-addedEnroll a public key whose holder may grant held egress requests. Once any active key exists, grants MUST carry a valid ECDSA P-256 signature over the canonical approval message (approval.v1) — unsigned grants are ignored. Rejections never require a signature.events.iterate.com/project/human-approval-key-revokedRevoke an enrolled approval key; signatures from it stop being accepted.events.iterate.com/project/human-approval-requestedAn outbound request matched a `hold` rule and is parked at the egress door awaiting a human. Everything is placeholder form — getSecret(...) references, never material. The requested event's offset IS the held request's identity: grants and rejections reference it as approvalRequestEventOffset.events.iterate.com/project/custom-domain-add-requestedA custom domain should be provisioned and routed to this project.events.iterate.com/project/custom-domain-cloudflare-observedCloudflare custom-hostname status observed for a project custom domain.events.iterate.com/project/custom-domain-direct-observedThe hostname routes to this project directly: a platform-owned apex served by worker routes plus an operator-primed hostname-directory registration, with no Cloudflare-for-SaaS custom hostname behind it. Appended by platform operators, never by this processor; recording it keeps the settings UI honest without starting any provisioning lifecycle — add/refresh/remove requests for a direct hostname are inert.events.iterate.com/project/custom-domain-provision-failedCustom-domain provisioning failed before an observed Cloudflare status.events.iterate.com/project/custom-domain-refresh-requestedRefresh Cloudflare status for a custom domain.events.iterate.com/project/custom-domain-remove-requestedA custom domain should be removed from this project.events.iterate.com/project/custom-domain-removedA custom domain was removed from Cloudflare and routing KV.events.iterate.com/project/onboarding-completedThe project owner completed the onboarding agent flow.events.iterate.com/project/createdBirth certificate for this project processor.events.iterate.com/project/readyThe project bootstrap saga completed and its default worker is ready.events.iterate.com/repos/createdowned by repoThe repo creation saga completed and its backing Artifact is ready — the repo's birth certificate.events.iterate.com/secret/createdowned by secretCreates a secret processor on this stream. The payload is the immutable birth certificate; the DO cross-posts this event to the project root stream, where the project processor catalogs the secret.events.iterate.com/stream/createdowned by coreInitializes the core reduced state for a stream.events.iterate.com/stream/child-stream-createdowned by coreRecords the immediate child stream segment under this stream.
Emits
events.iterate.com/capability-host/createdowned by capability-hostCreates a capability-host processor on this stream. The birth certificate records the scope's `fallback`: the itx expression a capability miss follows (usually straight to the project root host), or null at the root.events.iterate.com/project/custom-domain-cloudflare-observedCloudflare custom-hostname status observed for a project custom domain.events.iterate.com/project/custom-domain-provision-failedCustom-domain provisioning failed before an observed Cloudflare status.events.iterate.com/project/custom-domain-removedA custom domain was removed from Cloudflare and routing KV.events.iterate.com/project/readyThe project bootstrap saga completed and its default worker is ready.events.iterate.com/repos/create-requestedowned by repoRequests the repo creation saga: seed an empty repo, import a private GitHub repo at depth one, or import a public GitHub repo through Cloudflare Artifacts (full history unless depth is set). Terminates in repos/created or repos/create-failed.events.iterate.com/stream/subscription-configuredowned by coreConfigures or replaces a durable subscription for this stream (wake or push delivery; latest event per subscriptionKey wins). Re-configuring keeps the existing delivery cursor unless `deliver` is set, and clears any parked state — new config is a fresh chance.