Skip to content

Commit dc69d08

Browse files
authored
Document main-based feature workflow (#40)
## Summary - replace the completed dev integration branch with focused feature branches from main - record the workflow as ADR 0052 - update contribution and Voice planning documents without changing release authorization ## Verification - full repository check passed before publication - signed macOS app build verified and installed This PR changes documentation only.
1 parent 7e7a86d commit dc69d08

10 files changed

Lines changed: 85 additions & 31 deletions

.github/workflows/codeql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ concurrency:
2222

2323
jobs:
2424
analyze:
25-
name: Analyze (swift)
25+
name: CodeQL
2626
runs-on: macos-26
2727
timeout-minutes: 45
2828
steps:

CONTRIBUTING.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,9 @@ GitHub requests review from the repository owner. Automated verification must
4545
pass, review threads must be resolved, and accepted changes are squash-merged.
4646
The `Analyze (swift)` gate performs an extended CodeQL scan when Swift or its
4747
build inputs change and completes without compiling Swift for unrelated
48-
changes. During the accepted Voice program, focused pull requests target
49-
`dev`; `dev` returns to `main` only after the completed program receives final
50-
user verification. See
51-
[`0029_local_voice_platform_expansion.md`](docs/decisions/0029_local_voice_platform_expansion.md).
48+
changes. Create each focused branch from current `main` and target its pull
49+
request at `main`. See
50+
[`0052_main_feature_branch_workflow.md`](docs/decisions/0052_main_feature_branch_workflow.md).
5251

5352
## Privacy and hardware evidence
5453

docs/decisions/0029_local_voice_platform_expansion.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
- **Status:** Accepted; macOS M1–M12 implemented
44
- **Date:** 2026-08-25
5+
- **Branch workflow superseded by:**
6+
[`0052_main_feature_branch_workflow.md`](0052_main_feature_branch_workflow.md)
57
- **Amends:**
68
[`0001_native_macos_stack.md`](0001_native_macos_stack.md),
79
[`0005_app_owned_transcription.md`](0005_app_owned_transcription.md), and

docs/decisions/0051_unreleased_voice_integration_build.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
**Status:** Accepted
44

5+
**Branch workflow superseded by:**
6+
[decision 0052](0052_main_feature_branch_workflow.md)
7+
58
## Context
69

710
The accepted Voice program is integrated into `dev`, including the macOS Voice
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Decision 0052: Integrate focused feature branches through main
2+
3+
**Status:** Accepted
4+
5+
**Date:** 2026-08-28
6+
7+
**Supersedes:** The `dev` integration-branch workflow in
8+
[decision 0029](0029_local_voice_platform_expansion.md) and the execution
9+
instructions derived from it. Release approval remains unchanged.
10+
11+
## Context
12+
13+
The accepted Voice program completed on `dev`. Keeping a permanent integration
14+
branch after that program finished would duplicate the default branch, require
15+
manual promotion, and let documentation or fixes drift between two long-lived
16+
lines. The user directed future work to use individual feature branches from
17+
`main` and to remove `dev` without losing its reviewed history.
18+
19+
| Criterion | Focused branches into `main` | Permanent `dev` integration branch |
20+
| --- | ---: | ---: |
21+
| One current integration line | 5 | 2 |
22+
| Required-check visibility | 5 | 5 |
23+
| Risk of branch drift | 5 | 2 |
24+
| Focused review and rollback | 5 | 5 |
25+
| Extra promotion ceremony | 5 | 1 |
26+
| **Total** | **25** | **15** |
27+
28+
## Decision
29+
30+
- Preserve the completed `dev` history through pull request 39 into `main`,
31+
verify the merge, then delete the local and remote `dev` branches.
32+
- Create each subsequent `codex/*` feature branch from the latest integrated
33+
`main` and target its focused pull request at `main`.
34+
- Merge only after required checks pass. Keep dependent work stacked when a
35+
repository rule prevents an immediate merge; do not bypass protections.
36+
- Keep behavior, tests, migrations, and documentation together when they form
37+
one vertical change. Split unrelated responsibilities into separate PRs.
38+
- Treat integration into `main` as source control only. It does not approve a
39+
tag, release version, DMG, GitHub Release, notarization, App Store submission,
40+
or public binary.
41+
42+
## Consequences
43+
44+
- `main` is the only long-lived integration branch.
45+
- Completed program history remains reachable through the preservation merge
46+
and its original pull requests.
47+
- Current documentation no longer describes a pending `dev` promotion gate.
48+
- Release metadata and distribution remain separately and explicitly gated.

docs/game_plan.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ evidence is retained in [`release_validation.md`](release_validation.md).
4747

4848
## Approved next program
4949

50-
The local Voice expansion is accepted and integrated into `dev`: macOS M1–M15,
50+
The local Voice expansion is accepted and integrated into `main`: macOS M1–M15,
5151
iOS Gate K0, I1 local onboarding and Model admission, I2 local formatting and
5252
History, Style-qualified keyboard delivery, target-safe field handling, I7
5353
lifecycle recovery, I8 stale-service recovery, I9 bounded insertion recovery,
@@ -63,9 +63,10 @@ The acceptance and execution authorities are:
6363
| [`voice_platform_design.md`](voice_platform_design.md) | Model, runtime, iOS keyboard, storage, performance, and milestone design. |
6464
| [`voice_implementation_goal_prompt.md`](voice_implementation_goal_prompt.md) | Autonomous worktree/PR execution contract and definition of done. |
6565

66-
Focused vertical PRs are integrated into `dev`. `main`, tags, distribution
67-
artifacts, and store submission remain unchanged until the user verifies the
68-
finished `dev` state and separately approves promotion.
66+
New work uses focused feature branches from `main` and pull requests back into
67+
`main`. Tags, distribution artifacts, and store submission remain separately
68+
gated. See
69+
[`decisions/0052_main_feature_branch_workflow.md`](decisions/0052_main_feature_branch_workflow.md).
6970

7071
## Quality gates
7172

docs/open_questions.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Current behavior remains unchanged until the accepted roadmap ships.
5353
| --- | --- |
5454
| Product boundary | Add Voice to the existing Hardware Controller macOS app; create no second macOS product. |
5555
| Repository | Use one repository with incremental `apps/`, Rust crate, Apple support, schema, and CUJ boundaries. |
56-
| Delivery | Start with M1 and proceed CUJ-by-CUJ through focused worktree PRs into `dev`; keep `main` gated on final user verification. |
56+
| Delivery | Use focused feature branches from current `main` and pull requests back into `main`; keep release promotion separately gated. |
5757
| History | Retain transcripts until deletion; cap successful audio by accepted age, byte, and artifact-count defaults; retain recoverable partials for 24 hours; import bounded local recordings into one app-owned CAF without changing the source. |
5858
| Local-only | Permit explicit verified Model-package downloads containing no Voice data; exclude Voice data from app sync/backup where supported; add no accounts, telemetry, cloud inference, or remote storage. |
5959
| Models | Use separate ASR and optional formatting stages with deterministic edits, validation, and Raw/Edited fallback; delegate provider/package choice to measured evidence. |
@@ -63,4 +63,4 @@ Current behavior remains unchanged until the accepted roadmap ships.
6363

6464
No unresolved user choice blocks the implementation goal. K0 signed-device,
6565
model, performance, and App Review checks are evidence gates that must not stop
66-
independent work. Release promotion and `dev``main` remain separately gated.
66+
independent work. Release promotion remains separately gated.

docs/voice_cujs.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,6 @@ The user accepted on 2026-08-25:
595595
5. Gate K0 and an honest cold-start/app-switch experience; and
596596
6. benchmark-selected deployment floors and Model packages.
597597

598-
These choices do not approve release promotion or `dev``main`. Model,
598+
These choices do not approve release promotion. Model,
599599
signed-device, and App Review findings are implementation evidence, not new
600600
preference questions.

docs/voice_implementation_goal_prompt.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Create and pursue a goal with no token budget to implement the accepted local
99
Voice platform roadmap to polished completion. Incur no monetary cost: do not
1010
purchase services, models, subscriptions, hardware, certificates, or paid build
1111
capacity. Continue autonomously until every safe, in-scope macOS and iOS
12-
requirement is implemented, verified, documented, and integrated into the dev
12+
requirement is implemented, verified, documented, and integrated into the main
1313
branch. Do not stop merely because the work is large, slow, spans many pull
1414
requests, or encounters an evidence gap.
1515
@@ -47,20 +47,20 @@ Operating mode:
4747
or prototype web/mobile web in this program.
4848
4949
Git and pull-request workflow:
50-
- Use dev as the integration branch. If it does not exist, create it from the
51-
current main without modifying main.
52-
- Implement every logical slice on a new codex/voice_* branch in its own Git
53-
worktree. Base it on the latest integrated dev state.
50+
- Use main as the integration branch.
51+
- Implement every logical slice on a new codex/voice_* branch from the latest
52+
integrated main state. Use a separate Git worktree when slices run in
53+
parallel.
5454
- Each PR must be focused and vertically useful: acceptance/docs, behavioral
5555
test, implementation, migration, and verification for one coherent slice.
5656
Avoid giant PRs, layer-only batches, unrelated cleanup, and artificial
5757
one-file PRs.
58-
- Target every program PR at dev. Merge it after required checks pass when
58+
- Target every program PR at main. Merge it after required checks pass when
5959
repository policy permits. If policy requires unavailable human review, keep
6060
dependent work in explicit stacked PRs and continue without bypassing it.
6161
- Keep PR descriptions concise: CUJs covered, architecture decision, tests and
6262
measurements, migrations, risks, and rollback/recovery behavior.
63-
- Never push directly to main or merge dev into main. Do not change release
63+
- Never push directly to main. Do not change release
6464
versions/build numbers, create tags, DMGs, GitHub Releases, App Store
6565
submissions, or release records without separate explicit approval.
6666
@@ -108,7 +108,7 @@ Testing strategy—strong but adaptable:
108108
complete quality/performance matrix before final handoff.
109109
110110
Program sequence:
111-
1. Integrate the approved planning/decision/CUJ baseline and establish dev/CI.
111+
1. Integrate the approved planning/decision/CUJ baseline and establish CI.
112112
2. Deliver the macOS M1 tracer inside the existing Hardware Controller app.
113113
3. Complete macOS capture gestures, Styles, Dictionary, spoken edits, safe
114114
delivery, History, retention, recovery, imported audio, local enforcement,
@@ -136,7 +136,7 @@ Definition of done:
136136
latency, memory, energy, migrations, and failure paths meet the documented
137137
gates or have an evidence-backed documented adjustment preserving the product
138138
promise.
139-
- All required checks pass on dev. Every focused PR is merged to dev or, only
139+
- All required checks pass on main. Every focused PR is merged to main or, only
140140
where repository policy makes that impossible, is ready and explicitly
141141
ordered with no missing engineering work.
142142
- The canonical signed macOS development app is installed, verified, and
@@ -145,10 +145,10 @@ Definition of done:
145145
hardware.
146146
- README, product brief, architecture, game plan, CUJs, decisions, user guide,
147147
contributor guidance, troubleshooting, privacy, and release/install runbooks
148-
describe the finished dev state without stale proposal language.
148+
describe the finished main state without stale proposal language.
149149
- Final handoff is concise and includes: outcome, PR list, remaining external-
150150
owner evidence only, exact verification results, known limitations, and quick
151151
macOS/iOS installation and first-use instructions.
152-
- main remains untouched. Stop after dev is ready for my final verification and
153-
wait for explicit approval before proposing or performing dev → main.
152+
- Source integration into main does not approve release promotion. Wait for
153+
explicit approval before changing release metadata or publishing artifacts.
154154
```

docs/voice_platform_design.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -533,17 +533,18 @@ peak memory, installed size, and energy per audio minute.
533533

534534
## Program delivery and test balance
535535

536-
Use `dev` as the integration branch. Each coherent vertical slice uses a fresh
537-
`codex/voice_*` branch in a separate Git worktree and a focused pull request into
538-
`dev`. A slice includes its acceptance/documentation change, behavior test,
536+
Use `main` as the integration branch. Each coherent vertical slice uses a fresh
537+
`codex/voice_*` branch from current `main` and a focused pull request into
538+
`main`. A slice includes its acceptance/documentation change, behavior test,
539539
implementation, migration, and verification where those responsibilities change
540540
together. Do not use layer-only batches or unrelated cleanup to manufacture PR
541541
boundaries.
542542

543-
Merge a PR to `dev` after required checks pass when repository policy permits.
543+
Merge a PR to `main` after required checks pass when repository policy permits.
544544
If policy requires unavailable human review, keep later work in explicit stacked
545-
PRs without bypassing protections. `main` remains unchanged until the complete
546-
`dev` state receives user verification and separate merge approval.
545+
PRs without bypassing protections. Source integration does not approve release
546+
metadata, tags, packages, notarization, or store submission. See
547+
[`decisions/0052_main_feature_branch_workflow.md`](decisions/0052_main_feature_branch_workflow.md).
547548

548549
Testing uses four complementary levels:
549550

@@ -569,7 +570,7 @@ test first or batch the entire implementation behind mocked internals.
569570

570571
- Reconcile the accepted decision, canonical language, CUJ observations,
571572
retention defaults, and current source without reopening approved choices.
572-
- Establish `dev`, the per-PR worktree workflow, and required CI checks.
573+
- Establish focused branches from `main` and required CI checks.
573574
- Create the repository directory skeleton only as needed by the first test.
574575
- Add one failing, deterministic Mac CUJ M1 tracer test using a short sanitized
575576
audio fixture, fake capture clock, temporary repository, and fake delivery

0 commit comments

Comments
 (0)