@hybridlabor-api/aos 4.13.2 → 4.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/AGENTS.md +8 -0
- package/.agents/nodes.json +5 -2
- package/.claude/hooks/conventional-commits.mjs +14 -15
- package/.claude/hooks/env-file-protection.mjs +14 -15
- package/.claude/hooks/go-gate.mjs +152 -10
- package/.claude/hooks/go-token.mjs +55 -0
- package/.claude/hooks/memb-inject.mjs +75 -62
- package/.claude/hooks/trail-autostart.mjs +27 -0
- package/.claude/hooks/trail-relay.mjs +1 -0
- package/.claude/settings.json +22 -4
- package/.claude/workflows/startcycle-dispatch.mjs +11 -4
- package/.opencode/plugins/bdb-aos.js +98 -121
- package/.opencode/plugins/lib/trail-autostart.js +38 -0
- package/CLAUDE.md +1 -1
- package/README.de.md +6 -6
- package/README.md +6 -6
- package/README.pt.md +6 -6
- package/THIRD_PARTY_NOTICES.md +19 -3
- package/assets/header-v5.png +0 -0
- package/bin/aos-acp.mjs +211 -0
- package/bin/aos-doctor.mjs +1 -1
- package/bin/aos-uninstall.mjs +2 -2
- package/docs/master-session-acp.md +51 -0
- package/installer.js +314 -42
- package/mcps/mcsc/packages/mcp/server.js +6 -7
- package/package.json +4 -3
- package/scripts/validate-skills.mjs +76 -0
- package/skills/basic/bdbmediastorm/SKILL.md +1 -1
- package/skills/basic/godmode-shipping/SKILL.md +3 -0
- package/skills/basic/master-session/SKILL.md +89 -0
- package/skills/basic/startcycle/SKILL.md +1 -1
- package/skills/basic/startcycle-graph/SKILL.md +2 -2
- package/skills/basic/startcycle-graph-user/SKILL.md +1 -1
- package/skills/basic/teamwork-preview/SKILL.md +1 -1
- package/skills/bdbrainstorm/SKILL.md +7 -1
- package/skills/global_config/agentic-harness-patterns/SKILL.md +257 -0
- package/skills/global_config/agentic-harness-patterns/metadata.json +10 -0
- package/skills/global_config/agentic-harness-patterns/references/agent-orchestration-pattern.md +97 -0
- package/skills/global_config/agentic-harness-patterns/references/bootstrap-sequence-pattern.md +106 -0
- package/skills/global_config/agentic-harness-patterns/references/context-engineering/compress-pattern.md +78 -0
- package/skills/global_config/agentic-harness-patterns/references/context-engineering/isolate-pattern.md +82 -0
- package/skills/global_config/agentic-harness-patterns/references/context-engineering/select-pattern.md +86 -0
- package/skills/global_config/agentic-harness-patterns/references/context-engineering-pattern.md +29 -0
- package/skills/global_config/agentic-harness-patterns/references/hook-lifecycle-pattern.md +111 -0
- package/skills/global_config/agentic-harness-patterns/references/memory-persistence-pattern.md +109 -0
- package/skills/global_config/agentic-harness-patterns/references/permission-gate-pattern.md +111 -0
- package/skills/global_config/agentic-harness-patterns/references/skill-runtime-pattern.md +104 -0
- package/skills/global_config/agentic-harness-patterns/references/task-decomposition-pattern.md +92 -0
- package/skills/global_config/agentic-harness-patterns/references/tool-registry-pattern.md +101 -0
- package/skills/global_config/agenttrail/SKILL.md +8 -0
- package/skills/global_config/agenttrail/bin/agenttrail.mjs +14 -0
- package/skills/global_config/agenttrail/bin/ensure.mjs +118 -0
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +1 -1
- package/skills/global_config/bdb-visual-edit/SKILL.md +51 -0
- package/skills/global_config/bdb-visual-edit/references/vite-react-source-attr.md +59 -0
- package/skills/global_config/bdb-visual-edit/scripts/pick-snippet.js +27 -0
- package/skills/global_config/bdb-visual-edit/scripts/sanitize-element.mjs +123 -0
- package/skills/global_config/factory-collect/SKILL.md +74 -0
- package/skills/global_config/factory-human-digest/SKILL.md +92 -0
- package/skills/global_config/factory-lookback/SKILL.md +95 -0
- package/skills/global_config/factory-review-prs/SKILL.md +63 -0
- package/skills/global_config/git-pr-review/SKILL.md +3 -0
- package/skills/global_config/grilling/SKILL.md +2 -0
- package/skills/global_config/mcsc/SKILL.md +1 -1
- package/skills/global_config/plan-arbiter/SKILL.md +125 -0
- package/skills/global_config/plan-canvas/SKILL.md +62 -5
- package/skills/global_config/plan-canvas/scripts/lib/loopback-guard.js +19 -3
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/README.md +285 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/agent-trail.js +129 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/board-client.js +124 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/demo-plan/canvas.mdx +19 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/demo-plan/plan.mdx +18 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/recap-demo/plan.mdx +72 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/README.md +29 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/architecture.json +30 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/builder/00_architecture.html +14950 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/builder/canvas.mdx +511 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/builder/plan.mdx +208 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/recap/plan.mdx +102 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/standard/plan.md +136 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/signup-storyboard/canvas.mdx +124 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/signup-storyboard/plan.mdx +37 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/index.js +188 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/kit.js +123 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/mdx.js +411 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/render.js +1291 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/architecture/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/architecture/plan.mdx +195 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/architecture/standard.md +95 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/bugfix/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/bugfix/plan.mdx +105 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/bugfix/standard.md +76 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/canvas.mdx +81 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/plan.mdx +145 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/standard.md +76 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/migration/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/migration/plan.mdx +172 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/migration/standard.md +100 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap/plan.mdx +67 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap/standard.md +49 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/canvas.mdx +63 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/plan.mdx +49 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/standard.md +39 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/plan.mdx +118 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/standard.md +57 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/release/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/release/plan.mdx +173 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/release/standard.md +96 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/research/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/research/plan.mdx +91 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/research/standard.md +54 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/canvas.mdx +53 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/meta.json +1 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/plan.mdx +225 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/standard.md +111 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/theme.css +472 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-builder/trail.js +216 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/markdown.js +1 -1
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/server.js +37 -4
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/ui.js +125 -29
- package/skills/global_config/plan-canvas/scripts/plan-canvas.js +196 -8
- package/skills/global_config/pr-recap/SKILL.md +47 -0
- package/skills/global_config/pr-recap/scripts/pr-recap.mjs +200 -0
- package/skills/global_config/quick-recap/SKILL.md +55 -0
- package/skills/global_config/stay-within-limits/SKILL.md +85 -0
- package/skills/global_config/triage/SKILL.md +3 -0
- package/skills/global_config/visual-edit/README.md +96 -0
- package/skills/global_config/visual-edit/SKILL.md +615 -0
- package/skills/global_config/visual-plan/README.md +93 -0
- package/skills/global_config/visual-plan/SKILL.md +544 -0
- package/skills/global_config/visual-plan/references/canvas.md +139 -0
- package/skills/global_config/visual-plan/references/connection.md +51 -0
- package/skills/global_config/visual-plan/references/document-quality.md +186 -0
- package/skills/global_config/visual-plan/references/exemplar.md +62 -0
- package/skills/global_config/visual-plan/references/local-files.md +99 -0
- package/skills/global_config/visual-plan/references/wireframe.md +319 -0
- package/skills/global_config/visual-recap/README.md +103 -0
- package/skills/global_config/visual-recap/SKILL.md +560 -0
- package/skills/global_config/visual-recap/references/connection.md +51 -0
- package/skills/global_config/visual-recap/references/local-files.md +99 -0
- package/skills/global_config/visual-recap/references/wireframe.md +319 -0
- package/skills/playbooks/pb-ci-fix/SKILL.md +49 -0
- package/skills/playbooks/pb-event-tracker/SKILL.md +45 -0
- package/skills/playbooks/pb-meeting-actions/SKILL.md +42 -0
- package/skills/playbooks/pb-project-new/SKILL.md +48 -0
- package/skills/playbooks/pb-week-plan/SKILL.md +45 -0
- package/assets/header-v4.jpg +0 -0
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/canvas.mdx
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<DesignBoard title="Pocketlog - settings before and after" version={1} transitions={[
|
|
2
|
+
{ from: "before", to: "after", label: "change" },
|
|
3
|
+
]}>
|
|
4
|
+
<Section id="compare" title="Settings screen" subtitle="Low-fidelity sketches of the old and the new screen. Numbers on the AFTER notes match the change list in the plan.">
|
|
5
|
+
<Artboard id="before" label="BEFORE" surface="mobile" x={80} y={120} width={320} height={600} order={1}>
|
|
6
|
+
<Screen surface="mobile" caption="One flat list of toggles, no save feedback.">
|
|
7
|
+
<FrameScreen>
|
|
8
|
+
<StatusBar />
|
|
9
|
+
<Col full>
|
|
10
|
+
<Title text="Settings" />
|
|
11
|
+
<Row><IconSquare active /><Text value="Dark mode" /></Row>
|
|
12
|
+
<Row><IconSquare /><Text value="Sound effects" /></Row>
|
|
13
|
+
<Row><IconSquare active /><Text value="Daily reminder" /></Row>
|
|
14
|
+
<Row><IconSquare /><Text value="Weekly summary" /></Row>
|
|
15
|
+
<Row><IconSquare active /><Text value="Auto sync" /></Row>
|
|
16
|
+
<Row><IconSquare active /><Text value="Wi-Fi only" /></Row>
|
|
17
|
+
<Row><IconSquare /><Text value="Backup" /></Row>
|
|
18
|
+
<Text value="7 more toggles below" tone="muted" />
|
|
19
|
+
<Btn label="Save" />
|
|
20
|
+
</Col>
|
|
21
|
+
</FrameScreen>
|
|
22
|
+
</Screen>
|
|
23
|
+
</Artboard>
|
|
24
|
+
<Artboard id="after" label="AFTER" surface="mobile" x={560} y={120} width={320} height={600} order={2}>
|
|
25
|
+
<Screen surface="mobile" caption="Three groups, save state in the footer.">
|
|
26
|
+
<FrameScreen>
|
|
27
|
+
<StatusBar />
|
|
28
|
+
<Col full>
|
|
29
|
+
<Title text="Settings" />
|
|
30
|
+
<SectionLabel label="Account" />
|
|
31
|
+
<Row><IconSquare active /><Text value="Auto sync" /></Row>
|
|
32
|
+
<Row><IconSquare active /><Text value="Wi-Fi only" /></Row>
|
|
33
|
+
<SectionLabel label="Notifications" />
|
|
34
|
+
<Row><IconSquare active /><Text value="Daily reminder" /></Row>
|
|
35
|
+
<Row><IconSquare /><Text value="Weekly summary" /></Row>
|
|
36
|
+
<SectionLabel label="Data" />
|
|
37
|
+
<Row><IconSquare /><Text value="Backup" /></Row>
|
|
38
|
+
<Divider />
|
|
39
|
+
<Row><IconSquare active /><Text value="All changes saved" tone="muted" /></Row>
|
|
40
|
+
</Col>
|
|
41
|
+
</FrameScreen>
|
|
42
|
+
</Screen>
|
|
43
|
+
</Artboard>
|
|
44
|
+
</Section>
|
|
45
|
+
|
|
46
|
+
<Annotation id="m1" title="1 Grouped sections" targetId="after" placement="right">
|
|
47
|
+
|
|
48
|
+
Account, Notifications and Data replace one list of 14 toggles.
|
|
49
|
+
|
|
50
|
+
</Annotation>
|
|
51
|
+
|
|
52
|
+
<Annotation id="m2" title="2 Most used first" targetId="after" placement="right">
|
|
53
|
+
|
|
54
|
+
Auto sync and Daily reminder lead their groups.
|
|
55
|
+
|
|
56
|
+
</Annotation>
|
|
57
|
+
|
|
58
|
+
<Annotation id="m3" title="3 Save state" targetId="after" placement="right">
|
|
59
|
+
|
|
60
|
+
The footer replaces the Save button and shows Saving or All changes saved.
|
|
61
|
+
|
|
62
|
+
</Annotation>
|
|
63
|
+
</DesignBoard>
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/meta.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"recap-board","label":"Recap with before/after board","description":"Visual recap for a UI or architecture change: a design canvas with BEFORE and AFTER artboards and numbered change markers, plus a short matching document.","useWhen":"The change is mostly visible (a screen or a system shape) and reviewers should see before and after side by side with numbered notes.","hasBoard":true}
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/plan.mdx
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Settings screen redesign
|
|
3
|
+
subtitle: "The flat settings list became grouped sections with a clear save state. Invented example."
|
|
4
|
+
kind: recap
|
|
5
|
+
pr: "#203"
|
|
6
|
+
branch: feat/settings-groups
|
|
7
|
+
base: main
|
|
8
|
+
commit: 5be41c9
|
|
9
|
+
files: 7
|
|
10
|
+
additions: 262
|
|
11
|
+
deletions: 118
|
|
12
|
+
author: sample-author
|
|
13
|
+
date: 2026-05-12
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<Callout tone="note" title="How to use this template">
|
|
17
|
+
|
|
18
|
+
Use it when the change is visible. The design canvas next to this document (canvas.mdx) shows BEFORE and AFTER side by side with a labelled "change" arrow and numbered markers on the AFTER screen. Replace the Pocketlog example: redraw both artboards with your own screen or system, keep the marker numbers and the numbered list below in step, and record what you really verified. All names and numbers are invented.
|
|
19
|
+
|
|
20
|
+
</Callout>
|
|
21
|
+
|
|
22
|
+
## Summary
|
|
23
|
+
|
|
24
|
+
- **What:** the Pocketlog settings screen is now grouped into Account, Notifications and Data, and shows whether changes are saved.
|
|
25
|
+
- **Why:** 14 flat toggles hid the two settings people look for most, and nothing showed when a change had been stored.
|
|
26
|
+
- **Scope:** layout and save feedback only. No setting was added, removed or renamed.
|
|
27
|
+
|
|
28
|
+
## What changed
|
|
29
|
+
|
|
30
|
+
The numbers match the markers on the AFTER screen in the canvas.
|
|
31
|
+
|
|
32
|
+
1. **Grouped sections.** Toggles sit under three headings instead of one list of 14.
|
|
33
|
+
2. **Most used first.** Sync and Reminders moved to the top of their groups.
|
|
34
|
+
3. **Save state.** A footer shows "All changes saved" or "Saving..." instead of a Save button.
|
|
35
|
+
|
|
36
|
+
## Verification
|
|
37
|
+
|
|
38
|
+
<Columns columns={[
|
|
39
|
+
{ label: "Verified", blocks: "- Screen renders at 360 and 412 px width in the emulator\n- Toggle changes persist after an app restart\n- Screen reader reads group headings in order" },
|
|
40
|
+
{ label: "Not verified", blocks: "- Small 320 px devices\n- Right-to-left languages\n- Slow network: the Saving state was only seen on a fast connection" },
|
|
41
|
+
]} />
|
|
42
|
+
|
|
43
|
+
## Follow-ups
|
|
44
|
+
|
|
45
|
+
<Checklist title="Follow-ups">
|
|
46
|
+
- [ ] Check the 320 px width and fix any clipping
|
|
47
|
+
- [ ] Review the screen with a right-to-left language
|
|
48
|
+
- [ ] Add an error state when saving fails
|
|
49
|
+
</Checklist>
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/standard.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Recap: Settings screen redesign
|
|
2
|
+
|
|
3
|
+
> Invented example. Replace every fact with your own change. In builder mode this recap also has a design canvas with BEFORE and AFTER screens; here the same facts are plain text.
|
|
4
|
+
|
|
5
|
+
**PR:** #203 **Branch:** feat/settings-groups into main **Commit:** 5be41c9 **Date:** 2026-05-12 **Size:** 7 files, +262 / -118
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
- **What:** the Pocketlog settings screen is now grouped into Account, Notifications and Data, and shows whether changes are saved.
|
|
10
|
+
- **Why:** 14 flat toggles hid the two settings people look for most, and nothing showed when a change had been stored.
|
|
11
|
+
- **Scope:** layout and save feedback only. No setting was added, removed or renamed.
|
|
12
|
+
|
|
13
|
+
## Before and after
|
|
14
|
+
|
|
15
|
+
| | BEFORE | AFTER |
|
|
16
|
+
|---|--------|-------|
|
|
17
|
+
| Layout | One flat list of 14 toggles | Three groups: Account, Notifications, Data |
|
|
18
|
+
| Order | Alphabetical | Most used first in each group |
|
|
19
|
+
| Saving | Save button at the bottom | Footer: "All changes saved" or "Saving..." |
|
|
20
|
+
|
|
21
|
+
## What changed
|
|
22
|
+
|
|
23
|
+
1. **Grouped sections.** Toggles sit under three headings instead of one list of 14.
|
|
24
|
+
2. **Most used first.** Sync and Reminders moved to the top of their groups.
|
|
25
|
+
3. **Save state.** A footer shows "All changes saved" or "Saving..." instead of a Save button.
|
|
26
|
+
|
|
27
|
+
## Verification
|
|
28
|
+
|
|
29
|
+
| Verified | Not verified |
|
|
30
|
+
|----------|--------------|
|
|
31
|
+
| Screen renders at 360 and 412 px width in the emulator | Small 320 px devices |
|
|
32
|
+
| Toggle changes persist after an app restart | Right-to-left languages |
|
|
33
|
+
| Screen reader reads group headings in order | Slow network: Saving state only seen on a fast connection |
|
|
34
|
+
|
|
35
|
+
## Follow-ups
|
|
36
|
+
|
|
37
|
+
- [ ] Check the 320 px width and fix any clipping
|
|
38
|
+
- [ ] Review the screen with a right-to-left language
|
|
39
|
+
- [ ] Add an error state when saving fails
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/meta.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"recap-review","label":"Recap for review","description":"One-page change recap for a PR or merge decision: summary, changed areas, decisions with rejected alternatives, verified vs not verified, risks.","useWhen":"A reviewer must decide on a merge or take over work and needs an honest, document-style account of what changed and what was actually checked.","hasBoard":false}
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/plan.mdx
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Add --json output and exit codes to the stash CLI
|
|
3
|
+
subtitle: "stashctl list and stashctl prune now print machine-readable JSON and return stable exit codes. Invented example."
|
|
4
|
+
kind: recap
|
|
5
|
+
pr: "#87"
|
|
6
|
+
branch: feat/cli-json-output
|
|
7
|
+
base: main
|
|
8
|
+
commit: 9d2e7b1
|
|
9
|
+
files: 6
|
|
10
|
+
additions: 214
|
|
11
|
+
deletions: 37
|
|
12
|
+
author: sample-author
|
|
13
|
+
date: 2026-04-22
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<Callout tone="note" title="How to use this template">
|
|
17
|
+
|
|
18
|
+
Use it for a PR or handover where a reviewer must decide. Replace the stashctl example with your change: fill the three summary bullets, mark the files you really touched, record each rejected alternative, and keep the Verified and Not verified columns honest. Delete sections you do not need. All names and numbers are invented.
|
|
19
|
+
|
|
20
|
+
</Callout>
|
|
21
|
+
|
|
22
|
+
## Summary
|
|
23
|
+
|
|
24
|
+
- **What:** `stashctl list` and `stashctl prune` accept `--json` and return exit codes 0 (ok), 2 (usage) and 3 (nothing to do).
|
|
25
|
+
- **Why:** CI scripts parsed the table output with `awk` and broke whenever a column changed.
|
|
26
|
+
- **Scope:** output formatting only. Storage format and the default human output are unchanged.
|
|
27
|
+
|
|
28
|
+
## Changed areas
|
|
29
|
+
|
|
30
|
+
<FileTree title="Files" entries={[
|
|
31
|
+
{ path: "src", depth: 0, change: "modified" },
|
|
32
|
+
{ path: "src/cli/list.ts", depth: 1, change: "modified", note: "--json flag, exit codes" },
|
|
33
|
+
{ path: "src/cli/prune.ts", depth: 1, change: "modified", note: "--json flag, exit 3 when nothing pruned" },
|
|
34
|
+
{ path: "src/cli/output.ts", depth: 1, change: "added", note: "Shared table and JSON writer" },
|
|
35
|
+
{ path: "src/cli/legacy-format.ts", depth: 1, change: "deleted", note: "Replaced by output.ts" },
|
|
36
|
+
{ path: "tests", depth: 0, change: "modified" },
|
|
37
|
+
{ path: "tests/cli-json.test.ts", depth: 1, change: "added", note: "Schema and exit code cases" },
|
|
38
|
+
]} />
|
|
39
|
+
|
|
40
|
+
<ImplementationMap title="What each file does now" files={[
|
|
41
|
+
{ path: "src/cli/output.ts", change: "added", note: "One writer picks table or JSON, so commands stop formatting on their own" },
|
|
42
|
+
{ path: "src/cli/list.ts", change: "modified", note: "Builds rows, hands them to the writer, maps results to exit codes" },
|
|
43
|
+
{ path: "src/cli/prune.ts", change: "modified", note: "Same, plus a dry-run summary in JSON" },
|
|
44
|
+
{ path: "src/cli/legacy-format.ts", change: "deleted", note: "No other caller was left" },
|
|
45
|
+
{ path: "tests/cli-json.test.ts", change: "added", note: "Pins the JSON shape and the three exit codes" },
|
|
46
|
+
]} />
|
|
47
|
+
|
|
48
|
+
### Most important change: list output
|
|
49
|
+
|
|
50
|
+
<Compare>
|
|
51
|
+
<Before>
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
$ stashctl list
|
|
55
|
+
ID AGE SIZE
|
|
56
|
+
a1f3 2d 4.1M
|
|
57
|
+
b7c9 9d 0.8M
|
|
58
|
+
$ echo $?
|
|
59
|
+
0
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
</Before>
|
|
63
|
+
<After>
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
$ stashctl list --json
|
|
67
|
+
[{"id":"a1f3","ageDays":2,"bytes":4300800},
|
|
68
|
+
{"id":"b7c9","ageDays":9,"bytes":838860}]
|
|
69
|
+
$ echo $?
|
|
70
|
+
0
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
</After>
|
|
74
|
+
</Compare>
|
|
75
|
+
|
|
76
|
+
## Decisions
|
|
77
|
+
|
|
78
|
+
<Decision title="JSON shape" question="Which shape does --json print?" options={[
|
|
79
|
+
{ id: "array", label: "One JSON array per command", detail: "Simple to read with jq, one document per run.", recommended: true },
|
|
80
|
+
{ id: "ndjson", label: "One JSON object per line", detail: "Rejected: streams well, but every consumer we know reads the whole output anyway and would need a line splitter." },
|
|
81
|
+
]}>
|
|
82
|
+
|
|
83
|
+
An array keeps the output valid JSON for any parser. If lists grow beyond memory, add `--ndjson` later as a separate flag.
|
|
84
|
+
|
|
85
|
+
</Decision>
|
|
86
|
+
|
|
87
|
+
<Decision title="Exit code for an empty prune" question="What does prune return when nothing was removed?" options={[
|
|
88
|
+
{ id: "three", label: "Exit 3", detail: "Scripts can tell a no-op from a real prune.", recommended: true },
|
|
89
|
+
{ id: "zero", label: "Exit 0", detail: "Rejected: hides the no-op, and CI cannot branch on it without parsing output." },
|
|
90
|
+
]}>
|
|
91
|
+
|
|
92
|
+
Exit 3 is documented in `--help`. Anyone relying on 0 for an empty prune must update their script.
|
|
93
|
+
|
|
94
|
+
</Decision>
|
|
95
|
+
|
|
96
|
+
## Verification
|
|
97
|
+
|
|
98
|
+
<Table title="Commands run" columns={["Command", "Exit code", "Result"]} rows={[
|
|
99
|
+
["npm test", "0", "41 passed, 0 failed"],
|
|
100
|
+
["npm run lint", "0", "No warnings"],
|
|
101
|
+
["stashctl list --json | jq length", "0", "Printed 2 on the sample stash"],
|
|
102
|
+
["stashctl prune --json (empty stash)", "3", "Exit 3 as designed"],
|
|
103
|
+
["stashctl list --bogus", "2", "Usage error printed to stderr"],
|
|
104
|
+
]} />
|
|
105
|
+
|
|
106
|
+
<Columns columns={[
|
|
107
|
+
{ label: "Verified", blocks: "- JSON shape and the three exit codes, in unit tests\n- Human table output is byte-identical to before\n- Linux x64, Node 20" },
|
|
108
|
+
{ label: "Not verified", blocks: "- Windows and macOS terminals\n- Stashes with more than 10,000 entries\n- Any downstream script that parsed the old table" },
|
|
109
|
+
]} />
|
|
110
|
+
|
|
111
|
+
## Risks and follow-ups
|
|
112
|
+
|
|
113
|
+
<Checklist title="Risks and follow-ups">
|
|
114
|
+
- [ ] Exit 3 for an empty prune can break scripts that expect 0: announce it in the release notes
|
|
115
|
+
- [ ] Run the large-stash case (10,000 entries) before the next release
|
|
116
|
+
- [ ] Check Windows output encoding for non-ASCII ids
|
|
117
|
+
- [ ] Add --ndjson only if a real consumer asks for it
|
|
118
|
+
</Checklist>
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/standard.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Recap: Add --json output and exit codes to the stash CLI
|
|
2
|
+
|
|
3
|
+
> Invented example. Replace every fact with your own change. Use this for a PR or handover where a reviewer must decide.
|
|
4
|
+
|
|
5
|
+
**PR:** #87 **Branch:** feat/cli-json-output into main **Commit:** 9d2e7b1 **Date:** 2026-04-22 **Size:** 6 files, +214 / -37
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
- **What:** `stashctl list` and `stashctl prune` accept `--json` and return exit codes 0 (ok), 2 (usage) and 3 (nothing to do).
|
|
10
|
+
- **Why:** CI scripts parsed the table output with `awk` and broke whenever a column changed.
|
|
11
|
+
- **Scope:** output formatting only. Storage format and the default human output are unchanged.
|
|
12
|
+
|
|
13
|
+
## Changed areas
|
|
14
|
+
|
|
15
|
+
| File | Change | Note |
|
|
16
|
+
|------|--------|------|
|
|
17
|
+
| src/cli/list.ts | modified | --json flag, exit codes |
|
|
18
|
+
| src/cli/prune.ts | modified | --json flag, exit 3 when nothing pruned |
|
|
19
|
+
| src/cli/output.ts | added | Shared table and JSON writer |
|
|
20
|
+
| src/cli/legacy-format.ts | deleted | Replaced by output.ts |
|
|
21
|
+
| tests/cli-json.test.ts | added | Schema and exit code cases |
|
|
22
|
+
|
|
23
|
+
Most important change, list output:
|
|
24
|
+
|
|
25
|
+
| Before | After |
|
|
26
|
+
|--------|-------|
|
|
27
|
+
| `stashctl list` prints a table, exit 0 | `stashctl list --json` prints `[{"id":"a1f3","ageDays":2,"bytes":4300800}, ...]`, exit 0 |
|
|
28
|
+
|
|
29
|
+
## Decisions
|
|
30
|
+
|
|
31
|
+
| Question | Chosen | Rejected alternative |
|
|
32
|
+
|----------|--------|----------------------|
|
|
33
|
+
| JSON shape | One JSON array per command | One JSON object per line: consumers read the whole output anyway |
|
|
34
|
+
| Exit code for an empty prune | Exit 3 | Exit 0: hides the no-op from CI |
|
|
35
|
+
|
|
36
|
+
## Verification
|
|
37
|
+
|
|
38
|
+
| Command | Exit code | Result |
|
|
39
|
+
|---------|-----------|--------|
|
|
40
|
+
| npm test | 0 | 41 passed, 0 failed |
|
|
41
|
+
| npm run lint | 0 | No warnings |
|
|
42
|
+
| stashctl list --json \| jq length | 0 | Printed 2 on the sample stash |
|
|
43
|
+
| stashctl prune --json (empty stash) | 3 | Exit 3 as designed |
|
|
44
|
+
| stashctl list --bogus | 2 | Usage error printed to stderr |
|
|
45
|
+
|
|
46
|
+
| Verified | Not verified |
|
|
47
|
+
|----------|--------------|
|
|
48
|
+
| JSON shape and the three exit codes, in unit tests | Windows and macOS terminals |
|
|
49
|
+
| Human table output is byte-identical to before | Stashes with more than 10,000 entries |
|
|
50
|
+
| Linux x64, Node 20 | Any downstream script that parsed the old table |
|
|
51
|
+
|
|
52
|
+
## Risks and follow-ups
|
|
53
|
+
|
|
54
|
+
- [ ] Exit 3 for an empty prune can break scripts that expect 0: announce it in the release notes
|
|
55
|
+
- [ ] Run the large-stash case (10,000 entries) before the next release
|
|
56
|
+
- [ ] Check Windows output encoding for non-ASCII ids
|
|
57
|
+
- [ ] Add --ndjson only if a real consumer asks for it
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"release","label":"Release","description":"Release plan with scope table, go/no-go checklist, rollout diagram, comms and rollback.","useWhen":"You ship a version to users and need an agreed scope, a go/no-go gate, a staged rollout and a way back.","hasBoard":false}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Beacon Mobile 4.2 - Release Plan
|
|
3
|
+
status: draft
|
|
4
|
+
needs-freeze: scope
|
|
5
|
+
needs-qa: freeze
|
|
6
|
+
needs-staged: qa
|
|
7
|
+
needs-full: staged
|
|
8
|
+
needs-retro: full
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Beacon Mobile 4.2 Release
|
|
12
|
+
|
|
13
|
+
<Callout tone="note" title="How to use this template">
|
|
14
|
+
|
|
15
|
+
Replace the product, version, scope items, thresholds and owners with your own. Keep the go/no-go gate and the rollback section: they are the part reviewers care about. Remove channels you do not use. All names and numbers below are invented.
|
|
16
|
+
|
|
17
|
+
</Callout>
|
|
18
|
+
|
|
19
|
+
## Goal
|
|
20
|
+
|
|
21
|
+
Ship Beacon Mobile 4.2 (offline maps and a new onboarding) to all users within five days of code freeze, with crash-free sessions at or above 99.5 percent at every stage.
|
|
22
|
+
|
|
23
|
+
- Release candidate frozen on Monday 9 Nov, full rollout by Friday 13 Nov.
|
|
24
|
+
- No stage widens while a blocking metric is red.
|
|
25
|
+
- Support and marketing know the final scope 48 hours before the first stage.
|
|
26
|
+
|
|
27
|
+
## Scope
|
|
28
|
+
|
|
29
|
+
<Table title="Release scope" columns={["Item", "Type", "Owner", "Status", "Flag"]} rows={[
|
|
30
|
+
["Offline maps for saved regions", "Feature", "Priya", "Done", "offline_maps"],
|
|
31
|
+
["New onboarding with three steps", "Feature", "Tomas", "In QA", "onboarding_v2"],
|
|
32
|
+
["Fix: location drift in background mode", "Fix", "Lena", "Done", "none"],
|
|
33
|
+
["Dark theme for the settings screen", "Polish", "Tomas", "Done", "none"],
|
|
34
|
+
["Route sharing by link", "Feature", "Priya", "Cut to 4.3", "route_share"],
|
|
35
|
+
]} />
|
|
36
|
+
|
|
37
|
+
## Decision
|
|
38
|
+
|
|
39
|
+
<Decision title="How do we roll out?" question="Which rollout shape gives early signal with the smallest blast radius?" options={[
|
|
40
|
+
{ id: "staged", label: "Staged: 5, 25, 100 percent", detail: "Two hold points with metric checks; widest exposure only after 48 hours of data.", recommended: true },
|
|
41
|
+
{ id: "big", label: "Full release at once", detail: "Fastest, but any regression hits everyone and a store rollback takes days." },
|
|
42
|
+
{ id: "beta", label: "Open beta for two weeks first", detail: "Safest signal, but delays the marketing date and splits support." },
|
|
43
|
+
]}>
|
|
44
|
+
|
|
45
|
+
Staged rollout through the store console plus server-side flags lets us stop at 5 or 25 percent and switch features off without a new build.
|
|
46
|
+
|
|
47
|
+
</Decision>
|
|
48
|
+
|
|
49
|
+
## Rollout
|
|
50
|
+
|
|
51
|
+
<Mermaid label="Rollout stages" source={"flowchart LR\n A[Code freeze Mon] --> B[QA and soak Tue-Wed]\n B --> C{Go / No-go Wed 16:00}\n C -- go --> D[5 percent Thu 09:00]\n C -- no-go --> X[Fix and re-cut RC]\n D --> E{24h metrics ok?}\n E -- yes --> F[25 percent Fri 09:00]\n E -- no --> R[Halt and roll back flags]\n F --> G{24h metrics ok?}\n G -- yes --> H[100 percent Sat 09:00]\n G -- no --> R\n H --> I[Retro Mon]"} />
|
|
52
|
+
|
|
53
|
+
## Go / no-go
|
|
54
|
+
|
|
55
|
+
<Checklist title="Go / no-go gate (Wednesday 16:00)" items={[
|
|
56
|
+
{ label: "All scope items Done or explicitly cut", checked: true },
|
|
57
|
+
{ label: "Release candidate passed the regression suite on 12 devices" },
|
|
58
|
+
{ label: "No open blocker or critical bug" },
|
|
59
|
+
{ label: "Crash-free sessions on the internal soak build at 99.7 percent or higher" },
|
|
60
|
+
{ label: "Feature flags verified on and off in staging" },
|
|
61
|
+
{ label: "Store listing, screenshots and release notes approved" },
|
|
62
|
+
{ label: "Support macros and the known-issues list published" },
|
|
63
|
+
{ label: "Rollback rehearsed: flags off and store halt tested" },
|
|
64
|
+
]} />
|
|
65
|
+
|
|
66
|
+
## Build map
|
|
67
|
+
|
|
68
|
+
### Scope and freeze {#scope}
|
|
69
|
+
|
|
70
|
+
<Checklist title="Scope tasks" items={[
|
|
71
|
+
{ label: "Cut route sharing to 4.3", checked: true },
|
|
72
|
+
{ label: "Tag release candidate and bump version to 4.2.0" },
|
|
73
|
+
]} />
|
|
74
|
+
|
|
75
|
+
<ImplementationMap files={[
|
|
76
|
+
{ path: "release/scope-4.2.md", change: "added", note: "Final scope and cut list" },
|
|
77
|
+
{ path: "app/version.json", change: "modified", note: "Version 4.2.0, build number" },
|
|
78
|
+
]} />
|
|
79
|
+
|
|
80
|
+
### Freeze and regression {#freeze}
|
|
81
|
+
|
|
82
|
+
<Checklist title="Freeze tasks" items={[
|
|
83
|
+
{ label: "Branch protection on the release branch" },
|
|
84
|
+
{ label: "Changelog assembled from merged pull requests" },
|
|
85
|
+
]} />
|
|
86
|
+
|
|
87
|
+
<ImplementationMap files={[
|
|
88
|
+
{ path: "CHANGELOG.md", change: "modified", note: "User-facing 4.2 notes" },
|
|
89
|
+
]} />
|
|
90
|
+
|
|
91
|
+
### QA and soak {#qa}
|
|
92
|
+
|
|
93
|
+
<Checklist title="QA tasks" items={[
|
|
94
|
+
{ label: "Run regression on 12 devices" },
|
|
95
|
+
{ label: "Two day internal soak with 80 staff phones" },
|
|
96
|
+
{ label: "Upgrade test from 4.0 and 4.1 builds" },
|
|
97
|
+
]} />
|
|
98
|
+
|
|
99
|
+
<ImplementationMap files={[
|
|
100
|
+
{ path: "qa/device-matrix.csv", change: "modified", note: "Devices and OS versions covered" },
|
|
101
|
+
{ path: "qa/soak-report.md", change: "added", note: "Crash and battery numbers" },
|
|
102
|
+
]} />
|
|
103
|
+
|
|
104
|
+
### Staged rollout {#staged}
|
|
105
|
+
|
|
106
|
+
<Checklist title="Staged rollout tasks" items={[
|
|
107
|
+
{ label: "Release to 5 percent, watch for 24 hours" },
|
|
108
|
+
{ label: "Raise to 25 percent after the metric check" },
|
|
109
|
+
]} />
|
|
110
|
+
|
|
111
|
+
<ImplementationMap files={[
|
|
112
|
+
{ path: "ops/rollout-dashboard.json", change: "added", note: "Crash-free, ANR, rating and support volume" },
|
|
113
|
+
]} />
|
|
114
|
+
|
|
115
|
+
### Full rollout {#full}
|
|
116
|
+
|
|
117
|
+
<Checklist title="Full rollout tasks" items={[
|
|
118
|
+
{ label: "Raise to 100 percent" },
|
|
119
|
+
{ label: "Send the announcement and update the help center" },
|
|
120
|
+
]} />
|
|
121
|
+
|
|
122
|
+
<ImplementationMap files={[
|
|
123
|
+
{ path: "comms/announcement.md", change: "added", note: "Blog post and in-app message" },
|
|
124
|
+
]} />
|
|
125
|
+
|
|
126
|
+
### Retro {#retro}
|
|
127
|
+
|
|
128
|
+
<Checklist title="Retro tasks" items={[
|
|
129
|
+
{ label: "Compare stage metrics with the forecast" },
|
|
130
|
+
{ label: "Record what to change in the next release" },
|
|
131
|
+
]} />
|
|
132
|
+
|
|
133
|
+
## Agent trail
|
|
134
|
+
|
|
135
|
+
<AgentTrail />
|
|
136
|
+
|
|
137
|
+
## Communications
|
|
138
|
+
|
|
139
|
+
<Table title="Comms plan" columns={["When", "Audience", "Channel", "Owner", "Message"]} rows={[
|
|
140
|
+
["Mon 9 Nov", "Internal", "Team chat", "Priya", "Freeze done, scope final"],
|
|
141
|
+
["Wed 11 Nov", "Support", "Briefing and macros", "Lena", "What changed, known issues, escalation path"],
|
|
142
|
+
["Thu 12 Nov", "Early users", "In-app note at 5 percent", "Tomas", "New onboarding is rolling out"],
|
|
143
|
+
["Sat 14 Nov", "All users", "Blog post and store notes", "Marta (marketing)", "Offline maps are here"],
|
|
144
|
+
["On rollback", "Everyone affected", "Status page and in-app banner", "On-call lead", "What happened, what we did, next update time"],
|
|
145
|
+
]} />
|
|
146
|
+
|
|
147
|
+
## Rollback
|
|
148
|
+
|
|
149
|
+
<Callout tone="warning" title="Halt and rollback rules">
|
|
150
|
+
|
|
151
|
+
Halt the rollout if crash-free sessions drop below 99.5 percent, ANR rate exceeds 0.5 percent, or support volume doubles against baseline for two hours. First action: switch the affected flag off (under 5 minutes, no build needed). If a bug lives outside a flag: halt the store rollout and ship 4.2.1 as a hotfix, target within 24 hours. Users who already updated cannot be downgraded, so hotfix speed matters more than a revert.
|
|
152
|
+
|
|
153
|
+
</Callout>
|
|
154
|
+
|
|
155
|
+
## Risks
|
|
156
|
+
|
|
157
|
+
<Table title="Risk register" columns={["Risk", "Likelihood", "Impact", "Mitigation"]} rows={[
|
|
158
|
+
["Offline maps exhaust device storage", "Medium", "High", "Storage warning, 500 MB cap, flag off switch"],
|
|
159
|
+
["Store review delays the first stage", "Medium", "Medium", "Submit on Tuesday, keep two days of slack"],
|
|
160
|
+
["Onboarding change lowers signup completion", "Low", "High", "A/B at 5 percent, compare funnel before widening"],
|
|
161
|
+
["Support overwhelmed on launch day", "Medium", "Medium", "Macros ready, extra shift on Saturday"],
|
|
162
|
+
]} />
|
|
163
|
+
|
|
164
|
+
## Open questions
|
|
165
|
+
|
|
166
|
+
<QuestionForm title="Open Questions" questions={[
|
|
167
|
+
{ title: "Do we announce before or after the 100 percent step?", mode: "single", options: [
|
|
168
|
+
{ label: "After, once metrics are stable", recommended: true }, { label: "At the 25 percent step" } ] },
|
|
169
|
+
{ title: "Who holds the go/no-go vote?", mode: "single", options: [
|
|
170
|
+
{ label: "Release manager with QA and support", recommended: true }, { label: "Product lead alone" } ] },
|
|
171
|
+
{ title: "Which extra checks join the gate?", mode: "multi", options: [
|
|
172
|
+
{ label: "Accessibility pass" }, { label: "Battery benchmark" }, { label: "Privacy review of new permissions" } ] },
|
|
173
|
+
]} />
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/release/standard.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Beacon Mobile 4.2 Release
|
|
2
|
+
|
|
3
|
+
> Template guidance: replace the invented product, version, scope, thresholds and owners. Keep the go/no-go gate and rollback section. All names and numbers are invented.
|
|
4
|
+
|
|
5
|
+
**Status:** draft
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Ship Beacon Mobile 4.2 (offline maps and a new onboarding) to all users within five days of code freeze, with crash-free sessions at or above 99.5 percent at every stage.
|
|
10
|
+
|
|
11
|
+
- Release candidate frozen on Monday 9 Nov, full rollout by Friday 13 Nov.
|
|
12
|
+
- No stage widens while a blocking metric is red.
|
|
13
|
+
- Support and marketing know the final scope 48 hours before the first stage.
|
|
14
|
+
|
|
15
|
+
## Scope
|
|
16
|
+
|
|
17
|
+
| Item | Type | Owner | Status | Flag |
|
|
18
|
+
|---|---|---|---|---|
|
|
19
|
+
| Offline maps for saved regions | Feature | Priya | Done | offline_maps |
|
|
20
|
+
| New onboarding with three steps | Feature | Tomas | In QA | onboarding_v2 |
|
|
21
|
+
| Fix: location drift in background mode | Fix | Lena | Done | none |
|
|
22
|
+
| Dark theme for the settings screen | Polish | Tomas | Done | none |
|
|
23
|
+
| Route sharing by link | Feature | Priya | Cut to 4.3 | route_share |
|
|
24
|
+
|
|
25
|
+
## Decision
|
|
26
|
+
|
|
27
|
+
| Question | Options | Recommendation | Why |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| How do we roll out? | Staged 5/25/100 / full at once / two week open beta | **Staged: 5, 25, 100 percent** | Early signal, small blast radius, flags switch features off without a new build |
|
|
30
|
+
|
|
31
|
+
## Rollout
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
flowchart LR
|
|
35
|
+
A[Code freeze Mon] --> B[QA and soak Tue-Wed]
|
|
36
|
+
B --> C{Go / No-go Wed 16:00}
|
|
37
|
+
C -- go --> D[5 percent Thu 09:00]
|
|
38
|
+
C -- no-go --> X[Fix and re-cut RC]
|
|
39
|
+
D --> E{24h metrics ok?}
|
|
40
|
+
E -- yes --> F[25 percent Fri 09:00]
|
|
41
|
+
E -- no --> R[Halt and roll back flags]
|
|
42
|
+
F --> G{24h metrics ok?}
|
|
43
|
+
G -- yes --> H[100 percent Sat 09:00]
|
|
44
|
+
G -- no --> R
|
|
45
|
+
H --> I[Retro Mon]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Go / no-go gate (Wednesday 16:00)
|
|
49
|
+
|
|
50
|
+
- [x] All scope items Done or explicitly cut
|
|
51
|
+
- [ ] Release candidate passed the regression suite on 12 devices
|
|
52
|
+
- [ ] No open blocker or critical bug
|
|
53
|
+
- [ ] Crash-free sessions on the internal soak build at 99.7 percent or higher
|
|
54
|
+
- [ ] Feature flags verified on and off in staging
|
|
55
|
+
- [ ] Store listing, screenshots and release notes approved
|
|
56
|
+
- [ ] Support macros and the known-issues list published
|
|
57
|
+
- [ ] Rollback rehearsed: flags off and store halt tested
|
|
58
|
+
|
|
59
|
+
## Work items
|
|
60
|
+
|
|
61
|
+
- [x] Cut route sharing to 4.3
|
|
62
|
+
- [ ] Tag release candidate and bump version to 4.2.0
|
|
63
|
+
- [ ] Assemble changelog from merged pull requests
|
|
64
|
+
- [ ] Run regression on 12 devices, two day internal soak, upgrade tests from 4.0 and 4.1
|
|
65
|
+
- [ ] Release to 5 percent, check metrics, raise to 25 percent, then 100 percent
|
|
66
|
+
- [ ] Send the announcement and update the help center
|
|
67
|
+
- [ ] Retro: compare stage metrics with the forecast
|
|
68
|
+
|
|
69
|
+
## Communications
|
|
70
|
+
|
|
71
|
+
| When | Audience | Channel | Owner | Message |
|
|
72
|
+
|---|---|---|---|---|
|
|
73
|
+
| Mon 9 Nov | Internal | Team chat | Priya | Freeze done, scope final |
|
|
74
|
+
| Wed 11 Nov | Support | Briefing and macros | Lena | What changed, known issues, escalation path |
|
|
75
|
+
| Thu 12 Nov | Early users | In-app note at 5 percent | Tomas | New onboarding is rolling out |
|
|
76
|
+
| Sat 14 Nov | All users | Blog post and store notes | Marta (marketing) | Offline maps are here |
|
|
77
|
+
| On rollback | Everyone affected | Status page and in-app banner | On-call lead | What happened, what we did, next update time |
|
|
78
|
+
|
|
79
|
+
## Rollback
|
|
80
|
+
|
|
81
|
+
Halt the rollout if crash-free sessions drop below 99.5 percent, ANR rate exceeds 0.5 percent, or support volume doubles against baseline for two hours. First action: switch the affected flag off (under 5 minutes, no build). If the bug lives outside a flag: halt the store rollout and ship 4.2.1 as a hotfix within 24 hours. Users who already updated cannot be downgraded.
|
|
82
|
+
|
|
83
|
+
## Risks
|
|
84
|
+
|
|
85
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
86
|
+
|---|---|---|---|
|
|
87
|
+
| Offline maps exhaust device storage | Medium | High | Storage warning, 500 MB cap, flag off switch |
|
|
88
|
+
| Store review delays the first stage | Medium | Medium | Submit on Tuesday, keep two days of slack |
|
|
89
|
+
| Onboarding change lowers signup completion | Low | High | A/B at 5 percent, compare funnel before widening |
|
|
90
|
+
| Support overwhelmed on launch day | Medium | Medium | Macros ready, extra shift on Saturday |
|
|
91
|
+
|
|
92
|
+
## Open questions
|
|
93
|
+
|
|
94
|
+
- Announce before or after the 100 percent step? After, once metrics are stable (recommended) / at 25 percent
|
|
95
|
+
- Who holds the go/no-go vote? Release manager with QA and support (recommended) / product lead alone
|
|
96
|
+
- Extra gate checks? Accessibility pass / battery benchmark / privacy review of new permissions
|
package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/research/meta.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"research","label":"Research memo","description":"A decision memo with the question, compared options, an evidence table, a recommendation and open questions.","useWhen":"You must choose between options and want the evidence and the recommendation reviewed before anyone builds.","hasBoard":false}
|