Context
The spec-kitty codebase uses actor-identity vocabulary in three distinct places:
- Status/event log: the
actorfield onStatusEventrecords who performed a lane transition (e.g.,"claude","human"). - Retrospective log: the actor field on retrospective entries records who authored an observation.
- Mission run engine: the runtime-session concept of who is executing a mission run.
These three vocabularies are currently fragmented — they use similar words but have no shared type and no formal relationship. The doc-01–doc-17 analysis in issue #1666 introduced the concept of an Effector: the Actor as realized inside the Execution domain.
The question is whether to materialize Effector as a code type now, or to
hold it as vocabulary only until a concrete need forces a code materialization.
Decision
Effector Is a Named Concept in Docs Only
Definition: An Effector is an Actor realized inside the Execution domain. It is the execution-bound realization of an Actor: the entity that performs actions within a mission run, producing or consuming communication artefacts (commits, PRs, comments).
Decision: no code type until a concrete bug triggers materialization.
The concept is modeling vocabulary. The three existing actor-identity vocabularies
(status events, retrospective log, mission run engine) are not currently required
to share a type; they happen to use the same field name but serve different
query patterns. Materializing a Effector type prematurely would:
- Require join logic across three schema layers that have no current consumer.
- Create a shared type with no enforcement boundary to prevent actor-kind confusion from re-emerging.
- Add schema migration overhead for all three layers without delivering user value.
Materialization Trigger
Materialize Effector as a code type when either of the following is true:
- A concrete actor-kind-mismatch bug is filed — i.e., code confuses a status event actor with a run-engine actor, or with a retrospective actor, and the confusion causes incorrect behavior.
- A feature requires joining status/decision/retrospective logs on actor identity — i.e., a query needs to answer "show me all actions by actor X across all three log types in a single result set."
Neither trigger is currently active.
When Materialized: Placement
When Effector is materialized, it must be placed in a low-layer shared
location so all three existing vocabularies can converge:
- Preferred:
src/specify_cli/kernel/actor.py(shared kernel layer) - Alternative:
src/specify_cli/actor.py(top-level if kernel does not exist)
It must not be placed inside status/, runtime/, or any single-domain
module, because the type must be importable by all three domains without
creating an illegal up-import.
Relationship to Actor
Actor is the broader identity concept (who is making a request, as understood
by the governance or mission management layer). Effector is the execution-
domain specialization of Actor. The relationship is:
Actor (broader, may exist outside execution context)
└─ Effector (Actor ∩ Execution domain)
This is a conceptual relationship, not a Python inheritance hierarchy, until materialization.
Consequences
What stays the same
- All three existing actor-identity vocabularies (status events, retrospective
log, run engine) are unchanged. They continue to use
stror existing enum values for actor identity. - No schema migration is required.
- No new code is written as part of this ADR.
What is now explicit
Effectoris a named term with a definition in the project glossary and this ADR. Writers of architecture docs, glossary entries, and design docs may use the term precisely.- The decision not to materialize is explicit, with a documented trigger for when materialization becomes correct.
- The placement decision (kernel layer) is pre-decided so that when materialization is triggered, there is no debate about where the type goes.
What changes downstream
- No code changes from this ADR.
- WP01 adds
Effectorto the project glossary with this ADR as its reference. - Future feature work that would trigger materialization must reference this ADR and document that the trigger condition was met.
References
- Mission spec:
kitty-specs/execution-state-domain-remediation-01KT6HVH/spec.md - Issue #1619: Strangler Fig sequence
- Issue #1674: ADR gate requirement
- Issue #1666: doc-01–doc-17 design analysis (Effector concept origin)
- ADR
2026-06-03-1-execution-state-domain-model.md: domain model gate (Shared Kernel placement) - Glossary:
src/specify_cli/glossary/—Effectorandcommunication artefactentries