max / goingson
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. |