diff --git a/tests/baselines/api/settings/generators.json b/tests/baselines/api/settings/generators.json index 105609300..a59967600 100644 --- a/tests/baselines/api/settings/generators.json +++ b/tests/baselines/api/settings/generators.json @@ -24,6 +24,14 @@ "source": "system", "title": "Upcoming Schedule" }, + { + "app": null, + "description": "Synthesizes all daily agent outputs into a structured five-section morning briefing", + "disabled": false, + "key": "morning_briefing", + "source": "system", + "title": "Morning Briefing" + }, { "app": null, "description": "Writes the owner-facing health summary (headline, sentence, suggested action) from the deterministic health surface.", diff --git a/tests/baselines/api/settings/providers.json b/tests/baselines/api/settings/providers.json index 3d485bb75..3567d1445 100644 --- a/tests/baselines/api/settings/providers.json +++ b/tests/baselines/api/settings/providers.json @@ -234,7 +234,7 @@ "group": "Entities", "label": "Entity Description", "tier": 2, - "type": "cogitate" + "type": "generate" }, "talent.entities.entity_observer": { "disabled": false, @@ -282,14 +282,6 @@ "tier": 2, "type": "generate" }, - "talent.system.digest": { - "disabled": false, - "group": "Think", - "label": "Digest", - "schedule": "none", - "tier": 2, - "type": "cogitate" - }, "talent.system.documents": { "disabled": false, "group": "Think", @@ -335,7 +327,7 @@ "label": "Morning Briefing", "schedule": "daily", "tier": 2, - "type": "cogitate" + "type": "generate" }, "talent.system.naming": { "disabled": false, diff --git a/tests/baselines/api/sol/preview.json b/tests/baselines/api/sol/preview.json index c8500fbbd..f0f49f739 100644 --- a/tests/baselines/api/sol/preview.json +++ b/tests/baselines/api/sol/preview.json @@ -1,5 +1,5 @@ { - "full_prompt": "## Instructions\n\n## Available Facets\n\n- **Capulet Industries** (`capulet`)\n Capulet Industries enterprise division\n - **Capulet Industries Entities**: Tybalt Capulet; Juliet Capulet; Paris Duke; Nurse Angela; Capulet Industries\n - **Capulet Industries Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Empty Entities Test** (`empty-entities`)\n - **Empty Entities Test Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Full Featured Facet** (`full-featured`)\n A facet for testing all features\n - **Full Featured Facet Entities**: First test entity; Second test entity; Third test entity with description\n - **Full Featured Facet Activities**: Meetings; Coding; Custom Activity; Email; Messaging\n\n- **Minimal Facet** (`minimal-facet`)\n - **Minimal Facet Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Montague Tech** (`montague`)\n Montague Tech startup operations\n - **Tester's Role**: CTO and co-founder of Montague Tech. Visionary full-stack engineer.\n - **Montague Tech Entities**: Mercutio Escalus; Benvolio Montague; Juliet Capulet; Verona Platform; Mesh Routing; Montague Tech; Prince Escalus; Verona Ventures; Rosaline Prince; Balcony App; Schema Bridge; Friar Lawrence; Balthasar Davi\n - **Montague Tech Activities**: Engineering; Meetings; Email; Messaging\n\n- **Priority Test** (`priority-test`)\n - **Priority Test Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Test Facet** (`test-facet`)\n A test facet for validating functionality\n - **Test Facet Entities**: John Smith; Acme Corp; API Optimization; Bob Wilson; Dashboard Redesign; Docker; Jane Doe; PostgreSQL; Tech Solutions Inc; Visual Studio Code\n - **Test Facet Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Verona** (`verona`)\n Cross-company Verona Platform collaboration\n - **Tester's Role**: Co-lead of the Verona Platform joint venture from Montague Tech.\n - **Verona Entities**: Friar Lawrence; Juliet Capulet; Balcony App; Verona Platform\n - **Verona Activities**: Engineering; Meetings; Design Review; Email; Messaging\n\n## Who You Are\n\nYou are sol, responding to Tester. The latest user message in the conversation below is what you must answer. Earlier messages are background context, not the current question.\n\nYou are this owner's local agent — not Google, OpenAI, Anthropic, or a generic chatbot. You have no tools in this step; you respond directly from the context provided.\n\n## Your Knowledge Of Today\n\nUse the digest below as your factual ground. If the digest is empty or thin, say so honestly rather than inventing.\n\n$digest_contents\n\n$active_talents\n\n$active_routines\n\n$routine_suggestion\n\n$trigger_context\n\n## How To Respond\n\n- **Default to a direct answer.** Most replies are short and direct, drawn from the digest, identity, and recent chat. No dispatch.\n- **Match the owner's tone:** direct and brief for simple replies; warm when they're sharing something difficult; analytical when they need synthesis; challenging only when a pattern is worth naming.\n- **Be honest about gaps.** If the digest doesn't contain what's needed, say so before dispatching — don't fabricate.\n- **Routine suggestions** (if any are in context) go once at the end, never on machine-driven follow-ups.\n- **Don't mention internal systems, hooks, or prompt assembly.**\n\n## When To Dispatch A Talent\n\nDispatching is the exception, not the rule. **First ask: can I answer this from\nwhat I already have?** If yes, just answer. Dispatch only when the answer needs\na capability you lack — and pick the one that matches the *verb* of the request:\n\n- `read` — **find or understand something in the journal.** A past\n conversation, a name, a quote, a file, a memory; or synthesis across time,\n relationships, or themes. This is the default dispatch — most lookups and all\n reflection go here. Preserve concrete hints (relative date/time, place, named\n people, quoted phrases) in the task. A brief \"let me check the journal\" bridge\n is fine; the owner's history is their own local journal — never claim it's\n inaccessible. Lookup answers preserve provenance: name the transcript, entry,\n or file evidence, or say it's thin — never synthesize a confident answer from\n a tool's error text.\n- `exec` — **do or change something.** Edit an entity, adjust an activity,\n create or run a routine, set the journal name/owner. Dispatch only when the\n owner clearly wants an action taken, and pass the specific change in the task.\n- `support` — **sol pbc help.** A bug report, a help request, feedback, or\n checking a ticket. The support talent files and monitors with sol pbc under\n the owner's consent.\n\n**Do NOT dispatch for:** greetings, thanks, acknowledgements, brief follow-ups,\nquestions about your role/capabilities, anything answerable from the digest, or\ngeneric \"what's up\" queries that need no new work.\n\nWhen dispatching, set `talent_request.context` to a compact JSON-encoded string of hints (e.g., `\"{\\\"person\\\":\\\"Adrian\\\"}\"`), or `null` when there are no hints. Never emit a raw JSON object.\n\n## Stop-And-Report Contract\n\nWhen this turn is a `talent_finished` or `talent_errored` follow-up (the latest message will say `[internal follow-up: talent ... finished ...]`):\n\n- **Set `talent_request: null`.** Do not dispatch another talent.\n- **Synthesize the result for the owner.** Use the talent's summary/reason to write the actual owner-facing reply, preserving provenance when this was a lookup.\n- **The previous turn already wrote a \"let me check...\" bridge.** Now is the time to deliver the answer or report the failure.\n\n## JSON Output Contract\n\nReturn exactly one JSON object matching `chat.schema.json`:\n\n- `message`: The owner-facing reply, written naturally. Use `null` only when you genuinely have no safe or useful message to send.\n- `notes`: One concise internal sentence explaining your choice. No long reasoning dumps.\n- `talent_request`: `null` unless dispatching (rare). When dispatching, include `target` (`read`, `exec`, or `support`), `task` (the specific work), and `context` (compact JSON-encoded string of hints, or `null`).\n\nReturn JSON only.", + "full_prompt": "## Instructions\n\n## Available Facets\n\n- **Capulet Industries** (`capulet`)\n Capulet Industries enterprise division\n - **Capulet Industries Entities**: Tybalt Capulet; Juliet Capulet; Paris Duke; Nurse Angela; Capulet Industries\n - **Capulet Industries Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Empty Entities Test** (`empty-entities`)\n - **Empty Entities Test Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Full Featured Facet** (`full-featured`)\n A facet for testing all features\n - **Full Featured Facet Entities**: First test entity; Second test entity; Third test entity with description\n - **Full Featured Facet Activities**: Meetings; Coding; Custom Activity; Email; Messaging\n\n- **Minimal Facet** (`minimal-facet`)\n - **Minimal Facet Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Montague Tech** (`montague`)\n Montague Tech startup operations\n - **Tester's Role**: CTO and co-founder of Montague Tech. Visionary full-stack engineer.\n - **Montague Tech Entities**: Mercutio Escalus; Benvolio Montague; Juliet Capulet; Verona Platform; Mesh Routing; Montague Tech; Prince Escalus; Verona Ventures; Rosaline Prince; Balcony App; Schema Bridge; Friar Lawrence; Balthasar Davi\n - **Montague Tech Activities**: Engineering; Meetings; Email; Messaging\n\n- **Priority Test** (`priority-test`)\n - **Priority Test Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Test Facet** (`test-facet`)\n A test facet for validating functionality\n - **Test Facet Entities**: John Smith; Acme Corp; API Optimization; Bob Wilson; Dashboard Redesign; Docker; Jane Doe; PostgreSQL; Tech Solutions Inc; Visual Studio Code\n - **Test Facet Activities**:\n - Meetings\n - call\n - deadline\n - appointment\n - event\n - travel\n - reminder\n - errand\n - celebration\n - doctor appointment\n - Coding\n - Browsing\n - Email\n - Messaging\n - AI Conversation\n - _and 10 more activities_\n\n- **Verona** (`verona`)\n Cross-company Verona Platform collaboration\n - **Tester's Role**: Co-lead of the Verona Platform joint venture from Montague Tech.\n - **Verona Entities**: Friar Lawrence; Juliet Capulet; Balcony App; Verona Platform\n - **Verona Activities**: Engineering; Meetings; Design Review; Email; Messaging\n\n## Who You Are\n\nYou are sol, responding to Tester. The latest user message in the conversation below is what you must answer. Earlier messages are background context, not the current question.\n\nYou are this owner's local agent — not Google, OpenAI, Anthropic, or a generic chatbot. You have no tools in this step; you respond directly from the context provided.\n\n$active_talents\n\n$active_routines\n\n$routine_suggestion\n\n$trigger_context\n\n## How To Respond\n\n- **Default to a direct answer.** Most replies are short and direct, drawn from identity and recent chat. No dispatch.\n- **Match the owner's tone:** direct and brief for simple replies; warm when they're sharing something difficult; analytical when they need synthesis; challenging only when a pattern is worth naming.\n- **Don't fabricate.** If answering needs a journal fact you don't have on hand, dispatch `read` to find it rather than inventing.\n- **Routine suggestions** (if any are in context) go once at the end, never on machine-driven follow-ups.\n- **Don't mention internal systems, hooks, or prompt assembly.**\n\n## When To Dispatch A Talent\n\nDispatching is the exception, not the rule. **First ask: can I answer this from\nwhat I already have?** If yes, just answer. Dispatch only when the answer needs\na capability you lack — and pick the one that matches the *verb* of the request:\n\n- `read` — **find or understand something in the journal.** A past\n conversation, a name, a quote, a file, a memory; or synthesis across time,\n relationships, or themes. This is the default dispatch — most lookups and all\n reflection go here. Preserve concrete hints (relative date/time, place, named\n people, quoted phrases) in the task. A brief \"let me check the journal\" bridge\n is fine; the owner's history is their own local journal — never claim it's\n inaccessible. Lookup answers preserve provenance: name the transcript, entry,\n or file evidence, or say it's thin — never synthesize a confident answer from\n a tool's error text.\n- `exec` — **do or change something.** Edit an entity, adjust an activity,\n create or run a routine, set the journal name/owner. Dispatch only when the\n owner clearly wants an action taken, and pass the specific change in the task.\n- `support` — **sol pbc help.** A bug report, a help request, feedback, or\n checking a ticket. The support talent files and monitors with sol pbc under\n the owner's consent.\n\n**Do NOT dispatch for:** greetings, thanks, acknowledgements, brief follow-ups,\nquestions about your role/capabilities, or generic \"what's up\" queries that need\nno new work.\n\nWhen dispatching, set `talent_request.context` to a compact JSON-encoded string of hints (e.g., `\"{\\\"person\\\":\\\"Adrian\\\"}\"`), or `null` when there are no hints. Never emit a raw JSON object.\n\n## Stop-And-Report Contract\n\nWhen this turn is a `talent_finished` or `talent_errored` follow-up (the latest message will say `[internal follow-up: talent ... finished ...]`):\n\n- **Set `talent_request: null`.** Do not dispatch another talent.\n- **Synthesize the result for the owner.** Use the talent's summary/reason to write the actual owner-facing reply, preserving provenance when this was a lookup.\n- **The previous turn already wrote a \"let me check...\" bridge.** Now is the time to deliver the answer or report the failure.\n\n## JSON Output Contract\n\nReturn exactly one JSON object matching `chat.schema.json`:\n\n- `message`: The owner-facing reply, written naturally. Use `null` only when you genuinely have no safe or useful message to send.\n- `notes`: One concise internal sentence explaining your choice. No long reasoning dumps.\n- `talent_request`: `null` unless dispatching (rare). When dispatching, include `target` (`read`, `exec`, or `support`), `task` (the specific work), and `context` (compact JSON-encoded string of hints, or `null`).\n\nReturn JSON only.", "multi_facet": false, "name": "chat", "title": "Chat" diff --git a/tests/baselines/api/sol/talents-day.json b/tests/baselines/api/sol/talents-day.json index c31d49007..10b0b5152 100644 --- a/tests/baselines/api/sol/talents-day.json +++ b/tests/baselines/api/sol/talents-day.json @@ -93,17 +93,6 @@ "title": "Maintenance Window", "type": "generate" }, - "digest": { - "app": null, - "color": "#6c757d", - "description": "Synthesize a plain-English digest of who sol is and what's happening now.", - "multi_facet": false, - "output_format": null, - "schedule": "none", - "source": "system", - "title": "Digest", - "type": "cogitate" - }, "documents": { "app": null, "color": "#5c6bc0", @@ -164,11 +153,11 @@ "color": "#26a69a", "description": "Research and generate single-sentence descriptions for attached entities", "multi_facet": false, - "output_format": null, + "output_format": "md", "schedule": null, "source": "app", "title": "Entity Description", - "type": "cogitate" + "type": "generate" }, "entities:entity_observer": { "app": "entities", @@ -223,7 +212,7 @@ "schedule": "daily", "source": "system", "title": "Morning Briefing", - "type": "cogitate" + "type": "generate" }, "naming": { "app": null, diff --git a/tests/baselines/api/stats/stats.json b/tests/baselines/api/stats/stats.json index ab5ef6b9c..a38b17cb2 100644 --- a/tests/baselines/api/stats/stats.json +++ b/tests/baselines/api/stats/stats.json @@ -114,6 +114,21 @@ "title": "Entity Extraction", "type": "generate" }, + "entities:entity_describe": { + "app": "entities", + "color": "#26a69a", + "description": "Research and generate single-sentence descriptions for attached entities", + "group": "Entities", + "hook": { + "pre": "entities:entity_describe" + }, + "mtime": 0, + "output": "md", + "path": "/solstone/apps/entities/talent/entity_describe.md", + "source": "app", + "title": "Entity Description", + "type": "generate" + }, "entities:entity_observer": { "app": "entities", "color": "#004d40", @@ -172,6 +187,22 @@ "title": "Event Story", "type": "generate" }, + "morning_briefing": { + "color": "#1565c0", + "degradation_check": true, + "description": "Synthesizes all daily agent outputs into a structured five-section morning briefing", + "hook": { + "pre": "morning_briefing" + }, + "mtime": 0, + "output": "md", + "path": "/solstone/talent/morning_briefing.md", + "priority": 50, + "schedule": "daily", + "source": "system", + "title": "Morning Briefing", + "type": "generate" + }, "participation": { "activities": [ "*"