talents/story: migrate conversation/work/event to shared story.schema.json
Second structured-outputs L3 migration after talents/sense (8c952dc4).
Introduces talent/story.schema.json — Draft 2020-12, provider-intersection
subset (type, enum, required, additionalProperties, properties, items,
minLength, minimum, maximum, maxItems) — shared by the three story
talents. Schema enforcement is advisory: schema_validation surfaces on
the finish event via existing dispatcher plumbing (think/talent.py and
think/talents.py), but never blocks generation or the story post-hook.
talent/story.py is unchanged — it remains the authoritative source for
normalization (topics lowercase/dedupe/cap, confidence clamp, resolution
enum filtering). The schema mirrors its required-field contract:
- top-level: body, topics, confidence, commitments, closures, decisions
- commitments: 5 required string fields
- closures: 5 required string fields + resolution enum
{sent, done, signed, dropped, deferred}
- decisions: 3 required string fields
- additionalProperties: false at every closed object level
- topics deliberately permissive (no minItems/uniqueItems/per-item
minLength) — the hook does its own normalization
Tests:
- test_story_schema_file_is_valid_draft_2020_12
- test_story_talents_load_shared_schema (all three talents resolve the
shared schema through get_talent)
- test_story_schema_mirrors_hook_requirements (asserts required-field
parity with talent/story.py and enum parity with ALLOWED_RESOLUTIONS)
- test_story_hook_fixtures_validate_against_schema (hook test fixtures
stay schema-clean)
- All 12 existing test_story_hook.py tests remain green.
Stats API baseline refresh: the stats API exposes raw generator
frontmatter, so the new `schema` field appears in three generator blocks
in tests/baselines/api/stats/stats.json — updated accordingly.
Live validation deferred — provider creds not available in this worktree
environment, matching the sense migration's disposition. End-to-end
wiring is verified by the dispatcher pass-through test plus existing
json_schema coverage in tests/test_generate_full.py and
tests/test_talent.py.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>