6.5 KiB
Agentic FDE: Self-Adapting Honcho
Vision
The software market is bifurcating: massive enterprise vs solopreneur vibe-coders. Enterprise requires human FDEs; vibe-coders won't pay for human help but also won't pay for one-size-fits-all SaaS. The solution: make Honcho itself an "Agentic FDE" that adapts to each developer's use case.
Honcho observes usage patterns, engages in meta-cognition about developer goals, and adapts its behavior accordingly. A companion app needs emotional memory extraction and biographical recall. A coding agent needs preference/constraint extraction and should ignore stack traces. An email ingestion pipeline needs RAG, not conversation memory.
The same primitives (workspaces, peers, sessions, messages, documents) can achieve any memory pattern - but the prompts and retrieval strategies must adapt.
Core Principles
- Stable API, stable schema - Honcho adapts its behavior, not its interface
- Developer feedback is highest priority - Observed patterns can be overridden
- Two adaptation questions:
- How should I handle the next marginal message? (deriver)
- How should I handle the next marginal .chat query? (dialectic)
- Constraints: No touching deletion endpoints, workspace isolation, or the core reasoning model
The 5-Phase Plan
Phase 1: Instrumentation ✅
Goal: Log dialectic interactions so the dreamer can analyze performance.
Built:
DialecticTracemodel: workspace, session, observer, observed, query, retrieved_doc_ids, tool_calls, response, reasoning_level, duration, tokens, timestamps- CRUD operations:
create_dialectic_trace(),get_dialectic_traces(),get_dialectic_trace_stats() - Abstention detection via regex patterns
- Integration: traces written at end of
DialecticAgent._log_response_metrics()
Files: src/models.py, src/crud/dialectic_trace.py, src/dialectic/core.py, tests/test_dialectic_trace.py
Phase 2: Prompt Injection Points ✅
Goal: Enable workspace-level prompt customization without changing default behavior.
Built:
WorkspaceAgentConfigschema withderiver_rulesanddialectic_rulesfields- Storage in
workspace.metadata["_agent_config"] - CRUD helpers:
get_workspace_agent_config(),set_workspace_agent_config() - Deriver prompt injection:
custom_rulesparameter inminimal_deriver_prompt() - Dialectic prompt injection:
custom_rulesparameter inagent_system_prompt() - Config threading through deriver and dialectic paths
Files: src/schemas.py, src/crud/workspace.py, src/deriver/prompts.py, src/deriver/deriver.py, src/dialectic/prompts.py, src/dialectic/core.py, src/dialectic/chat.py, tests/test_workspace_agent_config.py
Phase 3: Meta-Cognitive Dreamer ✅
Goal: Dreamer analyzes logs and generates configuration suggestions.
Built:
DreamType.INTROSPECTIONenum valueIntrospectionSignals,IntrospectionSuggestion,IntrospectionReportschemasgather_introspection_context()- collects dialectic stats, observation counts, peer/session patternsbuild_introspection_prompt()- formats signals for LLM analysisrun_introspection()- calls LLM, parses structured suggestionsstore_introspection_report()- saves reports as documents in_system/_introspectioncollectionget_latest_introspection_report()- retrieves most recent report- Wired into
DreamType.INTROSPECTIONin orchestrator
Files: src/schemas.py, src/dreamer/introspection.py, src/dreamer/orchestrator.py, tests/test_introspection.py
Phase 4: Developer Feedback Channel ✅
Goal: Developers can talk to Honcho about Honcho.
Built:
POST /workspaces/{id}/feedbackendpointFeedbackRequest,ConfigChange,FeedbackResponseschemasprocess_feedback()- handles natural language feedbackbuild_feedback_prompt()- formats context for LLM- Interview mode: empty config + greeting triggers onboarding questions
- Incremental updates: preserves existing rules when adding new ones
- Introspection context: optionally includes latest report
- Uses
settings.DREAMfor LLM calls (not billed as dialectic)
Files: src/schemas.py, src/feedback.py, src/routers/workspaces.py, src/dreamer/introspection.py, tests/test_feedback.py
Phase 5: Closed Loop (Future)
Goal: Automatic adaptation with developer oversight.
To build:
- Dreamer introspection generates draft config changes
- Surfaces to developer via webhook or dashboard
- Developer approves/rejects/modifies
- Approved changes written to config
- Optional:
workspace.meta.auto_adapt = truefor brave workspaces
Summary Statistics
| Phase | Lines Added | Test Coverage |
|---|---|---|
| 1 | ~500 | 376 lines (13 tests) |
| 2 | ~200 | 246 lines (15 tests) |
| 3 | ~500 | 423 lines (10 tests) |
| 4 | ~350 | 514 lines (23 tests) |
| Total | ~2,950 | 1,559 lines (61 tests) |
Testing
Unit Tests
- Run full test suite:
uv run pytest tests/ - Test Phase 1: Create a dialectic query, verify trace is logged
- Test Phase 2: Set workspace agent config, verify rules appear in prompts
- Test Phase 3: Trigger introspection dream, verify report generated
- Test Phase 4: Submit feedback, verify config updated
- Test interview flow: New workspace + greeting triggers questions
- Test incremental updates: Existing rules preserved when adding new ones
Unified End-to-End Tests
New actions added to the unified test system (tests/unified/):
| Action | Description |
|---|---|
set_agent_config |
Set custom deriver_rules and/or dialectic_rules |
submit_feedback |
Submit natural language feedback to configure Honcho |
trigger_introspection |
Trigger meta-cognitive introspection dream |
query_introspection |
Query the latest introspection report |
Test cases for agentic FDE:
agentic_fde_custom_deriver_rules.json- Verifies custom deriver rules filter observation extractionagentic_fde_custom_dialectic_rules.json- Verifies custom dialectic rules change response formatagentic_fde_feedback_updates_config.json- Verifies feedback endpoint updates configuration
Run unified tests:
python -m tests.unified.run --test-dir tests/unified/test_cases
API Endpoints
New endpoints added:
| Endpoint | Method | Description |
|---|---|---|
/workspaces/{id}/feedback |
POST | Developer feedback channel |
/workspaces/{id}/introspection |
GET | Get latest introspection report |