events.iterate.com

Stream processor

project

Project root: births the sibling processors every project gets (root capability host, primary scheduler, config repo, email router, notification facet), marks the project ready once its default worker answers, catalogs the project's streams and domain objects, manages custom-domain routing, and holds the egress-approval policy.

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