Skip to content

docs(spike): side-effect pods design spec (ITL-524)#227

Open
kurodo3[bot] wants to merge 13 commits into
mainfrom
eywalker/itl-524-spike-design-first-class-support-for-side-effect-pods-with
Open

docs(spike): side-effect pods design spec (ITL-524)#227
kurodo3[bot] wants to merge 13 commits into
mainfrom
eywalker/itl-524-spike-design-first-class-support-for-side-effect-pods-with

Conversation

@kurodo3

@kurodo3 kurodo3 Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds a complete design spec for side-effect pods to superpowers/specs/2026-07-14-itl-524-side-effect-pods-design.md
  • Resolves all 10 design axes from ITL-524: pod taxonomy, output contract, caching semantics, execution hash, hash surface, failure semantics, DAG ordering, observability, reverse-lookup path, and artifact serialization
  • Includes a worked end-to-end example (patient audit pipeline) with full reverse-lookup walk-through
  • Explicitly reconciles with ITL-523 post-run hook: shared on_error vocabulary, proposed InvocationIdentity shared base type
  • Files follow-up implementation issue ITL-525 with 7-milestone task breakdown

Key design decisions

Axis Decision
Pod taxonomy New SideEffectPod class (sibling of FunctionPod, shares _FunctionPodBase)
Output contract Pass-through — input stream emitted unchanged
Caching Author-declared idempotent: bool = False; invocations always logged
Hash invocation_signature = sha256(pod.content_hash().digest + input.content_hash().digest)[:16].hex() (deterministic, 32 hex chars) + execution_id (UUIDv7, unique per run)
Hash surface SideEffectContext auto-injected by type annotation
Failure on_error: "raise" | "log" (consistent with ITL-523 HookConfig)
Observability _orcapod_side_effect_invocations table in pipeline DB
Artifact format orcapod-{invocation_signature} via ctx.format_id()

Test plan

Fixes ITL-524

🤖 Generated with Claude Code

…ecution hash (ITL-524)

Adds superpowers/specs/2026-07-14-itl-524-side-effect-pods-design.md with a complete
design resolving all 10 axes from ITL-524: pod taxonomy (new SideEffectPod class),
pass-through output contract, author-declared idempotency, dual-hash (invocation_signature
+ execution_id), SideEffectContext auto-injection, fail-loud error semantics, DAG
ordering, _orcapod_side_effect_invocations invocation log, full reverse-lookup path,
and canonical orcapod-<hex> artifact serialization. Includes worked patient audit
example with end-to-end reverse-lookup walk-through and explicit reconciliation with
ITL-523 post-run hook.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

kurodo3 Bot and others added 12 commits July 14, 2026 03:14
Remove premature commitment to '-> None' and pass-through contract from the
Overview; those are Axis 2 outcomes argued in the Design section. Overview now
describes the problem space and the provenance motivation only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-524)

Goals & Success Criteria now describes what the spike produces (discussed,
Edgar-approved decisions per axis) rather than front-loading the design
outcomes. Adds explicit statement that final calls belong to Edgar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…l (ITL-524)

SideEffectPodProtocol defines the contract in protocols/; SideEffectPod implements
it by extending _FunctionPodBase for implementation reuse. Mirrors existing
protocol/implementation pattern throughout the codebase.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ugh) (ITL-524)

Two distinct pod kinds: SinkPod for completion-tracked terminal delivery to external
sources, TapPod for always-fire pass-through observation. Retry policy deferred to
ITL-526. Grouping under a shared SideEffectPod umbrella deferred.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…hash (ITL-524)

Axis 3: SinkPod completion state machine (not-seen/success/failed), retry on
explicit re-run only, retry policy deferred to ITL-526. TapPod always fires.

Axis 4: Two-part invocation hash (pipeline_hash::full_input_packet_hash) using
:: separator. TapPod adds verbatim pipeline_run_id as third component. Full
input packet covers tag + data + source + system tag columns. InvocationHashConfig
with encoding (hex/base64/binary) and component_length in bytes of raw digest.
Table organisation mirrors FunctionNode: pipeline_hash scopes table, input packet
hash is row key.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ion (ITL-524)

Single InvocationContext shared by SinkPod and TapPod. Framework injects it when
the user function declares a parameter typed InvocationContext — detection by type
annotation only, no magic parameter names. Fields: invocation_hash, pod_name,
pod_content_hash, pipeline_run_id.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SinkPodConfig / TapPodConfig with on_error: Literal["raise","log"]="raise".
SinkPod always records status="failed" on error regardless of on_error.
Logs FunctionPod async/sync error inconsistency as DESIGN_ISSUES F15
and files ITL-527 for future alignment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace SinkPod/TapPod as distinct types with a single SideEffectPod
governed by track_completion and pass_on_success config axes. Update
Axes 1-6 accordingly. @sink_pod/@tap_pod become convenience decorators.
Hash formula now conditioned on track_completion, not type name.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-524)

Rename config flag to drop_on_failure throughout spec. Record Axis 7
decisions: synchronous per-row delivery in v1, max_concurrency model,
no global barrier. File ITL-528 for future fire-and-forget delivery mode.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ITL-524)

Invocation tables scoped by pipeline_hash(pod), mirroring FunctionNode.
Reverse lookup: parse invocation hash → route to table → look up by
full_input_packet_hash. Update column names, status values, lookup steps.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
format_id() accepts optional InvocationHashConfig override for per-call
encoding/length control. Documents canonical orcapod- prefix convention,
raw hash usage, and dropped InvocationIdentity base type.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… (ITL-524)

Update Reconciliation, Worked Example, Public API Summary, Tests, Scope,
Dependencies, and task breakdown. Replace all SideEffectContext/SideEffectConfig/
InvocationIdentity/idempotent references with InvocationContext/SideEffectPodConfig/
track_completion/drop_on_failure. Expand tests to T18.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.

0 participants