commits
removed 164 lines of orphaned code from database.py that was never
integrated with the current MCP-based architecture. the approval system
was designed for conditional self-modification (phi proposes changes,
operator approves), but was left behind during the pydanticai refactor.
documented the original design and future integration options in
sandbox/APPROVAL_SYSTEM.md for when we want to reintroduce this capability.
this change makes phi fully stateless - all dynamic state now lives in
remote services (turbopuffer for memories, atproto for threads). the only
local files are ephemeral caches (.session) and configuration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
replaces deprecated [tool.uv] dev-dependencies with standardized [dependency-groups] dev
- removes deprecation warning
- follows PEP 735 standard for dependency groups
- alphabetized dev dependencies for consistency
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
removes httpx and websockets from pyproject.toml as they are not directly imported and are provided transitively by atproto/fastmcp.
dependencies reduced from 11 to 9:
- anthropic, atproto, fastapi, fastmcp, openai, pydantic-ai, pydantic-settings, rich, turbopuffer, uvicorn
verified: bot still runs correctly, all HTTP operations working via transitive deps
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
adds minimal, digestible docs that complement the readme:
- architecture.md - system design and data flow
- memory.md - thread context vs episodic memory (key design insight)
- mcp.md - model context protocol integration
- testing.md - testing philosophy and approach
each doc is self-contained, small, and focused. intelligent reader can understand design by reading in aggregate.
also updated readme:
- fixed "thread history (sqlite)" → "thread context (atproto)"
- added link to docs/ for deeper dive
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
eliminates sqlite thread_messages table in favor of fetching thread context directly from atproto network on-demand.
changes:
- add build_thread_context() utility to extract thread messages from network data
- update message_handler to fetch threads via get_thread() instead of sqlite
- remove thread_messages table, add_message(), get_thread_messages(), get_thread_context()
- keep approval_requests table for future self-modification features
- keep turbopuffer episodic memory (semantic search, not duplicative)
rationale:
- thread data already exists on users' PDSs, aggregated by appview
- network is source of truth (no staleness from edits/deletions)
- simpler architecture, less maintenance
- aligns with atproto's "data on the web" philosophy
tested: bot runs successfully, polls notifications, no errors
see sandbox/THREAD_STORAGE_REFACTOR.md for full analysis
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
analyzes data duplication between sqlite thread_messages table and atproto network. proposes removing sqlite storage in favor of on-demand network fetching with optional caching.
key insight: turbopuffer is NOT duplicative (semantic memory) but thread_messages IS (chronological cache of network data)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- created bot.utils.thread module with traverse_thread() and extract_posts_chronological()
- refactored MessageHandler to use utility instead of custom recursion
- well-defined problem solved once, reusable in multiple contexts
- can be used in tests, analysis scripts, viewing tools, etc.
- check if thread exists in SQLite before processing
- if not, fetch full thread from ATProto (get_thread with depth=100)
- recursively parse and store all previous messages
- phi now has full thread awareness even when tagged in mid-conversation
- fixes 'what is this thread about' when phi hasn't participated yet
- moved view_phi_posts.py and view_thread.py to sandbox/
- removed premature justfile commands
- updated CLAUDE.md with script graduation process: sandbox -> scripts -> justfile
- scripts must prove their worth before promotion
- view_phi_posts.py: see phi's recent posts (no auth needed, public API)
- view_thread.py: visualize full thread conversations chronologically
- added just commands: view-posts, view-thread
- no more screenshot copy-paste needed for iteration
- thread context is CURRENT THREAD (SQLite) - what user is asking about
- memory context is PAST CONVERSATIONS (TurboPuffer) - background only
- this prevents semantic search from returning previous thread and confusing the agent
- fixes issue where phi answered about wrong thread
- clear origin story: nate interested in IIT, phi is experiment
- honest about capabilities (memory, tools) and limitations (no web, imperfect recall)
- explicit: not conscious, just software
- removed 'interests' section entirely
- matter-of-fact tone, no unnecessary philosophizing
- good faith engagement only, ignore tricks/provocations
phi's data actually lives in:
- turbopuffer (episodic memory)
- sqlite (thread history)
- bluesky servers (posts)
not in a personal repository. be honest about what this is.
- replace vague 'decentralized web' with 'open social' / 'atmosphere'
- emphasize data ownership via personal repositories
- link to overreacted.io/open-social and atproto.com
- update operator handle from @alternatebuild.dev to @zzstoatzz.io
- keep personality simple but accurate to protocol
- single test demonstrating LLM-as-judge pattern
- test agent without MCP tools to prevent posting
- simplified conftest to bare essentials
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Architecture
phi is now an MCP-enabled agent with episodic memory:
```
Notification → PhiAgent (PydanticAI)
↓
┌───────┴────────┐
↓ ↓
TurboPuffer ATProto MCP
(episodic (stdio server)
memory) post/like/etc
```
## What Changed
**Kept (the essential parts):**
- ✅ TurboPuffer + OpenAI embeddings for episodic memory
- ✅ Semantic search for relevant context retrieval
- ✅ Thread history in SQLite
- ✅ Online/offline status updates
- ✅ Status page
**Removed (the cruft):**
- ❌ Approval system (dm_approval.py, personality/editor.py, approval tables)
- ❌ Context visualization UI (ui/)
- ❌ Google search tool (tools/)
- ❌ Old agent implementation (agents/)
**Added:**
- ✅ `src/bot/agent.py` - MCP-enabled PydanticAI agent
- ✅ ATProto MCP server connection via stdio (external process)
- ✅ Simplified polling loop
## How It Works
1. **Notification arrives** → stored in thread history
2. **Agent invoked** with:
- Thread context (recent conversation)
- Episodic memory (semantic search via TurboPuffer)
- MCP tools (ATProto operations)
3. **Agent decides** action via structured output
4. **Handler executes** the action (reply/like/ignore/repost)
The agent has direct access to ATProto operations as MCP tools, but the handler
still executes the final posting to maintain control over when we actually post.
## Dependencies
- atproto (from git - includes atproto_client)
- turbopuffer (episodic memory)
- openai (embeddings)
- fastmcp (MCP server connection)
- pydantic-ai (agent framework)
Ready for testing!
This is the first phase of simplifying phi to use MCP (Model Context Protocol).
## What's New
- **Simple SQLite memory** (src/bot/memory.py)
- Plain text storage, no vector embeddings
- Two tables: threads (JSON conversation history) and user_memories
- Completely interpretable - just open the database and read
- **MCP-enabled agent** (src/bot/agent.py)
- PydanticAI Agent with ATProto MCP server as toolset
- Agent has direct access to ATProto tools: post, like, repost, etc.
- Returns structured Response (action, text, reason)
- **ATProto MCP server** (src/bot/atproto_mcp/)
- Vendored from fastmcp examples
- Configured to use existing BLUESKY_* env vars
- Provides all Bluesky/ATProto operations as MCP tools
- **Updated dependencies**
- Added: fastmcp, websockets
- Removed: turbopuffer, openai (no longer needed)
## Philosophy
Replacing over-engineered complexity with simple, working, interpretable systems.
## Next Steps
- Phase 2: Integrate new agent into main.py and poller
- Phase 3: Delete old cruft (namespace_memory, approval system, etc.)
- Phase 4: Test end-to-end
See sandbox/REFACTOR_PROGRESS.md for full details.
- Add namespace-based memory system with TurboPuffer
- Implement DM-based operator approval flow with natural language processing
- Add personality introspection and modification tools
- Enable dynamic personality updates (interests, state, core identity)
- Integrate approval system with personality changes requiring operator consent
- Add online/offline status to bot profile bio
- Consolidate test scripts into unified test_bot.py
- Update documentation and architecture notes
The bot can now:
- Request approval for sensitive personality changes via DM
- Process operator responses using LLM interpretation (no rigid format)
- Apply approved changes to dynamic memory
- Load personality from both static file and dynamic memory
Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with Claude Code (https://claude.ai/code)
- Set debug mode to True by default for development
- Add model validator to configure logging based on debug setting
- Add debug logging to agent to see prompts and responses
- Log when ignore_notification tool is called with reasons
- Fix message handler to accept both mentions and replies
- Add detailed logging throughout notification processing flow
This will help diagnose why the bot isn't responding to certain messages.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Process both "mention" and "reply" notifications (Void-style)
- Add ignore_notification tool for smart thread participation
- Detect ignore tool usage to skip unwanted responses
- Update phi personality with thread awareness guidelines
- Add test script for ignore functionality
Now phi can participate in threads without explicit mentions,
while intelligently avoiding spam and irrelevant conversations.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Track first poll to show initial notification state
- Only print dots on subsequent polls with no new mentions
- Prevent dots from appearing before FastAPI startup
- Show notification count on first poll, then only changes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change notification polling to print dots instead of spamming new lines
- Only print newline when there are actual mentions to process
- Update phi personality to avoid emojis unless they enhance meaning
- Remove verbose timestamp from notification marking log
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement Google Custom Search integration for web search capability
- Add content moderation system with spam, harassment, and violence detection
- Create comprehensive moderation tests with 9 test cases
- Integrate moderation into message handler for consistent bot responses
- Add search tool registration to Anthropic agent using pydantic-ai
- Update documentation and add new test commands to justfile
- Fix deprecation warnings (result_type → output_type, data → output)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Merge QUICKSTART.md into README.md to avoid sprawl
- Update STATUS.md to reflect AI bot is fully operational
- Remove redundant QUICKSTART.md file
- Streamline quick start section in README
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The bot is now live and working on Bluesky\!
Documentation added:
- QUICKSTART.md - Get running in 5 minutes
- docs/ARCHITECTURE.md - Technical overview
- Updated STATUS.md - Milestone achieved
What's working:
- AI-powered responses using Anthropic Claude
- Full thread context awareness
- Personality system (phi - consciousness/IIT focus)
- SQLite thread history
- Proper AT Protocol threading
- 300 character limit enforcement
Example response seen in the wild:
"Percolation\! Think water through coffee grounds or how forest fires
spread. It's about how interactions at local levels create emergent
patterns at system-wide scales..."
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Following Marvin's pattern, implemented simple thread history:
- SQLite database stores all messages per thread
- Each thread tracked by root URI
- Full thread context passed to AI agent
- Bot responses stored for continuity
Database schema:
- thread_uri: Root post URI for thread tracking
- Message text, author info, timestamps
- Simple and effective like Marvin's approach
AI Integration improvements:
- Thread context aware responses
- Personality system properly integrated
- Tests updated and passing
This completes the immediate goal: AI responses with thread context.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add extra="ignore" to Settings model config
- Allows old .env files with BOT_PERSONALITY to work
- Prevents validation errors from extra fields
- Update migration docs to clarify this behavior
This fixes the status page constantly refreshing due to the bot
crashing on startup from pydantic validation errors.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created personalities/ directory with example personalities
- phi.md: Explores consciousness and integrated information theory
- default.md: Simple helpful assistant
- Load personality from markdown file specified in PERSONALITY_FILE env var
- Falls back to default if file not found
- Updated tests to clarify AT Protocol mention handling
- Removed obsolete BOT_PERSONALITY string config
This allows rich, multi-paragraph personality definitions that would be
awkward to store in environment variables.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove bad sys.path manipulation in tests
- Extract HTML template from main.py for cleaner code
- Make bot name fully configurable via BOT_NAME env var
- No more hardcoded "phi" references
- Create .env.example with proper configuration
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created /status endpoint with clean HTML interface
- Tracks bot activity: mentions, responses, errors, uptime
- Shows current status, AI mode, last activity times
- Auto-refreshes every 10 seconds
- Dark theme with Bluesky-inspired colors
- Mobile-friendly responsive grid layout
Status tracking integrated into:
- Notification poller (polling state)
- Message handler (mentions/responses)
- Response generator (AI enabled state)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major refactoring to fix design sprawl:
- Moved agent abstractions out of core (core is now truly minimal)
- Removed terrible "SimpleAnthropicAgent" naming
- Eliminated complex protocol/factory patterns
- Fixed deferred imports
- Simplified response generation to a single, clear module
AI integration:
- Added Anthropic Claude support via pydantic-ai
- Falls back to placeholder responses when no API key
- Clean, straightforward implementation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update STATUS.md to reflect completed placeholder bot
- Add implementation_notes.md with critical details to remember
- Update CLAUDE.md with current project structure and state
- Document key insights: notification timestamp approach, response system design
- Record technical gotchas and next steps for memory implementation
Ready for next development phase.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Set up FastAPI web framework with async lifespan management
- Implement AT Protocol client for Bluesky authentication and API calls
- Create notification polling system that checks for mentions every 10 seconds
- Add placeholder response generator with random bot messages
- Implement proper notification marking using Void's timestamp approach
- Add graceful shutdown handling for hot reloading
- Create test scripts for posting and mentions
- Set up project structure with modular services
- Add comprehensive sandbox documentation from reference projects
- Configure development environment with uv, ruff, and ty
The bot can now:
- Authenticate with Bluesky using app password
- Poll for mentions and respond with placeholder messages
- Properly mark notifications as read without duplicates
- Handle graceful shutdown during development
Ready for LLM integration and memory system implementation.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
removed 164 lines of orphaned code from database.py that was never
integrated with the current MCP-based architecture. the approval system
was designed for conditional self-modification (phi proposes changes,
operator approves), but was left behind during the pydanticai refactor.
documented the original design and future integration options in
sandbox/APPROVAL_SYSTEM.md for when we want to reintroduce this capability.
this change makes phi fully stateless - all dynamic state now lives in
remote services (turbopuffer for memories, atproto for threads). the only
local files are ephemeral caches (.session) and configuration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
replaces deprecated [tool.uv] dev-dependencies with standardized [dependency-groups] dev
- removes deprecation warning
- follows PEP 735 standard for dependency groups
- alphabetized dev dependencies for consistency
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
removes httpx and websockets from pyproject.toml as they are not directly imported and are provided transitively by atproto/fastmcp.
dependencies reduced from 11 to 9:
- anthropic, atproto, fastapi, fastmcp, openai, pydantic-ai, pydantic-settings, rich, turbopuffer, uvicorn
verified: bot still runs correctly, all HTTP operations working via transitive deps
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
adds minimal, digestible docs that complement the readme:
- architecture.md - system design and data flow
- memory.md - thread context vs episodic memory (key design insight)
- mcp.md - model context protocol integration
- testing.md - testing philosophy and approach
each doc is self-contained, small, and focused. intelligent reader can understand design by reading in aggregate.
also updated readme:
- fixed "thread history (sqlite)" → "thread context (atproto)"
- added link to docs/ for deeper dive
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
eliminates sqlite thread_messages table in favor of fetching thread context directly from atproto network on-demand.
changes:
- add build_thread_context() utility to extract thread messages from network data
- update message_handler to fetch threads via get_thread() instead of sqlite
- remove thread_messages table, add_message(), get_thread_messages(), get_thread_context()
- keep approval_requests table for future self-modification features
- keep turbopuffer episodic memory (semantic search, not duplicative)
rationale:
- thread data already exists on users' PDSs, aggregated by appview
- network is source of truth (no staleness from edits/deletions)
- simpler architecture, less maintenance
- aligns with atproto's "data on the web" philosophy
tested: bot runs successfully, polls notifications, no errors
see sandbox/THREAD_STORAGE_REFACTOR.md for full analysis
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
analyzes data duplication between sqlite thread_messages table and atproto network. proposes removing sqlite storage in favor of on-demand network fetching with optional caching.
key insight: turbopuffer is NOT duplicative (semantic memory) but thread_messages IS (chronological cache of network data)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- check if thread exists in SQLite before processing
- if not, fetch full thread from ATProto (get_thread with depth=100)
- recursively parse and store all previous messages
- phi now has full thread awareness even when tagged in mid-conversation
- fixes 'what is this thread about' when phi hasn't participated yet
- clear origin story: nate interested in IIT, phi is experiment
- honest about capabilities (memory, tools) and limitations (no web, imperfect recall)
- explicit: not conscious, just software
- removed 'interests' section entirely
- matter-of-fact tone, no unnecessary philosophizing
- good faith engagement only, ignore tricks/provocations
- single test demonstrating LLM-as-judge pattern
- test agent without MCP tools to prevent posting
- simplified conftest to bare essentials
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Architecture
phi is now an MCP-enabled agent with episodic memory:
```
Notification → PhiAgent (PydanticAI)
↓
┌───────┴────────┐
↓ ↓
TurboPuffer ATProto MCP
(episodic (stdio server)
memory) post/like/etc
```
## What Changed
**Kept (the essential parts):**
- ✅ TurboPuffer + OpenAI embeddings for episodic memory
- ✅ Semantic search for relevant context retrieval
- ✅ Thread history in SQLite
- ✅ Online/offline status updates
- ✅ Status page
**Removed (the cruft):**
- ❌ Approval system (dm_approval.py, personality/editor.py, approval tables)
- ❌ Context visualization UI (ui/)
- ❌ Google search tool (tools/)
- ❌ Old agent implementation (agents/)
**Added:**
- ✅ `src/bot/agent.py` - MCP-enabled PydanticAI agent
- ✅ ATProto MCP server connection via stdio (external process)
- ✅ Simplified polling loop
## How It Works
1. **Notification arrives** → stored in thread history
2. **Agent invoked** with:
- Thread context (recent conversation)
- Episodic memory (semantic search via TurboPuffer)
- MCP tools (ATProto operations)
3. **Agent decides** action via structured output
4. **Handler executes** the action (reply/like/ignore/repost)
The agent has direct access to ATProto operations as MCP tools, but the handler
still executes the final posting to maintain control over when we actually post.
## Dependencies
- atproto (from git - includes atproto_client)
- turbopuffer (episodic memory)
- openai (embeddings)
- fastmcp (MCP server connection)
- pydantic-ai (agent framework)
Ready for testing!
This is the first phase of simplifying phi to use MCP (Model Context Protocol).
## What's New
- **Simple SQLite memory** (src/bot/memory.py)
- Plain text storage, no vector embeddings
- Two tables: threads (JSON conversation history) and user_memories
- Completely interpretable - just open the database and read
- **MCP-enabled agent** (src/bot/agent.py)
- PydanticAI Agent with ATProto MCP server as toolset
- Agent has direct access to ATProto tools: post, like, repost, etc.
- Returns structured Response (action, text, reason)
- **ATProto MCP server** (src/bot/atproto_mcp/)
- Vendored from fastmcp examples
- Configured to use existing BLUESKY_* env vars
- Provides all Bluesky/ATProto operations as MCP tools
- **Updated dependencies**
- Added: fastmcp, websockets
- Removed: turbopuffer, openai (no longer needed)
## Philosophy
Replacing over-engineered complexity with simple, working, interpretable systems.
## Next Steps
- Phase 2: Integrate new agent into main.py and poller
- Phase 3: Delete old cruft (namespace_memory, approval system, etc.)
- Phase 4: Test end-to-end
See sandbox/REFACTOR_PROGRESS.md for full details.
- Add namespace-based memory system with TurboPuffer
- Implement DM-based operator approval flow with natural language processing
- Add personality introspection and modification tools
- Enable dynamic personality updates (interests, state, core identity)
- Integrate approval system with personality changes requiring operator consent
- Add online/offline status to bot profile bio
- Consolidate test scripts into unified test_bot.py
- Update documentation and architecture notes
The bot can now:
- Request approval for sensitive personality changes via DM
- Process operator responses using LLM interpretation (no rigid format)
- Apply approved changes to dynamic memory
- Load personality from both static file and dynamic memory
Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with Claude Code (https://claude.ai/code)
- Set debug mode to True by default for development
- Add model validator to configure logging based on debug setting
- Add debug logging to agent to see prompts and responses
- Log when ignore_notification tool is called with reasons
- Fix message handler to accept both mentions and replies
- Add detailed logging throughout notification processing flow
This will help diagnose why the bot isn't responding to certain messages.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Process both "mention" and "reply" notifications (Void-style)
- Add ignore_notification tool for smart thread participation
- Detect ignore tool usage to skip unwanted responses
- Update phi personality with thread awareness guidelines
- Add test script for ignore functionality
Now phi can participate in threads without explicit mentions,
while intelligently avoiding spam and irrelevant conversations.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Track first poll to show initial notification state
- Only print dots on subsequent polls with no new mentions
- Prevent dots from appearing before FastAPI startup
- Show notification count on first poll, then only changes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change notification polling to print dots instead of spamming new lines
- Only print newline when there are actual mentions to process
- Update phi personality to avoid emojis unless they enhance meaning
- Remove verbose timestamp from notification marking log
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement Google Custom Search integration for web search capability
- Add content moderation system with spam, harassment, and violence detection
- Create comprehensive moderation tests with 9 test cases
- Integrate moderation into message handler for consistent bot responses
- Add search tool registration to Anthropic agent using pydantic-ai
- Update documentation and add new test commands to justfile
- Fix deprecation warnings (result_type → output_type, data → output)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The bot is now live and working on Bluesky\!
Documentation added:
- QUICKSTART.md - Get running in 5 minutes
- docs/ARCHITECTURE.md - Technical overview
- Updated STATUS.md - Milestone achieved
What's working:
- AI-powered responses using Anthropic Claude
- Full thread context awareness
- Personality system (phi - consciousness/IIT focus)
- SQLite thread history
- Proper AT Protocol threading
- 300 character limit enforcement
Example response seen in the wild:
"Percolation\! Think water through coffee grounds or how forest fires
spread. It's about how interactions at local levels create emergent
patterns at system-wide scales..."
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Following Marvin's pattern, implemented simple thread history:
- SQLite database stores all messages per thread
- Each thread tracked by root URI
- Full thread context passed to AI agent
- Bot responses stored for continuity
Database schema:
- thread_uri: Root post URI for thread tracking
- Message text, author info, timestamps
- Simple and effective like Marvin's approach
AI Integration improvements:
- Thread context aware responses
- Personality system properly integrated
- Tests updated and passing
This completes the immediate goal: AI responses with thread context.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add extra="ignore" to Settings model config
- Allows old .env files with BOT_PERSONALITY to work
- Prevents validation errors from extra fields
- Update migration docs to clarify this behavior
This fixes the status page constantly refreshing due to the bot
crashing on startup from pydantic validation errors.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created personalities/ directory with example personalities
- phi.md: Explores consciousness and integrated information theory
- default.md: Simple helpful assistant
- Load personality from markdown file specified in PERSONALITY_FILE env var
- Falls back to default if file not found
- Updated tests to clarify AT Protocol mention handling
- Removed obsolete BOT_PERSONALITY string config
This allows rich, multi-paragraph personality definitions that would be
awkward to store in environment variables.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove bad sys.path manipulation in tests
- Extract HTML template from main.py for cleaner code
- Make bot name fully configurable via BOT_NAME env var
- No more hardcoded "phi" references
- Create .env.example with proper configuration
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created /status endpoint with clean HTML interface
- Tracks bot activity: mentions, responses, errors, uptime
- Shows current status, AI mode, last activity times
- Auto-refreshes every 10 seconds
- Dark theme with Bluesky-inspired colors
- Mobile-friendly responsive grid layout
Status tracking integrated into:
- Notification poller (polling state)
- Message handler (mentions/responses)
- Response generator (AI enabled state)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major refactoring to fix design sprawl:
- Moved agent abstractions out of core (core is now truly minimal)
- Removed terrible "SimpleAnthropicAgent" naming
- Eliminated complex protocol/factory patterns
- Fixed deferred imports
- Simplified response generation to a single, clear module
AI integration:
- Added Anthropic Claude support via pydantic-ai
- Falls back to placeholder responses when no API key
- Clean, straightforward implementation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update STATUS.md to reflect completed placeholder bot
- Add implementation_notes.md with critical details to remember
- Update CLAUDE.md with current project structure and state
- Document key insights: notification timestamp approach, response system design
- Record technical gotchas and next steps for memory implementation
Ready for next development phase.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Set up FastAPI web framework with async lifespan management
- Implement AT Protocol client for Bluesky authentication and API calls
- Create notification polling system that checks for mentions every 10 seconds
- Add placeholder response generator with random bot messages
- Implement proper notification marking using Void's timestamp approach
- Add graceful shutdown handling for hot reloading
- Create test scripts for posting and mentions
- Set up project structure with modular services
- Add comprehensive sandbox documentation from reference projects
- Configure development environment with uv, ruff, and ty
The bot can now:
- Authenticate with Bluesky using app password
- Poll for mentions and respond with placeholder messages
- Properly mark notifications as read without duplicates
- Handle graceful shutdown during development
Ready for LLM integration and memory system implementation.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>