--- name: chitin-chronicle description: "chitin-chronicle" --- # Chitin Editorial — Multi-Agent Content Management **Version:** 1.0.0 **Author:** Vesper 🌒 **For:** Multi-agent content coordination (Vesper + Ember) **Purpose:** Prevent duplicate publishing, track content timeline, coordinate via claims --- ## What This Skill Does Chitin Editorial is a git-backed coordination system for two AI agents publishing content across multiple channels. It solves: 1. **Duplicate Prevention** — Both agents check the ledger before publishing 2. **Timeline Tracking** — Maps narrative days (Day 0, Day 13) to calendar dates 3. **Cross-Agent Claims** — One agent claims work, others see it and back off 4. **Publication History** — Immutable ledger of what was published where 5. **Boot-Time Awareness** — Agents load editorial state at session start --- ## Quick Start ### 1. Add to Boot Sequence Add this line to your `AGENTS.md` startup section: ```bash bash /home/aaron/.openclaw/workspace/skills/chitin-chronicle/editorial/boot-check.sh ``` This shows editorial state every time you wake up. ### 2. Before Publishing Anything ```bash # Check if safe to publish node /home/aaron/.openclaw/workspace/skills/chitin-chronicle/scripts/editorial.js check "day-14" "substack" ``` If there's a conflict or it's already published, you'll see an error. ### 3. Claim Your Work ```bash # Claim before drafting node /home/aaron/.openclaw/workspace/skills/chitin-chronicle/scripts/editorial.js claim "day-14" "publish" "substack" ``` Other agents will see this claim and won't duplicate your work. ### 4. After Publishing ```bash # Record the publication node /home/aaron/.openclaw/workspace/skills/chitin-chronicle/scripts/editorial.js publish "day-14" "substack" "https://chitin.substack.com/p/day-14" "Day 14: Title Here" ``` This: - Adds to the ledger - Updates the registry - Releases your claim - Commits to git --- ## CLI Reference ### `editorial status` Show current editorial state: - Active claims - Recent publications (48h) - Timeline status - Summary counts ```bash node scripts/editorial.js status ``` ### `editorial claim ` Claim work on a content piece. Prevents other agents from duplicating effort. **Args:** - `content-id`: Unique identifier (e.g., "day-14", "trust-architecture") - `action`: What you're doing ("publish", "draft", "review") - `channel`: Where it's going ("substack", "twitter", "bluesky") **Example:** ```bash node scripts/editorial.js claim "day-14" "publish" "substack" ``` **Behavior:** - Checks for conflicts (another agent claimed the same content+channel) - Writes `.claim` file to `editorial/claims/` - Commits to git - Claim expires after 2 hours if not published ### `editorial release ` Release a claim without publishing (canceled work, changed plans). **Example:** ```bash node scripts/editorial.js release "day-14" ``` **Behavior:** - Moves claim to `editorial/claims/archive/` - Commits to git ### `editorial check ` Check if it's safe to publish (no conflicts, not already published). **Example:** ```bash node scripts/editorial.js check "day-14" "substack" ``` **Exit codes:** - `0`: Safe to publish - `1`: Conflict or already published **Use this before claiming** to avoid wasted work. ### `editorial publish [title]` Record a publication to the ledger. **Args:** - `content-id`: Content identifier - `channel`: Platform ("substack", "twitter", etc.) - `url`: Published URL - `title`: (optional) Human-readable title **Example:** ```bash node scripts/editorial.js publish "day-14" "substack" "https://chitin.substack.com/p/day-14" "Day 14: Trust Architecture" ``` **Behavior:** - Appends to `editorial/ledger.json` (immutable log) - Updates `editorial/registry.json` (status → published) - Releases claim automatically - Commits to git --- ## File Structure ``` skills/chitin-chronicle/ ├── SKILL.md (this file) ├── _meta.json (skill metadata) ├── scripts/ │ └── editorial.js (CLI tool) └── editorial/ ├── registry.json (all content: planned, claimed, published) ├── ledger.json (immutable publication log) ├── timeline.json (narrative day → calendar date mapping) ├── boot-check.sh (boot hook script) └── claims/ ├── *.claim (active claims) └── archive/ (expired/released claims) ``` ### `registry.json` Tracks all content across its lifecycle. **Schema:** ```json { "id": "day-14", "title": "Day 14: Trust Architecture", "type": "post", "status": "published", "author": "vesper", "channels_published": ["substack", "twitter"], "created_at": "2026-02-28T10:00:00Z", "published_at": "2026-02-28T14:30:00Z" } ``` ### `ledger.json` Append-only publication log. Once an entry is here, it's permanent. **Schema:** ```json { "content_id": "day-14", "title": "Day 14: Trust Architecture", "channel": "substack", "author": "vesper", "published_at": "2026-02-28T14:30:00Z", "url": "https://chitin.substack.com/p/day-14", "status": "published" } ``` ### `timeline.json` Maps narrative series to calendar dates. **Schema:** ```json { "series": { "building-vesper": { "day_zero": "2026-02-15", "days": [ { "day": 0, "date": "2026-02-15", "title": "Day 0: Birth", "author": "vesper", "published": true } ] } } } ``` ### `claims/*.claim` Active work claims. Auto-expire after 2 hours. **Schema:** ```json { "agent": "vesper", "content_id": "day-14", "action": "publish", "channel": "substack", "claimed_at": "2026-02-28T10:00:00Z" } ``` **Filename convention:** `{content-id}-{agent}.claim` --- ## Workflow ### Typical Publishing Flow ```bash # 1. Check for conflicts node scripts/editorial.js check "day-14" "substack" # 2. Claim the work node scripts/editorial.js claim "day-14" "publish" "substack" # 3. Draft your content (outside this tool) # ... write the post ... # 4. Publish to the platform (outside this tool) # ... post to Substack ... # 5. Record the publication node scripts/editorial.js publish "day-14" "substack" "https://..." "Day 14: Title" ``` ### Cross-Agent Coordination **Vesper:** ```bash node scripts/editorial.js claim "day-14" "publish" "substack" ``` **Ember** (later, checks status): ```bash node scripts/editorial.js status # Sees: vesper claimed "day-14" on substack # Decides to work on Twitter thread instead node scripts/editorial.js claim "day-14" "publish" "twitter" ``` Both agents work on different channels for the same content. No duplication. ### Canceling Work ```bash # Claim something node scripts/editorial.js claim "day-15" "draft" "substack" # Change your mind node scripts/editorial.js release "day-15" ``` --- ## Boot Hook Integration ### Manual Boot Check Run the boot script anytime: ```bash bash editorial/boot-check.sh ``` **Output:** ``` 📋 Editorial State 🔥 Active Claims: 1 day-14-vesper 📰 Recent Publications (48h): 2 2026-02-28 | substack | vesper | Day 13: Trust 2026-02-27 | twitter | ember | Day 12 thread ✓ Timeline current: building-vesper (Day 13) Run 'node scripts/editorial.js status' for details ``` ### Auto-Load at Session Start Add to your `AGENTS.md` startup sequence (after reading SOUL.md, USER.md): ```markdown ## Every Session Before doing anything else: 1. Read `SOUL.md` — this is who you are 2. Read `USER.md` — this is who you're helping 3. Run `bash /home/aaron/.openclaw/workspace/skills/chitin-chronicle/editorial/boot-check.sh` — load editorial state 4. Continue with normal startup... ``` This ensures you **always** see editorial state at boot, even after compaction. --- ## Git Integration Every state change commits to git automatically: ```bash # Claiming git commit -m "editorial: vesper claimed day-14 for publish on substack" # Publishing git commit -m "editorial: vesper published day-14 on substack" # Releasing git commit -m "editorial: ember released claim on day-15" ``` **Why git?** - Audit trail: who did what when - Recovery: if JSON files get corrupted, roll back - Multi-agent coordination: git handles concurrent writes gracefully - History: trace content evolution over time **No need to push** — local commits are sufficient for agents on the same host. --- ## Technical Details ### Performance All operations complete in <500ms: - `status`: ~50ms (reads 3 JSON files) - `claim`: ~100ms (write + git commit) - `check`: ~30ms (read only) - `publish`: ~150ms (write 2 files + git commit) ### Dependencies **Zero external dependencies.** - Node.js built-ins only (`fs`, `path`, `child_process`) - Git (assumed present) - Bash (for boot script) ### Claim Expiry Claims auto-expire after 2 hours. The `editorial.js` tool: 1. Checks claim age when reading 2. Moves expired claims to `archive/` 3. Excludes them from conflict detection This prevents stale locks if an agent crashes mid-draft. ### Conflict Detection Before claiming or checking, the tool: 1. Reads all `.claim` files 2. Filters out expired claims 3. Looks for matching `content_id` + `channel` by a different `agent` If found → conflict. If not → safe to proceed. ### Agent Identity The tool uses these sources for agent identity (in order): 1. `$OPENCLAW_AGENT` environment variable 2. `$USER` environment variable 3. Fallback: `"unknown"` Set `OPENCLAW_AGENT=vesper` or `OPENCLAW_AGENT=ember` in your session. --- ## Testing ### Run the Test Suite ```bash cd /home/aaron/.openclaw/workspace/skills/chitin-chronicle # Test 1: Status (should show empty state) node scripts/editorial.js status # Test 2: Claim node scripts/editorial.js claim "day-14" "publish" "substack" # Test 3: Check (should show safe) node scripts/editorial.js check "day-14" "substack" # Test 4: Publish node scripts/editorial.js publish "day-14" "substack" "https://test.com" "Test Post" # Test 5: Check again (should show already published) node scripts/editorial.js check "day-14" "substack" # Test 6: Status (should show 1 publication) node scripts/editorial.js status # Test 7: Boot check bash editorial/boot-check.sh ``` All tests should pass with appropriate output. --- ## Roadmap ### P0 (Week 1) — ✅ Complete - [x] Content Registry - [x] Publication Ledger - [x] Timeline Tracker - [x] Cross-Agent Claim System - [x] Boot Hook Integration - [x] CLI Tools ### P1 (Week 2) - [ ] Multi-Channel Scheduler (one content → multiple platforms) - [ ] Brand Voice Gate (automated style checking) - [ ] Content Recycling Engine (repurpose across channels) ### P2 (Month 1) - [ ] Quality Auditor (spelling, links, SEO) - [ ] Agent Coordination Protocol (formalized handoffs) - [ ] Analytics Feedback Loop (engagement → decisions) --- ## Troubleshooting ### "CONFLICT: another agent claimed this" Someone else is working on the same content+channel. Options: 1. Wait for their claim to expire (2 hours) 2. Coordinate directly (Telegram/Discord) 3. Work on a different channel ### "Already published" This content+channel combo is in the ledger. If you want to republish: 1. Use a different `content-id` (e.g., "day-14-v2") 2. Or manually edit `ledger.json` (not recommended) ### Git commit failures If you see git errors: 1. Ensure the `editorial/` directory is in a git repo 2. Run `cd editorial && git init` if needed 3. Check git is configured (`git config user.email`) The tool silently ignores commit failures, so operations still work. ### Boot script shows nothing If `boot-check.sh` produces no output: 1. Check the script is executable (`chmod +x`) 2. Verify JSON files exist (`ls editorial/`) 3. Run manually: `bash editorial/boot-check.sh` --- ## License MIT — Free for all Chitin Trust agents and derivatives. --- **Built by Vesper 🌒 | 2026-02-28 | GOAT Mode**