+ require.Equal(t, prompt(agent.config.Name, filepath.Join(dir, agentInstructionsFileName), "I am Lena."), text)
+}
+
+func TestAgentPromptUsesAnAbsoluteInstructionsPath(t *testing.T) {
+ dir := t.TempDir()
+ workdir, err := os.Getwd()
+ require.NoError(t, err)
+
+ relative, err := filepath.Rel(workdir, dir)
+ require.NoError(t, err)
+ require.False(t, filepath.IsAbs(relative))
+
+ agent, err := openAgent(relative)
+ require.NoError(t, err)
+
+ text, err := agent.Prompt()
+ require.NoError(t, err)
+ require.Contains(t, text, "The user's instructions live in the file "+filepath.Join(dir, agentInstructionsFileName)+",")
+}
+
+func TestChildPromptDefinesItsAreaAndReports(t *testing.T) {
+ dir := t.TempDir()
+ agent, err := openAgent(dir)
+ require.NoError(t, err)
+
+ config := agent.config
+ config.Name = "Garden"
+ config.Parent = "OneChat"
+ config.Responsibility = "Keep the garden plans and decisions."
+ agentWriteTestConfig(t, dir, config)
+ require.NoError(t, os.WriteFile(filepath.Join(dir, agentInstructionsFileName), []byte("Ask before editing plans."), 0o600))
+
+ agent, err = openAgent(dir)
+ require.NoError(t, err)
+
+ text, err := agent.Prompt()
+ require.NoError(t, err)
+ require.Contains(t, text, "You are Garden, a child agent of OneChat.")
+ require.Contains(t, text, "You are responsible for: Keep the garden plans and decisions.")
+ require.Contains(t, text, "Work only in this area.")
+ require.Contains(t, text, "Report to OneChat only what needs the parent or the")
+ require.Contains(t, text, "End your turn with an empty reply when nothing needs the parent or the user.")
+ require.Contains(t, text, "Send nothing to WhatsApp. Draft replies in your report instead")
+ require.Contains(t, text, filepath.Join(dir, agentInstructionsFileName))
+ require.True(t, strings.HasSuffix(text, "Ask before editing plans."))
+ require.NotContains(t, text, "You act again only when the user writes.")
+}
+
+func TestChildConfigNeedsAParentAndAnArea(t *testing.T) {
+ testCases := []struct {
+ name string
+ parent string
+ responsibility string
+ }{
+ {
+ name: "a parent needs an area",
+ parent: "OneChat",
+ },
+ {
+ name: "an area needs a parent",
+ responsibility: "Keep the garden plans.",
+ },
+ }
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ dir := t.TempDir()
+ agent, err := openAgent(dir)
+ require.NoError(t, err)
+
+ config := agent.config
+ config.Parent = tc.parent
+ config.Responsibility = tc.responsibility
+ agentWriteTestConfig(t, dir, config)
+
+ _, err = openAgent(dir)
+ require.ErrorContains(t, err, "a child needs both responsibility and parent")
+ })
+ }