Let the validator accept the reason the adapter produces

handoffReason has emitted "phase_changed" since phase rotations landed. The
continuity validator's reason list was never extended, so every phase rotation
built a handoff it then refused as "invalid handoff meta".

Live on run 5: with F31 clearing the parse ahead of it, the release reached
this and stopped at phase "prepared" with
"adapter: upload handoff: invalid handoff meta".

The test asserts the property rather than the constant: every reason the
adapter can produce must survive Validate, including its fallback.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xsXyr5J1RACo71YeKG3Pu
This commit is contained in:
2026-08-28 01:38:58 +04:00
parent 92f32d6fea
commit b9ca365b9a
2 changed files with 25 additions and 1 deletions
+6 -1
View File
@@ -132,7 +132,12 @@ type Result struct {
// reconcile_failure is Orchestra's own trigger: human input could not be
// reconciled at repeated verified turn boundaries, so the session is handed to
// a successor rather than left running on intent that cannot be refreshed.
var reasons = map[string]bool{"threshold": true, "milestone": true, "thrash": true, "manual": true, "reconcile_failure": true}
// phase_changed is a rotation Orchestra itself triggers when a phase request
// is accepted. The adapter has produced it since phase rotations landed
// (handoffReason), but this list was never extended, so every phase rotation
// built a handoff the validator then refused as "invalid handoff meta" (F36).
// The two halves of one contract have to name the same vocabulary.
var reasons = map[string]bool{"threshold": true, "milestone": true, "thrash": true, "manual": true, "reconcile_failure": true, "phase_changed": true}
const maxAuthoredLine = 200