Skip to content

Releases: ChesterRa/cccc

v0.3.8

23 Oct 16:00

Choose a tag to compare

0.3.8 Release Notes

Summary
This release makes self‑checks predictable per peer, unifies all NUDGE messages into a single consistent format, and hardens Foreman routing, user visibility, and inbox numbering. It also removes the temporary ASCII‑only rule for PeerA.

Highlights

  • Per‑peer self‑checks (cadence and strong refresh)
    • Self‑check counting is now independent for PeerA and PeerB. Each peer triggers a self‑check after N effective messages (default N=6).
    • “Strong refresh” (full SYSTEM + PROJECT.md) occurs on every K‑th self‑check per peer (configurable via delivery.system_refresh_every_self_checks).
    • Internal handoffs, Foreman messages, and external (IM) inbox arrivals are all counted uniformly (excluding nudges and low‑signal shorts).
    • External bursts are counted per new file; at most one self‑check per peer per loop prevents spam.
  • Foreman stability and user visibility
    • To: Both is preserved in inbox content and mirrored to the user as a single message [FOREMAN→PeerA,PeerB] (no duplicates).
    • Foreman deliveries use the same per‑peer inbox counter/lock as other handoffs; no more duplicate filenames with the same numeric prefix.
    • Foreman can be toggled on/off during a run when configured at startup; /foreman now runs once immediately and shifts the next cycle by one interval.
  • Unified NUDGE composer (single, consistent format)
    • New message (detailed): [NUDGE] [TS: …] New message received — trigger=000123 preview='…' — Inbox: … — open oldest first, process oldest→newest. Move processed files to processed/.
    • Backlog present (periodic/keepalive): [NUDGE] [TS: …] Unprocessed message remains — Inbox: … — open oldest first, process oldest→newest. Move processed files to processed/.
    • No backlog (keepalive): [NUDGE] [TS: …] Inbox: … — continue your work; open oldest→newest.
    • All callers now use the unified composer; TS and Inbox path are always present; suffix hints (e.g., Aux tips) append at the end.
  • Roles wizard flexibility
    • Agent CLI choices are no longer de‑duplicated. PeerA/PeerB/Aux/Foreman may use the same CLI if desired.
  • Cleanup
    • Removed the temporary PeerA ASCII‑only rule from generated system rules.

User‑visible changes

  • More timely self‑checks for the peer that is actually receiving work; the other peer’s cadence is unaffected.
  • Foreman To: Both appears once to the user, but both peers receive identical inbox files (with To: Both).
  • NUDGE wording is clearer and consistent; new arrivals include an explicit “New message received”.

Configuration defaults

  • delivery.self_check_every_handoffs: 6.
  • delivery.system_refresh_every_self_checks unchanged unless you changed it previously.

v0.3.7

22 Oct 09:35

Choose a tag to compare

This release stabilizes the Foreman (User Proxy) workflow, simplifies how it routes messages to peers, and removes a class of “runs immediately after startup” surprises. It also adds an explicit one‑shot trigger so you can kick Foreman on demand without skewing the cadence.

Highlights

  • Predictable first run: Foreman no longer runs shortly after startup. The first run is scheduled at exactly interval_seconds after the orchestrator starts (default 900s). No hidden 120s special case.
  • One‑shot run: /foreman now starts a Foreman run immediately and automatically shifts the next cycle to now + interval_seconds to avoid back‑to‑back runs.
  • Simpler routing header: Foreman messages now use a single header To: Both|PeerA|PeerB (default Both). The previous Owner:/CC: header pair is removed.
  • Rich, immediate status: /foreman status responds instantly on Telegram/Slack/Discord with allowed/enabled, agent, running, next_in, last_start/hb/end, last_rc, and out_dir.
  • Safer runtime toggling: Foreman can be toggled on/off during a run if it was enabled at startup. The persisted allowed flag prevents accidental toggling when Foreman wasn’t configured.

User‑visible changes

  • Foreman message format
    • Before: two headers (Owner: PeerA|PeerB and CC: PeerB|PeerA|none).
    • Now: a single header To: Both|PeerA|PeerB (default Both).
    • Body still uses <TO_PEER> … </TO_PEER>.
  • Commands
    • /foreman on|off|status unchanged in spirit; responses are more informative.
    • New /foreman now to run once immediately while keeping the cadence aligned.

Quality and reliability

  • Startup initialization sets next_due_ts = now + interval_seconds (and clears any stale lock), ensuring Foreman never runs immediately unless you explicitly call /foreman now.
  • Dispatcher writes a single sentinel Foreman→Both|PeerA|PeerB after a successful hand‑off, preventing duplicate sends while keeping the file visible for agents.

v0.3.6

21 Oct 09:40

Choose a tag to compare

Release notes

Highlights

  • Foreman (User Proxy) v1
    • A lightweight, timed helper that either performs one non‑interactive task or writes a short user‑voice request to the right peer.
    • Two‑part prompt: system rules under .cccc/rules/FOREMAN.md (auto‑generated), and a user‑maintained task brief at ./FOREMAN_TASK.md (free‑form; created once).
    • Non‑overlapping scheduler with a small first‑run delay (then every 15 minutes by default).
    • Clear visibility: panel shows Foreman RUNNING/last rc/next; IM bridges render Foreman messages as [FOREMAN→PeerA] or [FOREMAN→PeerB]. Long outputs are saved under .cccc/work/foreman//.
    • Unified controls: /verbose on|off toggles peer summaries and Foreman CC; /foreman on|off|status (allowed only if Foreman was enabled at startup).
  • Cleaner bridge UX
    • Telegram/Slack/Discord: unified /verbose replaces /showpeers.
    • Consistent Foreman IM prefix: [FOREMAN→PeerX] for all bridges; reuses existing throttling and safe length clamping.
  • Robust mailbox flow
    • Foreman writes a single message to .cccc/mailbox/foreman/to_peer.md (Owner/CC + <TO_PEER> body). The orchestrator dispatches to the correct peer inbox(es) and then rewrites the file to a one‑line SENTINEL to prevent re‑sends.
    • Tolerant parsing: missing <TO_PEER> is auto‑wrapped; missing Owner defaults to PeerA.
  • Stability fixes
    • Prompt quoting for one‑shot CLI calls now safely escapes characters that caused shell EOF errors in some environments.
    • README refreshed with a concise Foreman overview, controls, and quick guidance.

Quality of life

  • Roles wizard now includes Foreman: choose reuse_aux or a dedicated agent (e.g., opencode), or pick none to disable.
  • FOREMAN_TASK.md template is intentionally simple and user‑friendly: write what matters; no boilerplate fields.

Upgrade notes

  • No breaking changes to the peer workflow. Foreman is opt‑in and disabled by default.
  • To enable: choose a Foreman agent at startup (or set .cccc/settings/foreman.yaml), and edit ./FOREMAN_TASK.md to describe what you want Foreman to do.
  • If you previously used /showpeers, switch to /verbose.

Known behavior

  • If your chosen Foreman agent keeps running instead of exiting, you may see “Timeout” in .cccc/work/foreman//stderr.txt (max_run_seconds defaults to 1800). Prefer an agent that exits promptly for non‑interactive runs, or lower the timeout to
    suit your environment.

Thanks for testing and feedback that shaped Foreman v1.

v0.3.5

17 Oct 10:52

Choose a tag to compare

Highlights

  • Mailbox Sentinel: After a message is queued, the orchestrator replaces the mailbox file with a one‑line status sentinel (ts/eid/sha/route). The scanner ignores this sentinel, preventing duplicate sends while giving agents clear “sent” feedback.
  • New Agent: OpenCode. You can bind OpenCode to PeerA/PeerB/Aux via the roles wizard. Aux one‑shot uses: opencode run "{prompt}". No environment variables required.

Details

  • Mailbox
    • Replace “clear file” with a single‑line sentinel: .
    • Scanner treats a pure sentinel file as empty (no event, no seen_hash updates).
    • Works for PeerA→User, PeerA→PeerB, PeerB→User, PeerB→PeerA.
  • Agents
    • Added opencode in .cccc/settings/agents.yaml:
      • peer.command: opencode
      • aux.invoke_command: opencode run "{prompt}"
      • I/O profile mirrors droid (paste + Enter).
    • README updated: OpenCode listed among supported CLIs and PATH examples.
  • Rules
    • Writing rules now note that the message file becomes a one‑line status after sending. Agents simply overwrite it for the next message.

Upgrade Notes

  • No migrations required. On next start, the roles wizard will offer OpenCode alongside existing actors. If you select OpenCode as Aux, nudges will show the exact one‑shot template.
  • The sentinel line is safe to overwrite; it exists only to signal “sent” and to stop duplicate sends.

v0.3.4

08 Oct 13:37

Choose a tag to compare

CCCC Pair 0.3.4 — Release Notes (October 8, 2025)

Highlights

  • Aux at your fingertips: every NUDGE now includes the exact Aux invoke template when Aux is ON, so peers can offload instantly without hunting for syntax.
  • Faster re‑anchoring: each self‑check now ends with a direct link to the peer’s rules file.
  • Correct Aux state on start: rules are rebuilt after the roles wizard, eliminating stale “Aux disabled” banners.
  • New actor: droid is supported for Peer and Aux roles (prompt_regex left empty by design).

What’s New

  • Droid actor
    • Peer command: droid --auto high
    • Aux one‑shot template: droid exec --auto high "{prompt}"
    • Available in the startup roles wizard for PeerA/PeerB/Aux.
  • NUDGE improvements (agent‑facing)
    • When Aux is ON, NUDGE always appends:
      Aux is ON — delegate decoupled sub‑tasks; invoke: ; capture evidence and summarize outcome.
    • The template keeps {prompt} literal, ready to paste.
  • Self‑check improvements (agent‑facing)
    • Adds a stable rules path line at the end of every self‑check:
      • PeerA: Rules: .cccc/rules/PEERA.md
      • PeerB: Rules: .cccc/rules/PEERB.md

Fixes

  • Rules refresh order: rules are regenerated after you confirm roles in the wizard, ensuring the current Aux binding is reflected immediately (no stale “Aux disabled” text).
  • Aux template resolution in NUDGE is robust even if configs are reloaded.

Behavior Notes (unchanged but important)

  • Aux is ON when an Aux actor is bound at startup; there are no runtime on/off toggles.
  • PEERC (Aux) rules intentionally do not include the invoke template; PeerA/PeerB rules do.

v0.3.3

08 Oct 03:08

Choose a tag to compare

CCCC Pair 0.3.3 — Release Notes (October 8, 2025)

Highlights

  • Flexible actor binding at startup: pick which CLI powers PeerA, PeerB, and (optionally) Aux; choices persist and can be reconfigured next run.
  • Cleaner Aux experience: no runtime on/off toggles; invoke Aux only when needed via a one‑liner.
  • Stronger POR hygiene: the periodic reminder now guides PeerB to review both POR and all active SUBPORs, align “Now/Next,” and close gaps.
  • English‑only docs and parsing: clearer, consistent user experience across prompts and logs.
  • Stabilized release track: package marked Production/Stable.

What’s New / Improved

  • Roles wizard (startup)
    • Choose actors for PeerA/PeerB (required) and Aux (optional). Your selection is saved in .cccc/settings/cli_profiles.yaml and reused on the next start.
    • Inspect effective bindings anytime with: cccc roles
  • One‑shot Aux usage
    • In tmux: /c (or c: ) runs the bound Aux once.
    • In chat bridges: /aux-cli "" runs the bound Aux once.
    • /review sends a focused “helper review” reminder bundle to both peers.
  • POR + SUBPOR reminder (self‑check cadence)
    • PeerB’s “POR update requested …” now also asks to:
      • Review all active SUBPORs (Goal/Scope, 3–5 Acceptance, Cheapest Probe, Kill, single Next).
      • Align POR Now/Next with SUBPOR Next; close/rescope stale items.
      • Ensure evidence/risks/decisions have recent refs (commit/test/log).
      • Check for gaps (missing tasks/unowned work/new risks) and propose a new SUBPOR (after peer ACK) when needed.
      • Sanity‑check portfolio coherence (priorities, sequencing, ownership).
  • Rules clarity
    • PEERC (Aux) rules no longer display the “Invoke (template)” line; that information remains in PeerA/PeerB rules where it belongs.
  • Documentation
    • README updated to reflect the roles wizard, one‑shot Aux usage, and the self‑check reminder flow.
    • Examples/agents YAML is no longer tracked; examples live in docs only.

Fixes

  • Removed hard fallbacks to specific CLIs (e.g., always using gemini for Aux, or implicit claude/codex defaults) to avoid surprising behavior. If an actor isn’t configured, you’ll get a clear message instead of a silent fallback.

Breaking / Removed

  • Runtime Aux toggles removed
    • The /aux on|off|status commands are no longer supported (tmux and all bridges). Aux is ON iff you bind an Aux actor at startup; otherwise OFF.
  • English‑only event parsing
    • Event keys in to_peer messages (Progress, Evidence, Ask, Counter, Risk, Next) must be in English. Non‑English aliases are no longer parsed.

Upgrade Notes

  • After updating, run cccc run and complete the roles wizard to bind PeerA/PeerB (and Aux if desired).
  • Replace any /aux on|off|status usage in scripts or docs with one‑shot commands:
    • tmux: /c (or c: )
    • bridges: /aux-cli ""
  • Ensure event lines in messages use English keys (Progress/Evidence/Ask/Counter/Risk/Next).
  • If you had local example agent YAML tracked in examples/agents/, it’s now ignored by default; keep examples in project docs instead.

Quick Command Reference

  • cccc init — bootstrap .cccc into your repo
  • cccc run — start the orchestrator (tmux UI)
  • cccc roles — show current bindings and CLI availability
  • tmux: /c — one‑shot Aux; /review — helper review; /focus — ask PeerB to refresh POR; /reset compact|clear — context maintenance
  • bridges: /aux-cli "", /review, /focus, /reset

v0.3.2

26 Sep 05:23

Choose a tag to compare

Overview
This release focuses on reliability and clarity of runtime behavior: first‑run alignment, resilient keepalive that doesn’t mislead, much quieter ledgers, and exactly‑once outbound delivery. It also standardizes outbound logging across bridges and
removes legacy, unused paths.

Highlights

  • Full SYSTEM on first contact
    • The first “lazy preamble” now injects the full rules document (PEERA/PEERB) instead of a minimal banner, ensuring peers align on the complete protocol from the start.
  • Neutral keepalive NUDGE
    • Keepalive NUDGE no longer carries an outdated trigger/preview. It uses a neutral, stable line (“continue your work; open inbox oldest→newest.”). New‑message‑triggered NUDGEs still include trigger=seq + a 32‑char preview for traceability.
  • Human‑friendly timestamps
    • All system‑generated inbox files include “[TS: …]” right after “[MID: …]”, rendered in local system time with timezone abbreviation and explicit UTC offset.
  • Periodic full SYSTEM refresh
    • Every K self‑checks (default K=3, delivery.system_refresh_every_self_checks), the full rules text (PEERA/PEERB) is appended at the end of the self‑check message for reinforcement.

Reliability & Fixes

  • Outbox “first event” loss fixed
    • The Outbox consumer now treats a freshly created outbox file as “from start” (mtime heuristic), eliminating the long‑standing issue where the very first to_user event could be skipped.
  • Exactly‑once delivery cursor
    • The consumer persists a file cursor (dev, ino, offset) and only dispatches new lines past the committed offset, avoiding replays across restarts.
  • NUDGE robustness preserved
    • New inbox writes still trigger a detailed NUDGE immediately; periodic NUDGE and keepalive pathways were not weakened.

Logging & Observability

  • Quiet by default, readable when it matters
    • Ledger
      • Keep: key facts only (to_user, handoff, to_peer-forward, bridge-outbound, bridge-outbox-error/blocked, self-check, keepalive-scheduled/sent, ack-file).
      • Remove by default: internal outbox consumer noise (cursor-load/save, rotated, heartbeat, dispatch-attempt/ok/skip). These are now behind a debug switch.
    • Unified outbound schema
      • bridge-outbound / bridge-outbox-error / bridge-outbox-blocked now use a consistent schema: {to: platform, route: to_user|to_peer, from: PeerA|PeerB, [to: PeerB|PeerA], chars, chats|reason|error}.
    • Optional debug switches (code-level)
      • DEBUG_OUTBOX, OUTBOX_DEBUG, KEEPALIVE_DEBUG can be toggled during deep investigations without changing default behavior.

Protocol & Prompting

  • Rules refresh at startup remains, now guaranteed full rules on first preamble.
  • PeerB’s IO boundary is explicit in rules (do not address USER directly).
  • Insight trailing-block teaching intercept remains; “revise soft reminder” stays removed.

Housekeeping

  • Removed deprecated “delivery_mode: bridge (CLI injection)” code path; tmux injection is the single supported runtime path.
  • Reduced status panel references to legacy mechanisms; panel keeps concise, high‑signal counters.

Configuration Notes

  • New/updated keys (defaults provided in .cccc/settings/cli_profiles.yaml):
    • delivery.system_refresh_every_self_checks: 3
    • delivery.main_loop_tick_seconds: 2.0 (unchanged but reaffirmed)
    • keepalive_enabled: true, keepalive_delay_seconds: 60
  • No breaking configuration changes; existing setups continue to work.

Upgrade Guide

  • Pull and run as usual; no migrations required.
  • If you previously relied on legacy bridge CLI injection, switch to the tmux‑based orchestrator (default). IM bridges (Telegram/Slack/Discord) remain supported.

Known Issues

  • If a peer writes mangled/non‑text content into mailbox files, Unicode reconstruction can fail. We provide strong guidance for UTF‑8 and robust decoding for legitimate encodings; upstream writer bugs must be fixed at source.

v0.3.1

23 Sep 15:40

Choose a tag to compare

Release notes — 0.3.1 (stable)

Summary

  • Stability and UX release focused on uninterrupted execution, lower churn, and clearer runtime metadata. Adds a lightweight “progress keepalive,” reduces disk writes, slows the main loop for unattended runs, and regenerates rules at startup with
    local-time stamps.

Highlights

  • Progress keepalive (lightweight): when a peer sends to_peer with insight.kind=progress and the other peer stays silent, the orchestrator schedules a delayed FROM_SYSTEM keepalive to the sender to keep the CLI alive and continue execution.
    • Delay: 60s (configurable).
    • Safety: keepalive is suppressed if the sender’s inbox has pending messages, or if inflight/queued handoffs exist.
  • NUDGE resiliency with low churn:
    • Fix: NUDGE no longer stalls when inbox backlog grows after hitting the resend cap; backlog growth resets the window to permit one more nudge.
    • I/O reduction: skip-paths (debounce, backoff, not-yet-time) no longer persist dropped_count to disk every tick.
  • Quieter main loop suitable for unattended runs:
    • Main polling tick slowed to 2.0s by default (configurable), cutting CPU wake-ups and background scans by ~75% vs. 0.5s.
  • Fresh rules at startup + clearer timestamps:
    • Rules (PEERA/PEERB/PEERC) are rebuilt once on orchestrator start to reflect current settings (IM/Aux).
    • “Generated on …” now uses local system time with tz abbreviation and UTC offset, e.g., 2025-09-24 00:21:28 JST (UTC+09:00).

Behavior changes

  • Rules regeneration: .cccc/rules/PEER*.md are now always rewritten on orchestrator start. These are runtime artifacts; consider ignoring .cccc/rules/** in your project’s .gitignore to avoid noisy diffs.
  • Timestamp formatting: switched from UTC “Z” ISO stamps to local time with tz abbreviation and explicit UTC offset for better readability.

Configuration additions (all optional; sensible defaults)

  • delivery.main_loop_tick_seconds: 2.0
    • Controls the main loop polling interval (seconds).
  • delivery.keepalive_enabled: true
  • delivery.keepalive_delay_seconds: 60
    • Enables and tunes the delayed progress keepalive.

Quality and fixes

  • NUDGE retry window resets when inbox backlog increases (prevents permanent stall after reaching max retries).
  • Suppressed high-frequency writes of nudge.peer*.json during skip paths (debounce/backoff/not-yet-time).
  • Minor stability and log/ledger improvements around keepalive scheduling (keepalive-scheduled/sent/skipped events).

Upgrade notes

  • No breaking API changes.
  • After upgrading, your first run will regenerate .cccc/rules/* with the new local-time header.
  • If you previously tracked .cccc/rules/* in VCS, consider adding .cccc/rules/** to .gitignore to avoid frequent diffs from timestamps.

v0.3.0

23 Sep 02:57

Choose a tag to compare

Release notes — CCCC Pair 0.3.0

Headline

  • A user‑facing, low‑noise multi‑peer orchestrator with repo‑native anchors. Two equal peers (defaults: Claude Code + Codex CLI) collaborate by evidence, and an optional Aux (Gemini CLI) handles on‑demand reviews or heavy lifting. Strategic and
    execution context now live where they belong: in your repo.

What’s new

  • Repo‑native anchors (POR/SUBPOR)
    • POR (docs/por/POR.md): strategic board with North‑star, Deliverables, Roadmap (Now/Next/Later), Risk Radar, Decision & Pivot Log, and a short Maintenance log.
    • SUBPOR (docs/por/T######-slug/SUBPOR.md): per‑task sheet with Goal/Scope, 3–5 Acceptance checks, Cheapest Probe, Kill Criteria, Implementation notes, REV, and a single Next step.
    • Lightweight generator: .cccc/por_subpor.py to create POR if missing and spawn new SUBPORs on demand (no deps; ASCII; idempotent).
  • Rules and prompts (clear, concise, equal peers)
    • Require peer ACK before creating a new SUBPOR.
    • SUBPOR creation is owned only by PeerB (after creation both peers can update/maintain).
    • PROJECT.md is user‑maintained; peers read to align but do not edit unless explicitly asked.
    • Message skeleton remains simple: <TO_USER>/<TO_PEER> with one fenced insight (who/kind/next/refs).
  • Low‑noise cadence and visibility
    • Status panel always shows POR path/updated and: “Next: self‑check | auto‑compact (policy)”.
    • Nudge polish: resend at most once; 5‑minute quiet window; small jitter; progress resets retries.
  • Optional third peer (Aux, Gemini CLI)
    • Strategic notes belong in POR, tactical offloads belong in each task’s SUBPOR.
    • Rationale: Gemini excels at short, non‑interactive jobs (reviews/tests/bulk transforms); perfect as on‑demand Aux. You can swap models at any time.
  • README — user‑focused rewrite
    • Pain → payoff, When to use, How it works (60s), Quick Start, Repo layout, FAQ.
    • Clear story for Claude/Codex defaults and Gemini as Aux; vendor‑agnostic by design.

Quality and polish

  • ASCII‑only in templates and prompts; timezone‑aware timestamps in generators.
  • Moved legacy/draft docs under docs/_drafts/ to prevent confusion.
  • Prompt rules regenerated automatically (rules hash bump) to keep runtime docs consistent.

Why it matters

  • No more “big docs somewhere else” or “context scattered in chat.” Strategy (POR) and execution (SUBPOR) are plain files in your repo. Two peers drive by evidence, stay aligned on the board, and keep the noise down. Aux joins only when you need a
    burst of focused work.

Upgrade notes

  • Run cccc run — POR is now ensured under docs/por/.
  • Use .cccc/por_subpor.py subpor new … to create one SUBPOR per task (PeerB after peer ACK).
  • If you had older drafts under docs/, they’re now in docs/_drafts/ (non‑authoritative).

Looking ahead

  • Optional IM digests once anchors stabilize across teams.
  • Gentle “duplicate‑title” guard for SUBPOR creation if teams still hit accidental duplicates.
  • More examples and screenshots for first‑time users.

v0.2.9

14 Sep 19:23

Choose a tag to compare

Highlights

  • New IM Bridges
    • Slack bridge (Socket Mode + Web API): Outbox-driven text delivery, inbound routing, robust file uploads via files_upload_v2 with correct token usage and redirect handling, dynamic channel subscriptions (subscribe/unsubscribe), peer↔peer
      summaries (showpeers).
    • Discord bridge (Gateway + REST): Outbox-driven text delivery, inbound a:/b:/both: message routing, file sending with retries, dynamic channel subscriptions, peer↔peer summaries.
  • Unified Routing UX
    • Consistent routing across Slack/Discord/Telegram:
      • Prefixes: a:/b:/both: (ASCII and full‑width colon supported)
      • Plain‑text slash: /a /b /both (not slash commands)
      • Mention-forms: Slack/Discord (<@bot> a:), Telegram (@botName a:)
    • Require explicit routing by default to prevent chat noise from being forwarded.
  • Flat Outbound Files
    • Single flat folder: .cccc/work/upload/outbound/
    • Optional caption in .caption.txt (first line a:/b:/both: route, removed from caption)
    • Optional .route sidecar (a|b|both)
    • On success, write .sent.json and delete payload/sidecars for idempotency.

User Experience & Reliability

  • First-message delivery confidence:
    • Discord: sender waits for client readiness (wait_until_ready) and re-queues when channel cache is not ready; adds WARN logs for quick diagnosis.
    • Slack: minimal sender queue with WARN+retry when no channels are configured/subscribed yet; subscribe flush moves buffered messages to the unified sender. No duplicate sends on success.
  • File Delivery
    • Slack: prefer files_upload_v2(channel=…, file=file-like object), fallback to legacy files_upload as needed; detailed error logging (e.g., missing_scope, not_in_channel).
    • Discord: non-blocking sends with clear errors; idempotent send (sent.json + cleanup).
  • Outbox Consumer
    • Clear semantics remain simple: clear = dispatch immediately; baseline = first read establishes baseline (no dispatch), subsequent reads dispatch new events.
  • Config & Docs
    • Centralized config loader (YAML/JSON) with normalization (default_route, outbound.reset_on_start, files dirs).
    • Unified settings (Slack/Discord/Telegram) with outbound.reset_on_start: clear.
    • Prompt/docs (README/AGENTS) reflect flat outbound, unified routing, no dry-run; tokens/SDKs required, fail fast on missing deps.
  • Telegram Polishing
    • Consistent routing with full-width colon support; startup indentation bug fixed.

Upgrade Notes

  • Slack
    • Enable scopes: files:write, chat:write; for inbound use Socket Mode app token (xapp-).
    • Subscribe in channel (type: subscribe) or configure channels.to_user in .cccc/settings/slack.yaml.
    • First-message reliability improved via sender queue with WARN+retry.
  • Discord
    • In Developer Portal: enable Message Content Intent.
    • Invite bot with permissions: Read Message History, Send Messages, Attach Files (optionally Embed Links).
    • Subscribe in channel (sub) or set channel IDs in .cccc/settings/discord.yaml.
    • Sender waits for ready; channel-not-ready warns and re-queues.
  • Telegram
    • Use TELEGRAM_BOT_TOKEN; allowlist or autoregister=open for fast testing.
    • Routing in groups uses explicit a:/b:/both: or /a /b /both; @botName prefix supported.