Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions Companion/Decisions/Active/adr-ios-038.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
<!-- COMPANION-CURRENT-NOTE-BEGIN -->
> **Current routing note:** The preserved demo-mode design below names
> `registerAlarmsWithPushWorker` and `TaskEvaluationService.evaluate`. Both symbols were deleted
> with the scheduled-task feature; see ADR-IOS-079. Their guard pattern still applies to any future
> KB-reading background job: demo data must not overwrite real execution state or registrations.
<!-- COMPANION-CURRENT-NOTE-END -->


## ADR-IOS-038: Demo Mode — Custom JWT + Local Mock Provider + Pre-Baked AI Cache
Expand Down Expand Up @@ -190,12 +196,9 @@ fix gates at shared chokepoints, not per-tool patches:
- In-flight refinements that complete DURING demo are dropped at their
save sites (`KBRefinementService`, `AIPromptLearning`) — else the real
refined KB/action text would be spliced into the demo overlay (visible
in a recording). *(Historical: `registerAlarmsWithPushWorker` +
`TaskEvaluationService.evaluate` were demo-guarded for the same reason —
an empty demo KB would GC real task execution state / clobber wake
registrations. Both symbols were deleted with the scheduled-task feature;
see ADR-IOS-079. The guard pattern they illustrate still applies to any
future KB-reading background job.)*
in a recording). `registerAlarmsWithPushWorker` +
`TaskEvaluationService.evaluate` are demo-guarded (empty demo KB would
GC real task execution state / clobber alarm registrations).
- `DisabledRemindersStore` RMW ops capture `activeKeyV2` once (read+write
same key even if the mode flips mid-operation).
- `DemoSeed.wipe` also deletes `draft` rows (demo compose autosaves).
Expand Down
1 change: 1 addition & 0 deletions Companion/Decisions/V3/manifest.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ order source_rev status source_lines sha256 path title
5 508e0e4682116f4c03c95da48981e4d2bef2df03 active 493-555 bdb2833bc45817b942f043d577cc4f6f55f623bef49911e6d5a1a0620be16852 Companion/Decisions/V3/Active/adr-ios-071.md ADR-IOS-071: No Backward Compatibility for the Action Queue
6 508e0e4682116f4c03c95da48981e4d2bef2df03 active 556-667 b6a8d2e4ab098edc81e037c8f9aea3029716425b13b5077f6f926e90a6a29d62 Companion/Decisions/V3/Active/adr-ios-072.md ADR-IOS-072: Content Is Addressed by the Message It Belongs To, Never by the Slot It Occupies
7 b0f628a92 historical 148-149 fd4d0e0818471f89641c282cbe48565f24270b8a37b22fc5c7b20405527e946c Companion/Decisions/V3/pre-compaction-index-lines.md Pre-compaction catalog bullets — DECISIONS.md v3 records (2026-08-13 companion-compact, 2 bullets)
8 8577bcb9c historical 150-151 de9e6dc550f86353f1e87334c0637a5a130d1a28d4aa8f64a2ecade31f625fc3 Companion/Decisions/V3/pre-compaction-index-lines-078-079.md Pre-compaction catalog bullets — ADR-IOS-078 and ADR-IOS-079 (2026-08-28 companion-compact)
32 changes: 32 additions & 0 deletions Companion/Decisions/V3/pre-compaction-index-lines-078-079.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Pre-compaction catalog bullets — ADR-IOS-078 and ADR-IOS-079

**Status:** Historical (preserved source text) · **Routed:** 2026-08-28 `companion-compact` ·
**Source:** `tabmail-ios/DECISIONS.md` at `8577bcb9c`

These two catalog bullets had become second copies of their linked ADR bodies. The compact
`DECISIONS.md` lines retain the status, the discriminating policy boundary, and the symbols needed
for search; the normative records remain ADR-IOS-078 and ADR-IOS-079. The original catalog bytes
are preserved below so no prior citation or search term is lost.

The bullets are fenced because their links are relative to `DECISIONS.md`; the companion verifier
ignores links inside code fences, preserving the source bytes without rewriting their paths.

## Source line 150 — `ADR-IOS-078`

<!-- BEGIN VERBATIM BULLET ADR-IOS-078 -->

```text
- **[ADR-IOS-078](Companion/Decisions/V3/Active/adr-ios-078.md)** — Active. **The newest-100 window bounds SYNC-ORIGIN processing only — existing AI content is NEVER gated from display** (owner, 2026-08-19): summary bubble renders any existing summary in EVERY folder (no window check, no inbox check — `v1.7.9`'s inbox display gate is removed, not restored); action pill/tag buttons stay inbox-membership-only (`ActionTagDisplay.displayedTag`, no window gating). ⛔ `ActiveAIQueue.recentInboxWindowContains` bounds **sync-origin admission + the repopulation sweep ONLY** — manual open, push/NSE merge and moved-into-inbox are window-EXEMPT (`AIJob.windowExempt`, pathway regating, owner directive); **never re-gate an exempt producer to "restore" a global bound.** The `7a31f1d22`/`v1.7.11` display gate + suppression notice were designed in error (`MIS-IOS-018`). Delta sync stays gated, so a message another client moves into the Inbox keeps its INTERNALDATE and may get no automatic summary until opened — accepted (#68).
```

<!-- END VERBATIM BULLET ADR-IOS-078 -->

## Source line 151 — `ADR-IOS-079`

<!-- BEGIN VERBATIM BULLET ADR-IOS-079 -->

```text
- **[ADR-IOS-079](Companion/Decisions/V3/Active/adr-ios-079.md)** — Active. **Scheduled tasks are DELETED from iOS; Thunderbird keeps them.** Background execution and wake-up pushes are not guaranteed here, so `TaskEvaluationService` / `TaskScheduler` / `TaskExecutionCache` / `KBTaskParser` / `ScheduledTasksSettingsView` / `TaskAddTool`+`TaskDelTool`+`TaskEditTool` / `PushClient.registerAlarms` / the NSE `task_alarm` route are gone, and the engine no longer starts. ⛔ **Do NOT extend this to the desktop side:** `[Task]` KB lines, the `kb` sync field and the unattended prompt tier are Thunderbird's live feature input and are untouched — never write code that strips or migrates `[Task]` prose. **`SyncField.taskCache` is GONE too** (case, `CodingKeys`, property, decode, entry type) — safe because a `KeyedDecodingContainer` never reads an undeclared key, so a desktop payload carrying it still decodes, and the desktop gates its merge on `undefined`, so omitting the key skips it; `PromptStateDataUnknownFieldTests` pins *an undeclared key is ignored*. `"task_result"` chat turns **no longer render** (display predicate only — rows stay, no migration). **KEEPS:** `disabledReminders` incl. `t:` hashes — and `gcStaleEntries` now SKIPS every `t:` hash unconditionally, because GC may only collect namespaces this device can re-derive (absent = enabled, Device Sync retains nothing, so collecting the surviving copy loses the user's disable); the `nse_pending_task_result` `CREATE TABLE` (producer+consumer deleted, no cleanup migration); the `Reminder` struct's now-always-nil schedule fields. **User-visible loss:** a Thunderbird-created task no longer fires on iPhone.
```

<!-- END VERBATIM BULLET ADR-IOS-079 -->
6 changes: 6 additions & 0 deletions Companion/Decisions/compaction-2026-08-28-manifest.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# companion-compact manifest — tabmail-ios / Decisions tree (2026-08-28 pass)
# Source: DECISIONS.md at 8577bcb9c BEFORE this pass (26422 B, sha256 b4f21821c3c1ea2e1bd6067af4f1044045cd19265f02b7b3b07f9664a1da2ca2)
# CONTENT DELETED: none. Every row is a byte-exact catalog bullet moved into the route target; DECISIONS.md retains a short searchable link.
fragment_id route_target index_line bytes sha256
ADR-IOS-078 Companion/Decisions/V3/pre-compaction-index-lines-078-079.md 150 1037 c68b8f1cb8d7f7f773cfd8b5994b9de5a6671d6d6a10c7fc3cc27f628286e8ed
ADR-IOS-079 Companion/Decisions/V3/pre-compaction-index-lines-078-079.md 151 1689 0124a5c820d1441b1bd7df43de9ca02bc673148987b3b09a52bfe4c81dd88f44
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@

### Cron Reminders (ScheduledItem Architecture)

> ⚠️ **Historical for iOS.** This describes the feature under its earlier `Cron` naming; it was
<!-- COMPANION-CURRENT-NOTE-BEGIN -->
> **Current routing note:** ⚠️ **Historical for iOS.** This describes the feature under its earlier `Cron` naming; it was
> later renamed `Task`, and **every symbol named below (`KBCronParser`, `CronScheduler`,
> `CronExecutionCache`, `cronCache`, `cron_add`) is absent from the tree.** The iOS side of the
> feature was then deleted outright — see ADR-IOS-079. Thunderbird still runs it. Read this for
> the shared design shape only; do not treat any iOS claim here as live.
<!-- COMPANION-CURRENT-NOTE-END -->

### Cron Reminders (ScheduledItem Architecture)

- **Crons are a subclass of reminders** in the architecture. Both flow through the same unified builder (`ReminderBuilder` / `reminderBuilder.js`), the same disable/enable store (`DisabledRemindersStore` with `c:` hash prefix for crons), and the same Device Sync fields.
- **`[Cron]` KB format**: `[Cron] Schedule <days> <HH:MM> [<timezone>], <instruction>` — stored in KB text, synced via Device Sync KB field, programmatically protected from LLM rewriting on the backend (`splitKbEntries` + `isProtectedEntry`)
Expand Down
Loading