Development record
Reviews and Memory Stay Fresh, Always
Press Release
abcd keeps
.abcd/work/in sync with its volatile sources continuously. A scheduled launchd agent (or cron entry) runsabcd dev-syncevery hour by default, promoting new chats from whichever oracle adapter is configured into.abcd/work/reviews/, distilling new Claude memories into.abcd/memory/, and curating new entries into the.abcd/work/issues/ledger. Each source is adapter-scoped: dev-sync pulls only from the sources that are actually configured. By the time you run/abcd:disembark, everything is already current."Sync ran only at disembark, which meant my lifeboats were always missing the last few hours of oracle reviews," said Frank, SRE. "Now it syncs in the background. When I disembark, I know what's in
.abcd/work/is what's in my recent work."
Why This Matters
abcd deliberately scopes dev-sync to two triggers: implicit at disembark Phase 0, and manual abcd dev-sync. Live/scheduled sync was deferred to keep the initial surface area small and avoid the operational complexity of installing system-level scheduled jobs.
Once real usage patterns emerge, the cost of "stale .abcd/work/ until next disembark" will become visible. This intent closes that gap with a real scheduled-sync solution.
What's In Scope
- launchd agent (macOS) and cron entry (Linux) installation via
/abcd:ahoy - Configurable interval (default 1h, settable via
.abcd/config.json→dev_sync.interval) - Per-source enable/disable (
dev_sync.{oracle,memory,work}.enabled), where the oracle source is adapter-scoped — it activates only when an oracle adapter is configured; no source is mandatory - Lifecycle: install during ahoy with transparent confirm; uninstall removes the scheduled job
- Health check:
abcd dev-sync statusshows last successful run timestamp
What's Out of Scope
- Real-time fsevents-based sync (too invasive; cron/launchd is sufficient)
- Cross-machine sync (oracle-adapter chats from one machine appearing in another's
.abcd/work/) - Pull-based sync from sources beyond the current set (configured oracle adapters, memory, .abcd/.work.local)
Acceptance Criteria
BDD format, per
itd-1-acceptance-gates. These gates are checked byintent-fidelity-reviewerwhen this intent moves toshipped/.
- Given a macOS user runs
/abcd:ahoyon a fresh repo withdev_sync.scheduled.enabled = truein their config, when ahoy completes, then a launchd~/Library/LaunchAgents/dev.abcd.devsync.<repo-id>.plistis installed (with explicit confirmation prompt) AND the user can verify it vialaunchctl list | grep abcd. - Given a Linux user runs
/abcd:ahoyon the same config, when ahoy completes, then a cron entry is installed (with explicit confirmation) AND the user can verify it viacrontab -l. - Given an installed scheduled
dev-syncruns at its configured interval, when the run completes successfully, then it writes.abcd/logbook/dev-sync/<utc-ts>/run-report.{json,md}ANDabcd dev-sync statusreports the timestamp of the last successful run. - Given a scheduled
dev-syncrun conflicts with an in-progress/abcd:disembark pack <repo> <path>(file-system contention on.abcd/work/), when the scheduler fires, then the scheduled run detects the active disembark via a documented lock mechanism, skips its work, logs the skip-reason to its run report, and waits for the next interval. - Given the user runs
/abcd:ahoy uninstall, when the sub-verb completes, then the launchd plist (or cron entry) is removed AND the user can verify its absence via the samelaunchctl list/crontab -lcheck. - Given the user changes
dev_sync.intervalin.abcd/config.jsonfrom"1h"to"30m", when the next/abcd:ahoy install(idempotent re-install) runs, then the scheduled job's interval updates to 30 minutes AND the change is recorded in the install report. - Given a scheduled
dev-syncrun fails (a configured oracle adapter unreachable, memory lock contention, etc.), when the next scheduled fire occurs, then the failure is recorded in the run report, surfaced viaabcd dev-sync statusas "last run: failed (N intervals ago)", and the next run attempts independently — no exponential backoff that hides recurring failures.
SOTA
Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the memory-knowledge SOTA note.
- The draft's sources have moved. "Distilling new Claude memories" contradicts the ruling that abcd never reads the host's memory files (adr-2610091918443997); the oracle-adapter chats and the
dev-syncverb do not exist; and the nearest ruling on running in the background is the dashboard's (itd-2610032150577708, decision 12: "started by hand, running until stopped, never starting by itself"), which covers the dashboard alone. - Apple deprecates cron and says not to install it programmatically. "The preferred way to add a timed job is to use launchd"; cron "has been deprecated in favor of launchd"; "you should not programmatically add a cron job" because the crontab is a shared resource (Apple's scheduling guide). That rules cron out on macOS, where Apple's guidance applies; the draft's cron entry is for Linux, where cron is not deprecated.
- Interval timers drop missed runs; calendar timers coalesce them. launchd.plist(5): a
StartIntervalfiring during sleep "will be missed",StartCalendarIntervalevents "will be coalesced into one event upon wake"; systemd:Persistent="only has an effect on timers configured withOnCalendar=" and catches up a missed run from a timestamp on disk, while monotonic timers pause under suspend. On Linux a systemd user timer withOnCalendar=andPersistent=trueis preferred for its catch-up, with cron the fallback where systemd is absent. If a scheduler is ever installed, it is a calendar job on both platforms. - The harness writes memory during the session, not on a clock. Auto memory is written as Claude works (vendor docs); no surveyed harness syncs memory by scheduler.
- Path 3: no system scheduler by default, forced by the user's-directory-is-theirs, loud staging (a background job fails where nobody is looking) and the host-memory ruling that removed the draft's main source; the dashboard's "never starting by itself" is the nearest precedent, not yet a rule for background jobs. Sync on the hooks abcd already installs (
SessionStart,Stop) and on demand; a calendar job (StartCalendarIntervalon macOS;OnCalendarwithPersistent=trueon Linux, cron only where systemd is absent; with a single-instance lock) only where a person asks. The draft needs re-grounding before planning. The independent fit-challenge runs at plan time.
Open Questions
- launchd vs cron — install both with platform detection?
- Should the scheduled job log to
.abcd/logbook/dev-sync/<timestamp>/(consistent with command logs) or a dedicated location? - What happens if a scheduled run conflicts with an in-progress disembark — locking, queuing, or skip?
- (SOTA 2026-10-23) With the host's memory files off limits and no
dev-syncverb, what are this intent's sources now, and is an event-driven sync on the installed hooks enough that no background job is needed at all? - (SOTA 2026-10-23) Does the dashboard's ruling (started by hand, running until stopped, never starting by itself; itd-2610032150577708, decision 12) extend to every background job abcd could install, or does it cover the dashboard alone? The product thinker has ruled it only for the dashboard.
Audit Notes
Empty. Populated by intent-fidelity-reviewer when intent moves to shipped/.
Frontmatter
| id | itd-13 |
|---|---|
| type | intent |
| lifecycle | drafts |
| kind | standalone |
| severity | minor |
.abcd/development/intents/drafts/itd-13-scheduled-dev-sync.md
open on GitHub ↗ · commit history ↗
Referenced by4
- iss-2610262034143915itd-13's dev-sync keeps a last successful run timestamp shown by `abcd dev-sync status`; the board chapter says even in the dev-sync design no last-run timestamp is recordedrelated
- iss-2610262038534481itd-13's dev-sync curates entries into the issue ledger; 03-configuration says capture writes the ledger directly and the sync has nothing left to migrate thererelated
- itd-10Full Removal When You Mean Itbuilt on by
- itd-25Patterns Surface Themselvesbuilt on by
mentions12
- adr-2610091918443997What may enter abcd's memory notes without the person's yes, and how a note reaches the record
- iss-94The intent corpus still specifies the pre-adr-35 lifeboat model: itd-2, itd-8, itd-9, itd-10, itd-13, itd-15, itd-19, itd-22 and itd-24 variously use the retired 'disembark to home' signature, the in-tree .abcd/lifeboat/ home, or the in-tree .abcd/development/voyage/ path (itd-9's acceptance writes voyage provenance in-tree — the exact path that would fail abcd's own privacy-hygiene audit rule). The brief, glossary and roadmap were reconciled to adr-35; the intents were deliberately NOT rewritten, because an intent is a proposal with its own lifecycle and silently rewriting nine of them inside an unrelated change is worse than tracking the drift. Each reconciles when it is next planned.
- iss-2609240227447110itd-7 (planned, spec_id null) hangs its workspace pull on abcd dev-sync, which has no verb and no code: the CLI's command list carries no dev-sync, grep over internal/ and cmd/ finds none, and the only record of it is the draft itd-13 (scheduled dev-sync). Its lifeboat route does not exist either: embark writes only four record families, adrs, issues, intents and specs (embarkFamilies in internal/core/lifeboat/embark_types.go), and names every other file as one it does not write, so .abcd/rp/workspace.json has no path from a lifeboat into a target repository as acceptance criteria 6 and 7 require. itd-6 Decision 4 already has itd-7 waiting; the record does not say that its own two prerequisites are missing as well.
- iss-2610262038344053The glossary retires "phase" for dependencies plus the lifecycle shelves; the configuration chapter still schedules work into "a later phase".
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-7Lifeboats Carry RepoPrompt Workspace Definitions Forward
- itd-28Spec-Tied Reviews Live Next To The Spec They Reviewed
- itd-97The Facilitator Is a Mode, Not a Person
- itd-2609150819445595A shipped intent's owed fidelity review is listed, so the debt is paid
- itd-2610032150577708The product thinker's dashboard, in a browser through Tailscale
- itd-2610301750162657abcd's unattended work is spot-checked against specs and intents
- spc-2610301925429250abcd's unattended work is spot-checked against specs and intents