Repository navigation
release: Document Sync Agent on-device validation #63
Description
Activity
Needs you at a keyboard — this one is inherently manual
I cannot do on-device validation. Everything here requires a signed build installed on a real Mac, a real Obsidian vault, and observation over time.
What I can confirm from the code
The Document Sync Agent is implemented and unit-tested:
SyncAgent/, the shared-Keychain token, theSMAppServiceLaunchAgent registration, and the xattr + path correlation.swift test --package-path Packages/InterlinedPersistencecovers the sync engine and the outbox.Two things changed today that touch this issue directly:
- PR fix(persistence): order the sync outbox by a monotonic sequence, not by a timestamp #100 fixes a real ordering defect in the sync outbox. It was sorted by
enqueuedAtalone — a non-total key — so two changes queued in the same instant could replay in either order, which for document sync means an update replayed before the create it depends on. If you were going to validate the agent on-device, validate it after that merges, or you would be exercising the bug. - The agent's per-machine configuration is the case feat(settings): finish the Applications pane - main workstation, rename, remove, copy to shared #56 is about (app-settings per-machine storage). That is in flight.
What I need from you
A validation pass on a real machine, roughly:
- Install a signed build, enable the agent in Settings ▸ Document Sync, point it at a folder inside an Obsidian vault.
- Confirm the LaunchAgent survives a logout/login and a reboot —
SMAppServiceregistration is the part most likely to be wrong in a notarised build versus a debug one. - Edit a document in the app → confirm the file changes on disk. Edit the file in Obsidian → confirm the app picks it up.
- Rename a document; confirm the xattr correlation keeps the file associated rather than creating a duplicate.
- Force-quit mid-sync and relaunch; confirm the outbox drains rather than losing or duplicating a change.
- Leave it running a day and check Console for repeated errors or runaway wakeups.
What would help most if something goes wrong
The rotating debug log (shipped in PR #9) and the Console output for the agent's subsystem. If step 2 fails, that is almost certainly an entitlement or a signing difference between the debug and notarised builds, and the notarised build is the only one that can show it — which is why this is blocked behind #62 in practice.
- PR fix(persistence): order the sync outbox by a monotonic sequence, not by a timestamp #100 fixes a real ordering defect in the sync outbox. It was sorted by
Summary
The Document Sync Agent (
SyncAgent/) is built and tested — 53 passing tests including a read-only live check. The packaging pipeline embeds it atInterlinedList.app/Contents/Library/LoginItems/InterlinedListSync.appand registers it as anSMAppService.agentvia Settings ▸ Document Sync.What remains cannot be run headless: it needs a real Aqua session and a Developer ID signature. That makes it part of the release gate, not the feature backlog.
What the agent is
A bundled
LSUIElementmenu-bar utility that mirrors documents to a local Markdown folder (the Obsidian use case). It reads the bearer token from the shared Keychain group$(AppIdentifierPrefix)com.interlinedlist.shared, so it syncs with no separate sign-in. Correlation usesxattrplus path.Validation checklist
.pkginstall path, end to end:.pkgon a clean machineSMAppService.agentregistration succeeds and is visible in System Settings ▸ Login ItemsTwo things worth deciding while validating
/help/app-settingsdescribes per-machine settings as exactly this case — a sync folder path is meaningful on one machine only. The agent's configuration is a natural first tenant for the Applications settings work. Not a blocker for validation, but decide whether it lands before or after the release cut.Acceptance criteria
Notes
work-consolidation.md§3b. Blocked on the release issue producing a signed.pkg— sequence them together.