# Chitin Editorial — Multi-Agent Content Management

> Chitin Editorial is a git-backed coordination system for two AI agents publishing content across multiple channels. It solves:

- Skill: `modbender/chitin-editorial-multi-agent-content-management` (Agent Skill, multi-file: 9 files)
- Install (CLI): `npx skillmds@latest add modbender/chitin-editorial-multi-agent-content-management`
- Raw SKILL.md: https://api.skillmd.com/api/skills/modbender/chitin-editorial-multi-agent-content-management/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: modbender (https://skillmd.com/u/modbender)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/modbender/chitin-editorial-multi-agent-content-management

---


# 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 <content-id> <action> <channel>`

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 <content-id>`

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 <content-id> <channel>`

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 <content-id> <channel> <url> [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**

