slice 5T.5: 4 example templates + end-to-end killer demo
Drop 4 templates into lore_engine_poc/seed/templates/:
* thieves_guild_mission.yaml (the original slice 14 example)
4 queries: list_missions, get_mission, missions_by_target,
active_missions. Payout / risk / secrecy enums.
* war_campaign.yaml
3 queries: list_campaigns, campaigns_in_theater,
ongoing_campaigns. Theater / aggressor / defender fields.
* black_market_lot.yaml
3 queries: list_lots, market_prices, affordable_lots.
Material / purity / asking_gp enums.
* npc_secret_knowledge.yaml
3 queries: secrets_known_by, secrets_about_subject,
list_secrets. Tier-gated content field.
And 1 instance file into lore_engine_poc/seed/instances/:
* crimson_hand_missions.yaml
3 missions (CH-4471 / CH-4472 / CH-4473) with GIVEN_BY and
TARGETS relations to slug endpoints in the Mardonari
setting.
12 dedicated tests in test_e2e_demo.py cover:
* all 4 templates load cleanly from seed/templates/
* crimson_hand_missions.yaml ingests 3 entities + 6 relations
* list_missions / get_mission / active_missions return the
expected rows
* list_template_tools discovers all 4 templates
* empty graph: list_campaigns returns []
* malformed instance file rejected with a clear error
* unknown template id rejected
* defining test: drop a new template file, reload(), the
new tool appears (no code change)
* JSON-RPC dispatch: get_mission over the wire
* all 4 templates have no write tools (read-only surface)
The defining "killer demo" works end-to-end:
36 core tools + 14 template-generated = 50 total MCP tools
exposed by MCPServer after reload().
Suite: 700 -> 712 (+12).
Co-Authored-By: Claude <noreply@anthropic.com>