Parent
#2
What to build
Verified small redundancies from the walking-skeleton review, batched as one cleanup pass. Each item should be resolved or explicitly declined in the PR description:
- definition checksum is computed twice per run (and the workflow is model-dumped three times); build the snapshot once and reuse its checksum
- exit_status is persisted twice in the same attempt record (column + inside the normalized output JSON); keep a single durable source
- Run-directory layout literals are split across the CLI (runs root) and executor (file names) with tests re-hardcoding both; give the layout one owner
- UTC-ISO timestamp construction is duplicated between the events module and the executor; share one helper
- The event log reopens its file on every append; hold one append handle for the log's lifetime
- Workflow.version is required, unconstrained (any int validates), and never read; constrain it to known versions or drop it
- The package is fully typed but ships no py.typed marker, so downstream type-checkers degrade caw types to Any
- version duplicates the project version from pyproject and is never read; single-source it (e.g. importlib.metadata) or remove it
Acceptance criteria
Blocked by
None - can start immediately
Parent
#2
What to build
Verified small redundancies from the walking-skeleton review, batched as one cleanup pass. Each item should be resolved or explicitly declined in the PR description:
Acceptance criteria
Blocked by
None - can start immediately