State the seal rules a JSON shape cannot show
Run 9's research seal was refused for writing "F1" as a finding id. The rule is real and the message was precise, but no brief had ever stated it: the shape block shows keys and types, and a format constraint is neither. The agent recovered in fifteen seconds, so this cost one boundary rather than a run. It is still a refusal nobody had to earn, and the same shape hid F38 a few runs ago. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVbaKucEYBjMqVeUgJUsc1
This commit is contained in:
@@ -132,6 +132,9 @@ func phaseRequestBrief(phase domain.WorkPhase) string {
|
|||||||
if schema := phaseSealSchema[phase]; schema != "" {
|
if schema := phaseSealSchema[phase]; schema != "" {
|
||||||
fmt.Fprintf(&b, "\nIt must decode as this shape. Optional keys may be omitted, but no key may hold a different type:\n\n%s\n", schema)
|
fmt.Fprintf(&b, "\nIt must decode as this shape. Optional keys may be omitted, but no key may hold a different type:\n\n%s\n", schema)
|
||||||
}
|
}
|
||||||
|
if rules := phaseSealRules[phase]; rules != "" {
|
||||||
|
fmt.Fprintf(&b, "\n%s\n", rules)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
b.WriteString("\nAn accepted request ends this session and starts the next phase with your sealed result. Saying you are ready in the pane is not a request and nothing reads it.\n")
|
b.WriteString("\nAn accepted request ends this session and starts the next phase with your sealed result. Saying you are ready in the pane is not a request and nothing reads it.\n")
|
||||||
// How to finish. review's only transition is backwards to implement, so a
|
// How to finish. review's only transition is backwards to implement, so a
|
||||||
@@ -163,6 +166,13 @@ var phaseSealFile = map[domain.WorkPhase]string{
|
|||||||
// agent. TestPhaseSealSchemasDecode keeps these honest: each one is decoded by
|
// agent. TestPhaseSealSchemasDecode keeps these honest: each one is decoded by
|
||||||
// the same function the worker uses, so a struct change that is not mirrored
|
// the same function the worker uses, so a struct change that is not mirrored
|
||||||
// here fails the build rather than a live run.
|
// here fails the build rather than a live run.
|
||||||
|
// phaseSealRules states the constraints the shape alone cannot show. Run 9
|
||||||
|
// was refused for writing "F1" as a finding id, a rule the decoder enforced
|
||||||
|
// and no brief had ever stated.
|
||||||
|
var phaseSealRules = map[domain.WorkPhase]string{
|
||||||
|
domain.WorkPhaseResearch: "A finding id is lowercase letters, digits, dash or underscore, at most 64 characters, and unique. The plan cites these, so they are names rather than labels.",
|
||||||
|
}
|
||||||
|
|
||||||
var phaseSealSchema = map[domain.WorkPhase]string{
|
var phaseSealSchema = map[domain.WorkPhase]string{
|
||||||
domain.WorkPhaseResearch: ` {
|
domain.WorkPhaseResearch: ` {
|
||||||
"findings": [{"id": "", "claim": "", "evidence": "", "confidence": "fact|inference|assumption"}],
|
"findings": [{"id": "", "claim": "", "evidence": "", "confidence": "fact|inference|assumption"}],
|
||||||
|
|||||||
@@ -696,3 +696,14 @@ func TestAllPhasesStaleIsNotReportedAsFinished(t *testing.T) {
|
|||||||
t.Errorf("a plan verified at HEAD was not reported as finished:\n%s", current)
|
t.Errorf("a plan verified at HEAD was not reported as finished:\n%s", current)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The shape cannot show a format rule, and run 9 was refused for writing "F1"
|
||||||
|
// as a finding id against a constraint no brief had ever stated.
|
||||||
|
func TestResearchBriefStatesTheFindingIDRule(t *testing.T) {
|
||||||
|
brief := phaseRequestBrief(domain.WorkPhaseResearch)
|
||||||
|
for _, want := range []string{"lowercase letters", "at most 64 characters", "unique"} {
|
||||||
|
if !strings.Contains(brief, want) {
|
||||||
|
t.Errorf("research brief never states %q", want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user