commits
The agent cards in the health app showed "UNKNOWN" because cortex only
captured model from the agent's start event, not provider. The agent
subprocess resolves the correct provider but cortex never stored it.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When the supervisor starts in local mode with daily processing enabled,
check for journal days with unprocessed stream data and submit dream
tasks for each. This closes the gap where a mid-day restart would leave
today's (and recent days') stream data unprocessed until midnight.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Import reordering (isort), line wrapping in tests, resolve
split "mu" "se" string literals to "muse", and update AGENTS.md
identity references.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the make sail callosum code.shipped flow with a direct service restart using sol service restart --if-installed.
Add restart handling for uninstalled services, wire the CLI flag through sol service restart, remove the obsolete supervisor code.shipped handler and docs, and cover the new restart behavior in tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace remaining get_muse_configs references in docs/ with get_talent_configs
- Regenerate graph API baseline (score float drift, pre-existing)
- Fix retention test fixture date (20260306 → 20260401, crossed 30d window)
Three-case rename (muse/Muse/MUSE → talent/Talent/TALENT) across all
directories, filenames, Python code, CLI flags, config, docs, and tests.
Backward-compat shims for legacy journal data:
- Token logs: normalize "muse.*" context strings to "talent.*" at read time
- Exchanges: accept both "talent" and "muse" field names when reading
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comprehensive guide covering the two-tier CLI architecture (top-level
system commands vs sol call tool-callable functions), how to add commands
at each tier, the auto-discovery pattern for apps/*/call.py, conventions
(env defaults, action logging, --consent flag), full command inventory,
skill system integration, and file maintenance checklists.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove operational sections (Adaptive Depth, Skills, Speaker Intelligence,
Routines, Support, Onboarding) that are now loaded via facets/skills rather
than baked into the static agent prompt. Replace with concise Partnership
and Resilience sections.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace $journal with $sol_identity in all 13 remaining agent prompts.
Remove journal loading from get_agent() and prepare_config(), remove
include_journal parameter from load_prompt(), delete think/journal.md,
and update docs and tests.
muse/chat.md was created by the identity refactor after the feature
branch diverged, so the template unification never migrated it. Remove
the obsolete instructions frontmatter and add $facets inline. Regenerate
all API baselines to match.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
# Conflicts:
# muse/heartbeat.md
# muse/morning_briefing.md
# muse/partner.md
# muse/pulse.md
# sol/identity.md
# tests/baselines/api/agents/preview.json
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the invisible \ JSON object in agent .md frontmatter
with explicit inline template variables (, ,
) and a top-level \ key for source data config.
The .md body is now the complete prompt — what you read is what the
model sees.
Changes:
- Rename instructions.sources → top-level \ key in 14 agent files
- Add , , as template variables
resolved in load_prompt() via caller-provided context
- Migrate all 37 agent .md files to inline template vars
- Delete _DEFAULT_INSTRUCTIONS, _DEFAULT_ACTIVITY_CONFIG,
_merge_instructions_config(), compose_instructions()
- Simplify get_agent() to extract load key and resolve template vars
- Simplify prepare_config() to pass facets/journal/activity context
through prompt_context dict
- Simplify _build_activity_context() to always produce all 3 sections
- Update all test fixtures and assertions
The identity refactor changed agent descriptions, chat prompt output,
and provider context defaults. Regenerate the 3 affected baselines.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract pure identity content from sol/identity.md (strip frontmatter,
<150 lines), create muse/chat.md as the new cogitate chat agent, and
add _load_sol_vars() to auto-load sol/*.md files as $sol_* template vars.
Update morning_briefing, pulse, heartbeat, and partner agents to use
$sol_identity instead of "system": "journal". Create muse/routines/SKILL.md
with template and command reference tables. Update agent routing so
"unified" resolves to muse/chat.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Weekly boundary-based scheduling with configurable day/time, dedup
across supervisor restarts, and auto-registration of weekly-agents
in config/schedules.json. Partner profile agent now runs weekly.
Wires up cluster_span() to the CLI so agents can read multiple segments
in one call. Updates TODO Detector to use --segments $activity_segments
instead of per-segment iteration, completing the sources removal.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Removes the sources config from the instruction map — the only cogitate muse
that used it. The agent now reads activity transcripts through sol call
transcripts read like every other cogitate, giving it the ability to bail
early on sparse activities and keeping the cogitate contract consistent.
Also adds now:true (was the only cogitate missing it).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The settings_client fixture was missing symlinks=True, causing
shutil.copytree to fail on the journal fixture's health log symlinks.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Validates provider API keys against each provider's API when saved in
settings. Results are cached in journal.json and surfaced on both the
API Keys page (per-key status) and Providers page (badge next to
selected provider). Includes a "Re-validate All Keys" button for
bulk re-check.
- validate_key() in each provider module (google, openai, anthropic)
- Dispatcher in think/providers/__init__.py
- Synchronous validation hooked into PUT /api/config for env keys
- POST /app/settings/api/validate-keys endpoint for bulk re-validation
- key_validation included in GET /api/providers response
- Frontend: validation badges, status indicators, re-validate button
- 13 tests covering provider validation, dispatcher, and route integration
audio/screen were silently ignored by cluster.py which expects
transcripts/percepts — transcripts were never actually loaded.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add sol call sol partner CLI command for reading/writing sol/partner.md,
bootstrap template in ensure_sol_directory(), generic update_identity_section()
helper in awareness.py, muse/partner.md cogitate agent (schedule: none,
priority 95), and partner profile injection into pulse, morning briefing,
and identity agent prompts. Updated API baselines for new agent.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sol's identity prompt is not a muse capability; it is the core of who Sol is. Move unified.md to sol/identity.md to separate identity from the capability layer while keeping the public agent name 'unified' for backward compatibility.
Key changes:
- git mv muse/unified.md -> sol/identity.md
- updated think/muse.py path resolution for agent discovery, unified agent loading, and explicit hook paths
- updated AGENTS generation script, related tests, and prompt-template docs
- regenerated AGENTS.md from the new source path
Never set _SOLSTONE_JOURNAL_OVERRIDE from application code. Cross-refs
environment.md for the full explanation.
Application code must never set _SOLSTONE_JOURNAL_OVERRIDE — it exists
for external callers (tests, Makefile sandboxes) only. Removed:
- cortex.py: no longer sets override when spawning agent subprocesses
- bridge.py: no longer sets override in process environment
- service.py: no longer propagates override into service install files
- heartbeat.py: prompt no longer contains filesystem paths
- heartbeat.md: removed promise about path being in prompt
Added documentation in get_journal() docstring and coding reference
that the env var must never be set from application code.
The provenance URI scheme already points to more than segments —
newsletters, agent outputs, calendar entries. Rename to sol:// now
before any runtime parser or stored data exists. 3 files, 29 occurrences.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The test patched observe.transcribe.revai.load_dotenv but the module
never imported load_dotenv. patch.dict with clear=True is sufficient.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The unified prompt changed (muse/unified.md) which shifted the
preview, graph, and stats baselines.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add --value to sol call sol {self,agency,pulse} write commands so
sandbox agents (Codex) can write identity files without stdin piping.
Every identity file write now appends a JSONL record to
sol/history.jsonl with timestamp, file, section, unified diff, and
source (cli/api). Update muse instructions to use --value syntax.
Add Phase 1.5 pre-pass audit to morning briefing agent that counts
sources, identifies gaps, and catalogs tool errors before synthesis.
Add CRITICAL block ensuring tool errors are recorded as gaps and never
used as data, with graceful degradation for entity intelligence failures.
Update output template with model, sources, and gaps frontmatter fields
plus a coverage preamble blockquote. Update test fixture to match.
The heartbeat agent was ignoring the journal path in the prompt and
searching the filesystem, finding the wrong journal. Add CRITICAL
instruction to use sol call commands exclusively. The cortex already
sets _SOLSTONE_JOURNAL_OVERRIDE env var for all spawned agents.
dotenv/load_dotenv imports and calls in agents.py and revai.py were
dead code (os.environ is already populated from journal.json by
setup_cli). Their presence caused recurring cross-session confusion
where sessions believed .env files were the API key configuration
method. The actual path is journal.json only.
- Remove load_dotenv import and call from think/agents.py
- Remove load_dotenv import and call from observe/transcribe/revai.py
- Fix setup_cli() docstring to not reference .env
- Fix docs/THINK.md to reference journal.json env section
- Fix docs/PROVIDERS.md to remove dotenv pattern, clarify setup_cli flow
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three critical fixes from the onboarding flow map v2 expert review:
1. Remove API key handling from _collect_env() in think/service.py — keys are
already loaded at runtime via setup_cli(), writing them into systemd units
and launchd plists was redundant and exposed secrets in service files.
2. Generate a random convey session signing secret on first launch instead of
hardcoding "solstone-secret". Every installation now gets a unique secret
persisted to journal.json. The secret is stripped from API responses.
3. Apply os.chmod(0o600) after every journal.json write (settings routes,
agent config, remote client) and remote metadata files (apps/remote/utils.py).
Matches the permission model already used by observer repos.
Also cleans up stale .env references: renamed system_env to runtime_env in the
settings API since os.environ fallback was removed and keys now load strictly
from journal.json.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Enables programmatic consumers (solstone-macos) to parse remote CLI output
without fragile string splitting. All 5 subcommands (create, list, revoke,
rename, status) emit structured JSON when --json is passed.
The flag goes on the existing `observe/remote_cli.py` file only.
Files changed:
- convey/templates/conversation_panel.html
- convey/templates/app.html
- convey/templates/status_pane.html
- apps/settings/workspace.html
- muse/onboarding.md
Remove the get_enabled_facets() check from triage routing so new journals
route to the onboarding muse based on onboarding_status alone (C2).
Simplify the root / redirect to always go to home, letting the onboarding
muse handle first-time setup via the chat bar (C6). Update stale test
expectations and remove dead facets mock from _run_triage helper.
Three files changed:
- convey/templates/login.html
- convey/static/app.css
- convey/static/colors.js
journal.json config `env` section is now the sole source for API keys.
Removed shell environment fallback and migration warning from service.py
_collect_env(). Changed utils.py setup_cli() to unconditionally set env
vars from journal.json config, overriding any shell env values (was
previously shell env > .env > journal.json precedence). Updated tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the make sail callosum code.shipped flow with a direct service restart using sol service restart --if-installed.
Add restart handling for uninstalled services, wire the CLI flag through sol service restart, remove the obsolete supervisor code.shipped handler and docs, and cover the new restart behavior in tests.
Three-case rename (muse/Muse/MUSE → talent/Talent/TALENT) across all
directories, filenames, Python code, CLI flags, config, docs, and tests.
Backward-compat shims for legacy journal data:
- Token logs: normalize "muse.*" context strings to "talent.*" at read time
- Exchanges: accept both "talent" and "muse" field names when reading
Comprehensive guide covering the two-tier CLI architecture (top-level
system commands vs sol call tool-callable functions), how to add commands
at each tier, the auto-discovery pattern for apps/*/call.py, conventions
(env defaults, action logging, --consent flag), full command inventory,
skill system integration, and file maintenance checklists.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove operational sections (Adaptive Depth, Skills, Speaker Intelligence,
Routines, Support, Onboarding) that are now loaded via facets/skills rather
than baked into the static agent prompt. Replace with concise Partnership
and Resilience sections.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
muse/chat.md was created by the identity refactor after the feature
branch diverged, so the template unification never migrated it. Remove
the obsolete instructions frontmatter and add $facets inline. Regenerate
all API baselines to match.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the invisible \ JSON object in agent .md frontmatter
with explicit inline template variables (, ,
) and a top-level \ key for source data config.
The .md body is now the complete prompt — what you read is what the
model sees.
Changes:
- Rename instructions.sources → top-level \ key in 14 agent files
- Add , , as template variables
resolved in load_prompt() via caller-provided context
- Migrate all 37 agent .md files to inline template vars
- Delete _DEFAULT_INSTRUCTIONS, _DEFAULT_ACTIVITY_CONFIG,
_merge_instructions_config(), compose_instructions()
- Simplify get_agent() to extract load key and resolve template vars
- Simplify prepare_config() to pass facets/journal/activity context
through prompt_context dict
- Simplify _build_activity_context() to always produce all 3 sections
- Update all test fixtures and assertions
Extract pure identity content from sol/identity.md (strip frontmatter,
<150 lines), create muse/chat.md as the new cogitate chat agent, and
add _load_sol_vars() to auto-load sol/*.md files as $sol_* template vars.
Update morning_briefing, pulse, heartbeat, and partner agents to use
$sol_identity instead of "system": "journal". Create muse/routines/SKILL.md
with template and command reference tables. Update agent routing so
"unified" resolves to muse/chat.
Removes the sources config from the instruction map — the only cogitate muse
that used it. The agent now reads activity transcripts through sol call
transcripts read like every other cogitate, giving it the ability to bail
early on sparse activities and keeping the cogitate contract consistent.
Also adds now:true (was the only cogitate missing it).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Validates provider API keys against each provider's API when saved in
settings. Results are cached in journal.json and surfaced on both the
API Keys page (per-key status) and Providers page (badge next to
selected provider). Includes a "Re-validate All Keys" button for
bulk re-check.
- validate_key() in each provider module (google, openai, anthropic)
- Dispatcher in think/providers/__init__.py
- Synchronous validation hooked into PUT /api/config for env keys
- POST /app/settings/api/validate-keys endpoint for bulk re-validation
- key_validation included in GET /api/providers response
- Frontend: validation badges, status indicators, re-validate button
- 13 tests covering provider validation, dispatcher, and route integration
Add sol call sol partner CLI command for reading/writing sol/partner.md,
bootstrap template in ensure_sol_directory(), generic update_identity_section()
helper in awareness.py, muse/partner.md cogitate agent (schedule: none,
priority 95), and partner profile injection into pulse, morning briefing,
and identity agent prompts. Updated API baselines for new agent.
Sol's identity prompt is not a muse capability; it is the core of who Sol is. Move unified.md to sol/identity.md to separate identity from the capability layer while keeping the public agent name 'unified' for backward compatibility.
Key changes:
- git mv muse/unified.md -> sol/identity.md
- updated think/muse.py path resolution for agent discovery, unified agent loading, and explicit hook paths
- updated AGENTS generation script, related tests, and prompt-template docs
- regenerated AGENTS.md from the new source path
Application code must never set _SOLSTONE_JOURNAL_OVERRIDE — it exists
for external callers (tests, Makefile sandboxes) only. Removed:
- cortex.py: no longer sets override when spawning agent subprocesses
- bridge.py: no longer sets override in process environment
- service.py: no longer propagates override into service install files
- heartbeat.py: prompt no longer contains filesystem paths
- heartbeat.md: removed promise about path being in prompt
Added documentation in get_journal() docstring and coding reference
that the env var must never be set from application code.
Add --value to sol call sol {self,agency,pulse} write commands so
sandbox agents (Codex) can write identity files without stdin piping.
Every identity file write now appends a JSONL record to
sol/history.jsonl with timestamp, file, section, unified diff, and
source (cli/api). Update muse instructions to use --value syntax.
Add Phase 1.5 pre-pass audit to morning briefing agent that counts
sources, identifies gaps, and catalogs tool errors before synthesis.
Add CRITICAL block ensuring tool errors are recorded as gaps and never
used as data, with graceful degradation for entity intelligence failures.
Update output template with model, sources, and gaps frontmatter fields
plus a coverage preamble blockquote. Update test fixture to match.
dotenv/load_dotenv imports and calls in agents.py and revai.py were
dead code (os.environ is already populated from journal.json by
setup_cli). Their presence caused recurring cross-session confusion
where sessions believed .env files were the API key configuration
method. The actual path is journal.json only.
- Remove load_dotenv import and call from think/agents.py
- Remove load_dotenv import and call from observe/transcribe/revai.py
- Fix setup_cli() docstring to not reference .env
- Fix docs/THINK.md to reference journal.json env section
- Fix docs/PROVIDERS.md to remove dotenv pattern, clarify setup_cli flow
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three critical fixes from the onboarding flow map v2 expert review:
1. Remove API key handling from _collect_env() in think/service.py — keys are
already loaded at runtime via setup_cli(), writing them into systemd units
and launchd plists was redundant and exposed secrets in service files.
2. Generate a random convey session signing secret on first launch instead of
hardcoding "solstone-secret". Every installation now gets a unique secret
persisted to journal.json. The secret is stripped from API responses.
3. Apply os.chmod(0o600) after every journal.json write (settings routes,
agent config, remote client) and remote metadata files (apps/remote/utils.py).
Matches the permission model already used by observer repos.
Also cleans up stale .env references: renamed system_env to runtime_env in the
settings API since os.environ fallback was removed and keys now load strictly
from journal.json.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the get_enabled_facets() check from triage routing so new journals
route to the onboarding muse based on onboarding_status alone (C2).
Simplify the root / redirect to always go to home, letting the onboarding
muse handle first-time setup via the chat bar (C6). Update stale test
expectations and remove dead facets mock from _run_triage helper.
journal.json config `env` section is now the sole source for API keys.
Removed shell environment fallback and migration warning from service.py
_collect_env(). Changed utils.py setup_cli() to unconditionally set env
vars from journal.json config, overriding any shell env values (was
previously shell env > .env > journal.json precedence). Updated tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>