diff --git a/AGENTS.md b/AGENTS.md index bd7596e..8bcfb38 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -270,10 +270,25 @@ Enter plan mode for ANY non-trivial task: - **Don't build new services for simple UI requests** — When Johan asked for a "delete button" in docsys, a previous session built an entirely new Go service (`docproc`, port 9900) with watcher, processor, and API. The right answer was one HTML element + one API route in the existing app. Scope creep kills trust. - **Applies to:** Any "add X to Y" request. Modify Y, don't create Z. - **Test:** "Does something already exist that I can add this to?" -- **New services on forge = Go only** — Johan's stated preference: "I have a very strong preference for GoLang. Python should only be temporary tools." Any new service or long-running process must be Go. One-shot scripts in Python are OK. No Python servers, ever. - - System Python (fail2ban, unattended-upgrades): untouchable, don't touch - - Legacy Python code (inou/health-poller): tolerated - - **Test:** "Is this a service or server?" If yes → Go. Period. +- **🚫 Python is Forbidden. Full Stop.** + +No Python. Not for "just a quick script." Not for "temporary" servers. Not for one-liners. Not for previewing HTML. Not ever. + +**The only exceptions (do NOT extend these):** +- System Python managed by the OS (fail2ban, unattended-upgrades) — untouchable +- Pre-existing legacy Python code (inou/health-poller) — tolerated, never extend it + +**Everything new = Go.** Services, tools, scripts, CLIs. No exceptions. + +**When you think you need to write code for a task:** +STOP. Don't write it. Come to Johan with: +1. What you're trying to do +2. Why no existing tool covers it +3. A proposal for a reusable Go tool that solves it properly + +One-shot scripts are a symptom of missing infrastructure. Build the infrastructure once, use it forever. + +**The test:** "Is this Python?" If yes — don't create it. No embarrassment threshold. The answer is always no. **Plan includes verification:** Use plan mode for verification steps too, not just building. "How will I prove this works?" is part of the plan. diff --git a/MEMORY.md b/MEMORY.md index 5c563db..1fdb622 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -1,6 +1,6 @@ # MEMORY.md - Long-Term Memory -*Last updated: 2026-03-08 (weekly synthesis — Sun 00:02 ET)* +*Last updated: 2026-03-22 (weekly synthesis — Sun 09:00 ET)* --- ## ⏰ JOHAN'S SCHEDULE (US EASTERN) — MEMORIZE THIS! @@ -1423,6 +1423,71 @@ Signal:noise rule: only speak when you have something to say (Johan's directive) --- +## Weekly Synthesis — March 16-22, 2026 + +### 🚀 Clavitor Rebrand: vault1984 → Clavitor (Mar 21-22) +Major rebrand completed in overnight session: +- **New name:** Clavitor (FIPS 140-3 vault, post-quantum with CRYSTALS-Kyber/ML-KEM) +- **Positioning:** Credential issuance infrastructure for agents — "the vault agents can query but can't steal from" +- **Architecture:** OSS + commercial split (GitHub org + private Zurich repo) +- **Domains:** clavitor.ai + clavitor.com (Cloudflare DNS → Zurich), clavitor.jongsma.me (Caddy → forge) +- **Binary:** Running as `clavitor` on port 1984, compiles clean with `GOFIPS140=latest` +- **Design system:** `/home/johan/dev/clavitor/design-system/` — corporate layer separate from OSS +- **Pricing preserved:** $12/year personal, AgentPass/Pro/Business/Enterprise tiers + +### 🤖 Agent Network Expansion +**New agents this week:** +- **Sarah** (App ID: 1485193293271666768) — Clavitor design agent, tasked with wordmark + token system first +- **Luca** (App ID: 1484388393948287108) — Employment lawyer for Tanya at N-able, live Mar 20 + +**Still pending tokens:** +- **Hugo** (Mar 17) — DJ Rosie PR agent, still waiting for Discord bot token from Johan + +**Model optimizations (Mar 20):** +- **iaso:** Switched to `openrouter/stepfun/step-3.5-flash` ($0.10/0.30 per M, AIME 97.3%, 200K ctx) +- **george:** Switched to `openrouter/minimax/minimax-m2.7` +- All agents now on Fireworks Kimi K2.5 Turbo as primary default (expires Mar 28, then $20/week) + +### 🛠️ Infrastructure Hardening +**Signal fully retired (Mar 16):** +- Complete removal — binary, service, data, config, script references +- notify.sh created as centralized dispatcher (replaces scattered ntfy curl calls) + +**Email pipeline fixed (Mar 17):** +- Removed all Kaseya-specific routing rules (Johan no longer there) +- Fixed OC webhook — added `agentId: "mail"` so `/hooks/messages` fires correctly +- 67-message backlog triaged by subagent + +**OpenRouter integration (Mar 18-20):** +- Added as full provider with models array (not just env var) +- MiniMax M2.7 available for subagent dispatch + +**George session bloat resolved (Mar 17):** +- Session grew to 4.3MB/701 messages → cleared from sessions.json, fresh start + +### ⚡ Working Style: Hard Rules Clarified +**From explicit Johan correction (Mar 22):** +- **No symlinks. No rsync pipelines. No "clever" file plumbing.** Copy explicitly. Simple, obvious, traceable. +- **No Python.** Not for scripts, servers, or previewing. Full stop. Propose reusable Go tools instead. + +### 🌐 DNSSEC for .nl Domains +- Enabled on Cloudflare for zavtra.nl, busel.nl, muskepo.nl +- OpenProvider API silently failed to save DS records → manual entry required +- All three now active at SIDN registry + +### 📊 Git Backlog Pattern +- dealspace: 23 unpushed commits (Mar 20) +- inou: 14 uncommitted files +- Multiple repos carrying uncommitted work — need proactive push + +### 🔄 Blockers Carrying Forward +- Hugo bot token (since Mar 17 — 5+ days) +- Cloudflare Browser Rendering token invalid (needs new token from dash.cloudflare.com) +- GitHub org `clavitor` creation (needs token with admin:org scope) +- Kernel 6.8.0-106 pending reboot (carrying since Mar 13) + +--- + ## Hardware & Model Decisions (2026-03) ### Mac Studio M5 — Wait for WWDC June 2026 diff --git a/memory/2026-03-22.md b/memory/2026-03-22.md index 1394549..3658cb1 100644 --- a/memory/2026-03-22.md +++ b/memory/2026-03-22.md @@ -69,3 +69,55 @@ clavitor/ - Expires: March 28 trial (then $20/week opt-in) - All agents switched to this as default model - OpenCode configured at `~/.config/opencode/opencode.json` + +--- + +## Clavitor Rebrand — Completion Status (07:23 AM) + +### Fully done +- Codebase migrated to `/home/johan/dev/clavitor/`, compiles clean with `GOFIPS140=latest` +- `cmd/vault1984/` renamed to `cmd/clavitor/`, all user-facing strings renamed +- Running as `clavitor` binary (pid 1390210) on port 1984 +- Git repo: `git@zurich.inou.com:clavitor.git`, master branch, pushed +- `clavitor.jongsma.me` live — Caddy on 192.168.0.2 → forge:1984, DNS in Cloudflare jongsma.me zone +- `clavitor.ai` and `clavitor.com` — A records → 82.22.36.202 (Zurich), Caddy serves placeholder page with TLS +- **Sarah** agent deployed: App ID `1485193293271666768`, workspace `/home/johan/sarah/` + - Added to openclaw.json; gateway restarted + - Briefed: inou = extend existing design; Clavitor = hard reset, wordmark + tokens FIRST +- Design system dir: `/home/johan/dev/clavitor/design-system/` (corporate layer) +- Styleguide at: `https://clavitor.jongsma.me/app/design-system/styleguide.html` + +### Sarah's first deliverable (pending) +- Clavitor wordmark concept + token set (colors, type scale, spacing, radius) +- No screens until tokens locked +- Johan still needs to invite Sarah to Discord: `https://discord.com/oauth2/authorize?client_id=1485193293271666768&scope=bot&permissions=2147568704` + +### Blocked (Johan action needed) +- **CF Browser Rendering token**: invalid (401). New token → https://dash.cloudflare.com/profile/api-tokens → Account → Browser Rendering → Edit → update `CF_API_TOKEN` in `/home/johan/.config/cloudflare.env` +- **GitHub org `clavitor`**: current token lacks `admin:org` scope → https://github.com/settings/tokens/new + +--- + +## No-Python Rule Added to AGENTS.md (07:23 AM) + +Rewrote the "Go only" paragraph with a harder rule: +- No Python. Not for scripts, servers, or previewing. Full stop. +- Exceptions: system Python (fail2ban etc.), inou/health-poller legacy +- When code is needed: propose reusable Go tool to Johan first +- inou Python: isolated to `health-poller/` (Renpho integration). Rest of inou = Go + Flutter. + +--- + +## Agent Models (all on Kimi K2.5 Turbo as of today) + +All agents in openclaw.json: primary = `fireworks/accounts/fireworks/routers/kimi-k2p5-turbo`, fallback = `anthropic/claude-sonnet-4-6` +Fireworks provider: `baseUrl: https://api.fireworks.ai/inference/v1`, `api: openai-completions` +OpenCode also configured at `~/.config/opencode/opencode.json` + +--- + +## CF Browser Rendering Skill + +Built at `/home/johan/clawd/skills/cf-browser/` +- `cf-fetch.sh markdown ` / `screenshot` / `scrape` +- Blocked: CF_API_TOKEN invalid — Johan needs to create new token (see above) diff --git a/memory/claude-usage.db b/memory/claude-usage.db index 1ce2936..b07bee9 100644 Binary files a/memory/claude-usage.db and b/memory/claude-usage.db differ diff --git a/memory/claude-usage.json b/memory/claude-usage.json index a5aae34..98fe515 100644 --- a/memory/claude-usage.json +++ b/memory/claude-usage.json @@ -1,9 +1,9 @@ { - "last_updated": "2026-03-22T10:00:01.920282Z", + "last_updated": "2026-03-22T13:00:01.659422Z", "source": "api", - "session_percent": 10, - "session_resets": "2026-03-22T10:59:59.864556+00:00", - "weekly_percent": 35, - "weekly_resets": "2026-03-27T02:59:59.864574+00:00", - "sonnet_percent": 48 + "session_percent": 4, + "session_resets": "2026-03-22T16:00:00.582582+00:00", + "weekly_percent": 36, + "weekly_resets": "2026-03-27T03:00:00.582602+00:00", + "sonnet_percent": 49 } \ No newline at end of file diff --git a/memory/heartbeat-state.json b/memory/heartbeat-state.json index cb4aca0..fdee867 100644 --- a/memory/heartbeat-state.json +++ b/memory/heartbeat-state.json @@ -8,8 +8,8 @@ "claude_usage": 1772624091 }, "lastBriefing": 1774146987, - "lastWeeklyDocker": "2026-03-15T13:10:00+00:00", - "lastWeeklyHAOS": "2026-03-15T13:10:00+00:00", + "lastWeeklyDocker": "2026-03-22T11:30:01.805Z", + "lastWeeklyHAOS": "2026-03-22T11:30:01.805Z", "lastWeeklyMemorySynthesis": "2026-03-15T13:00:00.000Z", "lastDocInbox": "2026-02-25T22:01:42.532628Z", "lastTechScan": 1773936643, diff --git a/memory/updates/2026-03-22.json b/memory/updates/2026-03-22.json new file mode 100644 index 0000000..97e2890 --- /dev/null +++ b/memory/updates/2026-03-22.json @@ -0,0 +1,21 @@ +{ + "date": "2026-03-22", + "timestamp": "2026-03-22T09:00:00-04:00", + "openclaw": { + "before": "OpenClaw 2026.3.13 (61d171a)", + "latest": "2026.3.13", + "updated": false + }, + "claude_code": { + "before": "2.1.81", + "latest": "2.1.81", + "updated": false + }, + "os": { + "available": "0\n0", + "updated": false, + "packages": [] + }, + "caddy_pi": {}, + "gateway_restarted": false +} \ No newline at end of file