🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

chitin-chronicle

by @adroidian

Coordinates multi-agent content publishing by preventing duplicates, tracking timeline, managing claims, and recording immutable publication history with git...

Versionv1.0.0
Downloads891
TERMINAL
clawhub install chitin-chronicle

πŸ“– About This Skill

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

    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

    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

    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 [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

  • [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

    πŸ’‘ Examples

    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

  • πŸ“‹ Tips & Best Practices

    "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