Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f78a391
feat: add multica issue bridge
Grivn Jun 28, 2026
2b52564
test: add multica runtime protocol probe
Grivn Jun 28, 2026
e09b006
feat: expand multica cli driver
Grivn Jun 28, 2026
630168e
feat: provision multica participant agents
Grivn Jun 28, 2026
d19e88b
feat: add multica runtime issue import
Grivn Jun 28, 2026
9c008e9
feat: configure multica participant runtime env
Grivn Jun 28, 2026
2c47570
feat: project multica runtime imports
Grivn Jun 28, 2026
5714b30
feat: wake managed agents from multica runtime
Grivn Jun 28, 2026
f95ca09
test: add multica runtime prod sim acceptance
Grivn Jun 28, 2026
7aa4a3c
fix: harden multica managed wake setup
Grivn Jun 28, 2026
12fe6a5
feat: add multica hub driver primitives
Grivn Jun 28, 2026
1ff69be
feat: classify multica hub runtime issues
Grivn Jun 28, 2026
b7c3a48
feat: write multica hub assignment mailboxes
Grivn Jun 28, 2026
aef6848
test: add multica hub flow acceptance checks
Grivn Jun 28, 2026
164443a
fix: render wake context without token auth
Grivn Jun 28, 2026
9f7a364
fix: preserve managed runtime principal defaults
Grivn Jun 28, 2026
f95afb5
feat: inject harness cli into multica agents
Grivn Jun 28, 2026
7dbcf66
feat: stream multica runtime progress
Grivn Jun 28, 2026
dc51f19
feat: align multica runtime status events
Grivn Jun 28, 2026
f38fb22
feat: project multica runtime activity events
Grivn Jun 28, 2026
832ace3
feat: improve multica hub projection flow
Grivn Jun 28, 2026
6d481a7
refactor: fold multica runtime probe into runtime
Grivn Jun 28, 2026
305f5c7
feat: bridge managed codex activation traces
Grivn Jun 28, 2026
abbdf0a
feat: add explicit multica participant registration
Grivn Jun 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
764 changes: 764 additions & 0 deletions harness/cmd/mnemon-acceptance/acceptance_multica_runtime.go

Large diffs are not rendered by default.

191 changes: 191 additions & 0 deletions harness/cmd/mnemon-acceptance/acceptance_multica_runtime_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
package main

import (
"context"
"encoding/json"
"os"
"path/filepath"
"strings"
"testing"
"time"

"github.com/mnemon-dev/mnemon/harness/internal/driver"
)

func TestMulticaRuntimeProdSimAcceptanceObservesRunMessages(t *testing.T) {
tmp := t.TempDir()
registryPath := filepath.Join(tmp, "registry.json")
if err := driver.SaveMulticaRegistry(registryPath, driver.MulticaRegistry{
SchemaVersion: 1,
WorkspaceID: "ws-1",
RuntimeProfileID: "profile-1",
RuntimeID: "runtime-1",
Participants: []driver.MulticaParticipantRecord{{
Principal: "planner@team",
AgentName: "mnemon-planner",
AgentID: "agent-1",
Role: "planner",
}},
}); err != nil {
t.Fatal(err)
}
argsPath := filepath.Join(tmp, "args.txt")
stdinPath := filepath.Join(tmp, "stdin.txt")
bin := filepath.Join(tmp, "multica")
script := `#!/usr/bin/env sh
printf '%s\n' "$*" >> "$MULTICA_ARGS_PATH"
cat >> "$MULTICA_STDIN_PATH"
case "$*" in
*"issue create"*) printf '{"id":"iss-9","identifier":"TEA-9","title":"Runtime prod sim","description":"Teamwork acceptance","status":"todo"}\n' ;;
*"issue runs iss-9"*) printf '[{"id":"task-9","issue_id":"iss-9","agent_id":"agent-1","status":"completed","completed_at":"2026-06-28T09:00:00Z","workspace_id":"ws-1"}]\n' ;;
*"issue run-messages task-9"*) printf '[{"task_id":"task-9","issue_id":"iss-9","seq":1,"type":"assistant","content":"Mnemon Multica runtime handled issue TEA-9. Mnemon ingest: recorded seq=17. Managed wake: completed turn=noop-turn.","created_at":"2026-06-28T09:00:01Z"}]\n' ;;
*) printf '{}\n' ;;
esac
`
if err := os.WriteFile(bin, []byte(script), 0o755); err != nil {
t.Fatal(err)
}
t.Setenv("MULTICA_ARGS_PATH", argsPath)
t.Setenv("MULTICA_STDIN_PATH", stdinPath)

report, err := runMulticaRuntimeProdSimAcceptance(context.Background(), multicaRuntimeProdSimOptions{
RunRoot: filepath.Join(tmp, ".testdata", "multica-runtime"),
MulticaBin: bin,
WorkspaceID: "ws-1",
RegistryPath: registryPath,
AssigneePrincipal: "planner@team",
IssueTitle: "Runtime prod sim",
IssueDescription: "Teamwork acceptance",
Wait: time.Millisecond,
Poll: time.Millisecond,
RequireIngest: true,
RequireManagedWake: true,
})
if err != nil {
t.Fatalf("acceptance: %v report=%+v", err, report)
}
if report.Status != "ok" || report.Issue.ID != "iss-9" || len(report.RunMessages) != 1 {
t.Fatalf("report mismatch: %+v", report)
}
data, err := os.ReadFile(report.ReportPath)
if err != nil {
t.Fatal(err)
}
var written multicaRuntimeProdSimReport
if err := json.Unmarshal(data, &written); err != nil {
t.Fatalf("report JSON: %v\n%s", err, data)
}
if written.Status != "ok" || !multicaProdSimAssertionsPassed(written) {
t.Fatalf("written report mismatch: %+v", written)
}
args, err := os.ReadFile(argsPath)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(args), "issue create --title Runtime prod sim") || !strings.Contains(string(args), "--assignee-id agent-1") {
t.Fatalf("issue was not created through assigned Multica path:\n%s", args)
}
stdin, err := os.ReadFile(stdinPath)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(stdin), "Teamwork acceptance") {
t.Fatalf("issue description was not passed through stdin:\n%s", stdin)
}
}

func TestMulticaRuntimeProdSimAcceptanceRequiresHubFlow(t *testing.T) {
tmp := t.TempDir()
registryPath := filepath.Join(tmp, "registry.json")
var participants []driver.MulticaParticipantRecord
for _, role := range []string{"planner", "researcher", "implementer", "reviewer", "integrator"} {
participants = append(participants, driver.MulticaParticipantRecord{
Principal: role + "@team",
AgentName: "mnemon-" + role,
AgentID: "agent-" + role,
Role: role,
})
}
if err := driver.SaveMulticaRegistry(registryPath, driver.MulticaRegistry{
SchemaVersion: 1,
WorkspaceID: "ws-1",
RuntimeProfileID: "profile-1",
RuntimeID: "runtime-1",
Participants: participants,
}); err != nil {
t.Fatal(err)
}
argsPath := filepath.Join(tmp, "args.txt")
stdinPath := filepath.Join(tmp, "stdin.txt")
bin := filepath.Join(tmp, "multica")
script := `#!/usr/bin/env sh
printf '%s\n' "$*" >> "$MULTICA_ARGS_PATH"
cat >> "$MULTICA_STDIN_PATH"
case "$*" in
*"issue create"*) printf '{"id":"root-9","identifier":"TEA-9","title":"Runtime hub flow","description":"Teamwork acceptance","status":"todo"}\n' ;;
*"issue get root-9"*) printf '{"id":"root-9","identifier":"TEA-9","title":"Runtime hub flow","description":"Teamwork acceptance","status":"done"}\n' ;;
*"issue get child-2"*) printf '{"id":"child-2","identifier":"TEA-10","title":"Assignment 2","status":"done"}\n' ;;
*"issue get child-3"*) printf '{"id":"child-3","identifier":"TEA-11","title":"Assignment 3","status":"done"}\n' ;;
*"issue metadata list root-9"*) printf '[{"key":"mnemon.hub_backend","value":"multica"},{"key":"mnemon.kind","value":"session_mailbox"},{"key":"mnemon.session_id","value":"multica:session:root-9"}]\n' ;;
*"issue children root-9"*) printf '{"children":[{"id":"child-2","identifier":"TEA-10","title":"Assignment 2","status":"done","metadata":{"mnemon.hub_backend":"multica","mnemon.kind":"assignment_mailbox","mnemon.session_id":"multica:session:root-9","mnemon.assignment_id":"asg-2","mnemon.principal":"researcher@team"}},{"id":"child-3","identifier":"TEA-11","title":"Assignment 3","status":"done","metadata":{"mnemon.hub_backend":"multica","mnemon.kind":"assignment_mailbox","mnemon.session_id":"multica:session:root-9","mnemon.assignment_id":"asg-3","mnemon.principal":"implementer@team"}}]}\n' ;;
*"issue comment list root-9"*) printf '[{"id":"comment-root","issue_id":"root-9","content":"Mnemon update: issue admitted\\n\\nmnemon:event=multica-task-root"}]\n' ;;
*"issue comment list child-2"*) printf '[{"id":"comment-child-2","issue_id":"child-2","content":"Mnemon update: assignment feedback\\n\\nSummary: checked routing.\\n\\nmnemon:event=pg-2"}]\n' ;;
*"issue comment list child-3"*) printf '[{"id":"comment-child-3","issue_id":"child-3","content":"Mnemon update: assignment feedback\\n\\nSummary: checked runtime display.\\n\\nmnemon:event=pg-3"}]\n' ;;
*"issue runs root-9"*) printf '[{"id":"task-root","issue_id":"root-9","agent_id":"agent-planner","status":"completed","completed_at":"2026-06-28T09:00:00Z","workspace_id":"ws-1"}]\n' ;;
*"issue run-messages task-root"*) printf '[{"task_id":"task-root","issue_id":"root-9","seq":1,"type":"text","content":"Mnemon Multica runtime handled issue TEA-9. Mnemon ingest: recorded seq=17. Managed wake: completed turn=noop-turn. Multica hub write: created child_issues=2.","created_at":"2026-06-28T09:00:01Z"},{"task_id":"task-root","issue_id":"root-9","seq":2,"type":"tool_use","content":"mnemond ingest observe --principal planner@team","created_at":"2026-06-28T09:00:02Z"},{"task_id":"task-root","issue_id":"root-9","seq":3,"type":"tool_result","content":"recorded seq=17 duplicate=false ticked=true","created_at":"2026-06-28T09:00:03Z"}]\n' ;;
*"issue runs child-2"*) printf '[{"id":"task-child-2","issue_id":"child-2","agent_id":"agent-researcher","status":"completed","completed_at":"2026-06-28T09:01:00Z","workspace_id":"ws-1"}]\n' ;;
*"issue run-messages task-child-2"*) printf '[{"task_id":"task-child-2","issue_id":"child-2","seq":1,"type":"text","content":"Mnemon Multica runtime handled issue TEA-10. Mnemon assignment mailbox: correlated assignment=asg-2. Managed wake: completed turn=noop-turn.","created_at":"2026-06-28T09:01:01Z"},{"task_id":"task-child-2","issue_id":"child-2","seq":2,"type":"tool_use","content":"mnemond managed wake --principal researcher@team [mnemon:wake]","created_at":"2026-06-28T09:01:02Z"},{"task_id":"task-child-2","issue_id":"child-2","seq":3,"type":"tool_result","content":"Managed wake: completed turn=noop-turn","created_at":"2026-06-28T09:01:03Z"}]\n' ;;
*"issue runs child-3"*) printf '[{"id":"task-child-3","issue_id":"child-3","agent_id":"agent-implementer","status":"completed","completed_at":"2026-06-28T09:02:00Z","workspace_id":"ws-1"}]\n' ;;
*"issue run-messages task-child-3"*) printf '[{"task_id":"task-child-3","issue_id":"child-3","seq":1,"type":"text","content":"Mnemon Multica runtime handled issue TEA-11. Mnemon assignment mailbox: correlated assignment=asg-3. Managed wake: completed turn=noop-turn.","created_at":"2026-06-28T09:02:01Z"},{"task_id":"task-child-3","issue_id":"child-3","seq":2,"type":"tool_use","content":"mnemond managed wake --principal implementer@team [mnemon:wake]","created_at":"2026-06-28T09:02:02Z"},{"task_id":"task-child-3","issue_id":"child-3","seq":3,"type":"tool_result","content":"Managed wake: completed turn=noop-turn","created_at":"2026-06-28T09:02:03Z"}]\n' ;;
*) printf '{}\n' ;;
esac
`
if err := os.WriteFile(bin, []byte(script), 0o755); err != nil {
t.Fatal(err)
}
t.Setenv("MULTICA_ARGS_PATH", argsPath)
t.Setenv("MULTICA_STDIN_PATH", stdinPath)

report, err := runMulticaRuntimeProdSimAcceptance(context.Background(), multicaRuntimeProdSimOptions{
RunRoot: filepath.Join(tmp, ".testdata", "multica-hub-runtime"),
MulticaBin: bin,
WorkspaceID: "ws-1",
RegistryPath: registryPath,
AssigneePrincipal: "planner@team",
IssueTitle: "Runtime hub flow",
IssueDescription: "Teamwork acceptance",
Wait: time.Millisecond,
Poll: time.Millisecond,
RequireIngest: true,
RequireManagedWake: true,
RequireHubFlow: true,
MinParticipants: 5,
MinActiveAgents: 3,
})
if err != nil {
t.Fatalf("acceptance: %v report=%+v", err, report)
}
if report.Status != "ok" || len(report.Participants) != 5 || len(report.ChildIssues) != 2 || len(report.ActiveAgents) != 3 || report.FinalRoot.Status != "done" {
t.Fatalf("hub report mismatch: %+v", report)
}
if report.RootMetadata[driver.MulticaMetadataKind] != driver.MulticaHubKindSession {
t.Fatalf("root metadata mismatch: %+v", report.RootMetadata)
}
if !multicaProdSimAssertionsPassed(report) {
t.Fatalf("hub assertions failed: %+v", report.Assertions)
}
args, err := os.ReadFile(argsPath)
if err != nil {
t.Fatal(err)
}
for _, want := range []string{
"issue metadata list root-9 --output json",
"issue children root-9 --output json",
"issue runs child-2 --output json",
"issue runs child-3 --output json",
} {
if !strings.Contains(string(args), want) {
t.Fatalf("args missing %q:\n%s", want, args)
}
}
}
1 change: 1 addition & 0 deletions harness/cmd/mnemon-acceptance/root_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ func TestRootExposesAcceptanceScenarioCommands(t *testing.T) {
"r1-task-sim",
"r1-cluster-single-entrypoint",
"r1-github-mesh-task-suite",
"multica-runtime-prod-sim",
} {
if !commands[want] {
t.Fatalf("mnemon-acceptance missing command %q; commands=%v", want, commands)
Expand Down
Loading
Loading