chitin-editorial-multi-agent-content-management

star 8

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

modbender By modbender schedule Updated 3/6/2026

name: Chitin Editorial — Multi-Agent Content Management description: "Chitin Editorial is a git-backed coordination system for two AI agents publishing content across multiple channels. It solves:"

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 /home/aaron/.openclaw/workspace/skills/chitin-chronicle/editorial/boot-check.sh

This shows editorial state every time you wake up.

2. Before Publishing Anything


# 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


# 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


# 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


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:


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:


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:


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:


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:


{

  "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:


{

  "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:


{

  "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:


{

  "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


# 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:


node scripts/editorial.js claim "day-14" "publish" "substack"

Ember (later, checks status):


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


# 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 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):


## 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:


# 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


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

  • Content Registry

  • Publication Ledger

  • Timeline Tracker

  • Cross-Agent Claim System

  • Boot Hook Integration

  • 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

Install via CLI
npx skills add https://github.com/modbender/skill-library-mcp --skill chitin-editorial-multi-agent-content-management
Repository Details
star Stars 8
call_split Forks 2
navigation Branch main
article Path SKILL.md
More from Creator