8d1209c392
The pickup skill reads HANDOFF.md and the Vikunja task, then restates the assumption set and stops. That pause is the point: every wasted session here started with an agent that inferred the goal. The wrap skill runs the tests, updates the durable docs, commits in slices, pushes, records state in Vikunja, and leaves a handoff only if work remains. HANDOFF.md is gitignored and injected by a SessionStart hook. It holds what the next agent needs to resume and nothing else. Anything that would still matter next week goes to Vikunja, CLAUDE.md or docs/. .claude/ was ignored wholesale. The workflow itself is now tracked, because how a session behaves should be reviewed like code. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
21 lines
1.1 KiB
JSON
21 lines
1.1 KiB
JSON
{
|
|
"hooks": {
|
|
"SessionStart": [
|
|
{
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "f=.claude/prose-dictionary.yaml; [ -f \"$f\" ] && jq -Rs '{hookSpecificOutput:{hookEventName:\"SessionStart\",additionalContext:(\"Project prose dictionary. These terms override every word preference in the direct-prose output style. Use the name, never the avoid list.\\n\\n\"+.)}}' \"$f\" 2>/dev/null || true",
|
|
"statusMessage": "Loading prose dictionary"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"command": "f=HANDOFF.md; [ -f \"$f\" ] && jq -Rs '{hookSpecificOutput:{hookEventName:\"SessionStart\",additionalContext:(\"An unconsumed HANDOFF.md is present. Run the pickup skill before anything else: read it, read the Vikunja task it names, restate the assumption set in at most five bullets, and wait for the user to confirm before writing code. It is a claim from the previous session, not truth. Delete it once consumed.\\n\\n\"+.)}}' \"$f\" 2>/dev/null || true",
|
|
"statusMessage": "Loading handoff"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|