Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a779568622 | ||
|
|
243a11490b |
@@ -0,0 +1,35 @@
|
|||||||
|
package work
|
||||||
|
|
||||||
|
type LongRunningWorkID string
|
||||||
|
type LongRunningState string
|
||||||
|
|
||||||
|
const (
|
||||||
|
LongRunningProposed LongRunningState = "PROPOSED"
|
||||||
|
LongRunningRunning LongRunningState = "RUNNING"
|
||||||
|
LongRunningPaused LongRunningState = "PAUSED"
|
||||||
|
LongRunningBlocked LongRunningState = "BLOCKED"
|
||||||
|
LongRunningCompleted LongRunningState = "COMPLETED"
|
||||||
|
LongRunningExhausted LongRunningState = "EXHAUSTED"
|
||||||
|
LongRunningCancelled LongRunningState = "CANCELLED"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Investigation struct {
|
||||||
|
ID LongRunningWorkID
|
||||||
|
Objective string
|
||||||
|
HypothesisRefs []EvidenceRef
|
||||||
|
AttemptRefs []AgentRunID
|
||||||
|
FindingRefs []EvidenceRef
|
||||||
|
Blockers []string
|
||||||
|
CheckpointRefs []AgentCheckpointID
|
||||||
|
NextStep string
|
||||||
|
State LongRunningState
|
||||||
|
Revision int64
|
||||||
|
TimeBudgetMillis int64
|
||||||
|
CostBudgetMicros int64
|
||||||
|
MaxAttempts int
|
||||||
|
RecordedAtUnixMillis int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w Investigation) Valid() bool {
|
||||||
|
return w.ID != "" && w.Objective != "" && w.State != "" && w.Revision > 0 && w.TimeBudgetMillis >= 0 && w.CostBudgetMicros >= 0 && w.MaxAttempts >= 0 && w.RecordedAtUnixMillis > 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package work
|
||||||
|
|
||||||
|
type PerspectiveID string
|
||||||
|
type PerspectiveSpec struct {
|
||||||
|
ID PerspectiveID
|
||||||
|
ObjectiveLens string
|
||||||
|
RetrievalProfileRef string
|
||||||
|
EvaluationCriteria []string
|
||||||
|
CapabilityRequirements []string
|
||||||
|
ExpectedOutputShape string
|
||||||
|
Critic bool
|
||||||
|
}
|
||||||
|
type SpecialistAssignment struct {
|
||||||
|
Perspective PerspectiveSpec
|
||||||
|
SubtaskRef string
|
||||||
|
EvidenceRefs []EvidenceRef
|
||||||
|
}
|
||||||
|
type TeamDecision struct {
|
||||||
|
UseTeam bool
|
||||||
|
Reason string
|
||||||
|
Assignments []SpecialistAssignment
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p PerspectiveSpec) Valid() bool {
|
||||||
|
return p.ID != "" && p.ObjectiveLens != "" && len(p.EvaluationCriteria) > 0 && p.ExpectedOutputShape != ""
|
||||||
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
{"task_file":"dev/tasks/GEN2-016-intelligence-strategy-resource-cost-policy-and-personal-benchmark.json","task_id":"GEN2-016","task_revision":1}
|
{"task_file":"dev/tasks/GEN2-018-add-perspective-and-dynamic-specialist-team-semantics-on-existing-work-g.json","task_id":"GEN2-018","task_revision":1}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package domain
|
||||||
|
|
||||||
|
import "git.cin.su/m/Assistant/contracts/work"
|
||||||
|
|
||||||
|
func PauseInvestigation(value work.Investigation) work.Investigation {
|
||||||
|
if value.Valid() {
|
||||||
|
value.State = work.LongRunningPaused
|
||||||
|
value.Revision++
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
func ResumeInvestigation(value work.Investigation) work.Investigation {
|
||||||
|
if value.Valid() && value.State == work.LongRunningPaused {
|
||||||
|
value.State = work.LongRunningRunning
|
||||||
|
value.Revision++
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package domain_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.cin.su/m/Assistant/contracts/work"
|
||||||
|
"git.cin.su/m/Assistant/modules/work/domain"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInvestigationPauseResumeIsDurableStateTransition(t *testing.T) {
|
||||||
|
w := work.Investigation{ID: "i", Objective: "diagnose", State: work.LongRunningRunning, Revision: 1, RecordedAtUnixMillis: 1}
|
||||||
|
w = domain.PauseInvestigation(w)
|
||||||
|
w = domain.ResumeInvestigation(w)
|
||||||
|
if w.State != work.LongRunningRunning || w.Revision != 3 {
|
||||||
|
t.Fatalf("%#v", w)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package domain
|
||||||
|
|
||||||
|
import "git.cin.su/m/Assistant/contracts/work"
|
||||||
|
|
||||||
|
func AssembleSpecialists(p work.PerspectiveSpec, subtasks []string) work.TeamDecision {
|
||||||
|
if !p.Valid() {
|
||||||
|
return work.TeamDecision{Reason: "invalid perspective"}
|
||||||
|
}
|
||||||
|
if len(subtasks) < 2 {
|
||||||
|
return work.TeamDecision{Reason: "single reasoning path is sufficient"}
|
||||||
|
}
|
||||||
|
assignments := make([]work.SpecialistAssignment, 0, len(subtasks))
|
||||||
|
for _, s := range subtasks {
|
||||||
|
assignments = append(assignments, work.SpecialistAssignment{Perspective: p, SubtaskRef: s})
|
||||||
|
}
|
||||||
|
return work.TeamDecision{UseTeam: true, Reason: "independent subtasks justify bounded perspectives", Assignments: assignments}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package domain_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.cin.su/m/Assistant/contracts/work"
|
||||||
|
"git.cin.su/m/Assistant/modules/work/domain"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPerspectiveTeamIsBoundedByIndependentSubtasks(t *testing.T) {
|
||||||
|
p := work.PerspectiveSpec{ID: "architect", ObjectiveLens: "architecture", EvaluationCriteria: []string{"correctness"}, ExpectedOutputShape: "finding"}
|
||||||
|
if d := domain.AssembleSpecialists(p, []string{"a"}); d.UseTeam {
|
||||||
|
t.Fatal("team for one subtask")
|
||||||
|
}
|
||||||
|
if d := domain.AssembleSpecialists(p, []string{"a", "b"}); !d.UseTeam || len(d.Assignments) != 2 {
|
||||||
|
t.Fatalf("%#v", d)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user