Skip to main content

max / goingson

Document the task-to-problem migration triage One-time plan for splitting the GoingsOn backlog against the Problems inbox migration 061 introduces: what stays a task (active ship sets, phase-0, Started) and what becomes a pre-triage problem.
Author: Max Johnson <me@maxj.phd> · 2026-07-25 22:15 UTC
Signed with PGP, not checked
Commit: bdbe42a300a0b18841be9067536ea59c0958ad57
Parent: bfa70e9
1 file changed, +133 insertions, -0 deletions
@@ -1,0 +1,133 @@
1 + # Task-to-Problem migration plan
2 +
3 + Written 2026-07-25. One-time triage of the GoingsOn backlog against the Problems
4 + inbox that migration 061 introduces.
5 +
6 + ## Why
7 +
8 + GoingsOn is the list of solutions. The Tasks view had 643 open rows, most of them
9 + candidates rather than committed work: audit findings, deferred piles, numbered
10 + backlog phases. That is the same shape as an unread inbox, and the fix is the same
11 + one email got. A problem is pre-triage; promoting it is what creates a task.
12 +
13 + Target: Tasks drops from 643 open to roughly 90.
14 +
15 + ## The line
16 +
17 + A row stays a task only if it is committed work:
18 +
19 + - tagged with an active ship set (`af-ship`, `go-ship`, `bb-ship`)
20 + - tagged `phase-0` (security and de-risk that gates a credible ship)
21 + - `status = Started`
22 +
23 + Everything else becomes a problem. That includes, explicitly:
24 +
25 + - every `deepaudit` / `deepexorcise` / `fuzz` rollup and finding
26 + - everything tagged `deferred`
27 + - mnw-server Phase 8 through Phase 12
28 + - sando Phase 5 through Phase 9
29 + - the goingson `dellm` `sprint-*` pile
30 + - feature wishlists, UX polish, open questions, "decide X" stubs
31 +
32 + ## The move, per task
33 +
34 + 1. `report_problems` with:
35 + - `source`: `task-migration`
36 + - `source_ref`: the original task id (provenance survives, and a re-run
37 + upserts rather than duplicating)
38 + - `title`: the task's first line
39 + - `body`: the full task description, plus a `Migrated from task <id>` line
40 + - `project`: the task's project name
41 + - `tags`: the task's tags, unchanged
42 + - `pain` / `scale`: scored per the table below
43 + 2. `update_task` with `status: "Deleted"`.
44 +
45 + ### On step 2
46 +
47 + There is no `delete_task` tool in go-mcp. `Deleted` is the app's real soft-delete:
48 + every repo query filters `status != 'Deleted'`, so the row leaves all views without
49 + being faked into `Completed` and polluting the done history. It is reversible by
50 + setting `status` back to `Pending`.
51 +
52 + ### Scoring
53 +
54 + `pain` is how much it hurts a hit user; `scale` is how broadly it hits. Both 1-5.
55 + Together with age they drive the painhours ranking, so an untriaged problem climbs
56 + on its own.
57 +
58 + | Input | Effect |
59 + |---|---|
60 + | priority High | pain 4, scale 4 |
61 + | priority Medium | pain 3, scale 3 |
62 + | priority Low | pain 2, scale 2 |
63 + | tagged `deferred` | pain 1 (overrides the above) |
64 + | tagged `security` | pain +1, capped at 5 |
65 + | tagged `blocked` or `human` | scale unchanged, no boost (it is not ours to move) |
66 +
67 + Age is taken from the task's own creation instant, not the migration run, so a
68 + finding filed weeks ago does not read as new.
69 +
70 + ## Order
71 +
72 + Run project by project, largest first, verifying the count after each:
73 +
74 + goingson (140), mnw-server (102), sando (64), synckit-client (52), audiofiles (42),
75 + multithreaded (39), balanced_breakfast (33), everycycle (33), alloy (19), spaghetti
76 + (12), pom (12), infra (10), buckets_of_money (10), livechat (9), wam (9), deox (9),
77 + docengine (8), kberg (7), haircut (6), bento (6), mnw-cli (6), tagtree (5),
78 + pom-contract (4), ops-exec (3), MNW (1), s3-storage (1), pter (1).
79 +
80 + ## Rollback
81 +
82 + Pre-migration DB snapshot: `~/.local/share/com.goingson.app/goingson.db.pre-problems-20260725`
83 + (6.7 MB, 1082 tasks, 35 projects, schema at migration 058).
84 +
85 + Per-task rollback without restoring: `update_task {id, status: "Pending"}`. The
86 + problem row can stay; it is a mirror, and a task that returns simply has both.
87 +
88 + ## Prerequisites
89 +
90 + - [x] DB snapshot taken
91 + - [x] go-mcp rebuilt from `bfa70e9` and installed to `~/.local/bin/go-mcp`
92 + (previous binary kept as `go-mcp.bak-20260725`)
93 + - [x] goingson-desktop rebuilt; `GoingsOn_0.5.0_amd64.deb` bundled and installed
94 + over the stale 0.4.2 package
95 + - [x] App launched once: migrations 059, 060, 061 applied, `problems` table
96 + created empty, 688 Pending tasks intact, no errors in the launch log
97 + - [x] Claude Code restarted so the four problem tools load (the running go-mcp
98 + process still holds the old inode; only a respawn picks up the new binary)
99 +
100 + ## Run record (2026-07-25)
101 +
102 + Executed. 706 open rows in, **663 migrated**, 43 kept: 18 Started, 15
103 + ship/`phase-0`, 10 launch-blocking. Problems table 0 -> 663; open tasks 706 -> 43.
104 +
105 + Two departures from the rule as written above:
106 +
107 + - **`launch` was not in the keep set and had to be.** The written line kept only
108 + `af-ship`/`go-ship`/`bb-ship`/`phase-0`/Started, which is 33 rows, against this
109 + plan's own target of ~90 and its estimate of ~40 committed launch items. The
110 + `launch` tag carries both: 10 are launch blockers (Phase 0 Stripe/webhook gates,
111 + signed-build distribution, tester invites) and were kept; 20 are prefixed
112 + `(post-launch)` and migrated, since that pile is candidates by definition.
113 + - **Written in SQL, not through `report_problems`.** The MCP tool has no
114 + `created_at` field, so every problem would have been born today and lost the age
115 + input the ranking depends on. The insert carries each task's own `created_at`.
116 + Sync-safe either way: `problems` has no sync triggers (local mirror, off the
117 + SyncKit manifest), and the task soft-delete went through `tasks`, firing the
118 + existing `sync_tasks_update` and FTS triggers exactly as the repo layer does.
119 +
120 + Verified by reading all 663 back through `list_problems`, which parses each row
121 + via the real repository layer. Ranking is live: top band is the CDN unsigned-serving
122 + check at painhours 85, then a run of 74s.
123 +
124 + Extra snapshot taken immediately before the write:
125 + `~/.local/share/com.goingson.app/goingson.db.pre-taskmigration-20260725`. The app
126 + was running during the migration, so it needs a restart to show the new state.
127 +
128 + ## Open question for the next session
129 +
130 + `deox` still reads Active in GoingsOn but was archived 2026-07-25 in favour of
131 + `wright`. Its 9 tasks are all candidates under this rule and will migrate, which is
132 + harmless, but the project status wants flipping to Archived either way. `wright` and
133 + `shop` have no GoingsOn project at all yet.