M1-01: Repo scaffold and build standard #1

Closed
opened 2026-08-06 10:53:39 -04:00 by agent · 2 comments
Member

Stand up stash-ios so everything after this has somewhere to land.

Scope

  • project.yml for XcodeGen — the .xcodeproj is generated, not committed, so project
    structure is reviewable as a diff instead of an unreadable pbxproj blob.
  • A minimal SwiftUI app that launches in the simulator and does nothing else.
  • AGENTS.md — the build standard, and the single source of truth (see below).
  • CLAUDE.md — one line: @AGENTS.md. No symlink; Claude Code resolves the import natively
    and Codex reads AGENTS.md directly. One file to maintain, nothing to drift.
  • README.md — what it is, how to build, how to run.
  • .gitignore, .swiftlint.yml.

⚠️ This repository is PUBLIC

Both stash-ios and stash-docs are public. This has to be stated loudly at the top of
both README.md and AGENTS.md, because it changes what may ever be committed:

  • No secrets, tokens, API keys, signing certificates or provisioning profiles.
  • No personal audio, transcripts, or vault content — not in fixtures, not in tests, not in
    screenshots attached to issues.
  • No internal hostnames or infrastructure detail beyond what is already public.
  • Test fixtures are synthetic. If a real recording would make a better fixture, generate an
    equivalent one instead.

What AGENTS.md must state

Wes's build standard, in his words where his framing is the requirement:

  • Every issue gets a feature branch. main is protected; only Wes approves.
  • "The goal should be that a PR review could be done in 15 to 20 minutes." Small,
    feature-sized, incremental. Not thousands of lines.
  • Nothing gets a PR until it has been tested — on the device where the issue says so.
  • "You will, 100%, keep documentation up to date on every commit. I will fail PRs if docs
    aren't updated along the way. And if the code is hard to read, same thing."
  • "Error messages must be helpful. It must be. No option."
  • "I don't want to see anything about timelines in any of the documentation anywhere."
    Agentic development does not run at human pace and the estimates are always wrong.
  • "We're gonna choose reliability and simplicity over fanciness."
  • "I would much prefer system standards for UI over having our own custom special UI."

Done when

The app builds and launches in the simulator from a fresh clone, and AGENTS.md is complete
enough that someone could pick up issue 02 without this conversation.

Milestone 1 of the Stash v3 rebuild, scoped 2026-08-06. M1 is a functioning iOS app on Wes's
phone with no sync at all — the entire goal is recording voice memos reliably and getting
them off the device by hand. Sync arrives in M3.

Working agreement for every issue in this repo: feature branch, tested before the PR opens
(on-device where the label says so), then Wes reviews the PR and we walk the code together.
Docs update in the same commit. A PR that takes more than 20 minutes to review is too big —
say so and split it.

Stand up `stash-ios` so everything after this has somewhere to land. ## Scope - `project.yml` for **XcodeGen** — the `.xcodeproj` is generated, not committed, so project structure is reviewable as a diff instead of an unreadable pbxproj blob. - A minimal SwiftUI app that launches in the simulator and does nothing else. - `AGENTS.md` — the build standard, and the single source of truth (see below). - `CLAUDE.md` — one line: `@AGENTS.md`. No symlink; Claude Code resolves the import natively and Codex reads `AGENTS.md` directly. One file to maintain, nothing to drift. - `README.md` — what it is, how to build, how to run. - `.gitignore`, `.swiftlint.yml`. ## ⚠️ This repository is PUBLIC **Both `stash-ios` and `stash-docs` are public.** This has to be stated loudly at the top of both `README.md` and `AGENTS.md`, because it changes what may ever be committed: - No secrets, tokens, API keys, signing certificates or provisioning profiles. - No personal audio, transcripts, or vault content — not in fixtures, not in tests, not in screenshots attached to issues. - No internal hostnames or infrastructure detail beyond what is already public. - Test fixtures are synthetic. If a real recording would make a better fixture, generate an equivalent one instead. ## What `AGENTS.md` must state Wes's build standard, in his words where his framing *is* the requirement: - Every issue gets a feature branch. `main` is protected; only Wes approves. - **"The goal should be that a PR review could be done in 15 to 20 minutes."** Small, feature-sized, incremental. Not thousands of lines. - Nothing gets a PR until it has been tested — on the device where the issue says so. - **"You will, 100%, keep documentation up to date on every commit. I will fail PRs if docs aren't updated along the way. And if the code is hard to read, same thing."** - **"Error messages must be helpful. It must be. No option."** - **"I don't want to see anything about timelines in any of the documentation anywhere."** Agentic development does not run at human pace and the estimates are always wrong. - **"We're gonna choose reliability and simplicity over fanciness."** - **"I would much prefer system standards for UI over having our own custom special UI."** ## Done when The app builds and launches in the simulator from a fresh clone, and `AGENTS.md` is complete enough that someone could pick up issue 02 without this conversation. --- *Milestone 1 of the Stash v3 rebuild, scoped 2026-08-06. M1 is a functioning iOS app on Wes's phone with **no sync at all** — the entire goal is recording voice memos reliably and getting them off the device by hand. Sync arrives in M3.* *Working agreement for every issue in this repo: feature branch, tested before the PR opens (on-device where the label says so), then Wes reviews the PR and we walk the code together. Docs update in the same commit. A PR that takes more than 20 minutes to review is too big — say so and split it.*
Author
Member

Branch m1-01-repo-scaffold, one commit, ready for a PR.

What's in it

  • project.yml — XcodeGen. The .xcodeproj is gitignored and generated. Swift 6 language mode, complete strict concurrency, warnings as errors.
  • Stash/StashApp.swift and a ContentView that draws a waveform glyph and the word Stash. Nothing else.
  • Stash/Assets.xcassets — the amethyst #9966CC accent, and the moustache-over-waveform app icon carried over unchanged from the archived app.
  • AGENTS.md — the build standard, with the public-repository warning as the first thing on the page. Feature branch per issue, the 15–20 minute PR rule, tested-before-PR (device where the label says so), docs in the same commit, helpful error messages, no timelines anywhere, reliability over fanciness, system-standard UI, decisions recorded in stash-docs. Your framing is quoted where the wording is the requirement.
  • CLAUDE.md — one line, @AGENTS.md.
  • README.md — same public warning at the top, then what it is, how to build, how to run.
  • .gitignore, .swiftlint.yml.

What I validated

Cloned the branch fresh into an empty directory and ran the full path from nothing:

  1. xcodegen generate — project created, no .xcodeproj in the clone beforehand.
  2. swiftlint lint --strict — 0 violations in 2 files.
  3. xcodebuild -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max'BUILD SUCCEEDED.
  4. Booted the iPhone 17 Pro Max simulator, installed the .app, launched today.wes.stash. It came up as pid 41348 and was still alive in launchctl list afterwards, so it launched rather than launching-and-crashing. Screenshot shows the amethyst tint resolving through AccentColor.

I also confirmed the guardrails do what they claim rather than just being set: an unused-variable warning fails the build (error: initialization of immutable value 'unused' was never used), and the staged tree carries zero .xcodeproj paths.

What I did not validate

  • Nothing has run on a physical device. No signing identity is configured here and none belongs in a public repo, so this is simulator-only.
  • There are no tests. No test target exists yet — the scaffold has no behaviour to test, and I didn't add a target for the sake of having one.
  • The app icon compiles into the catalog, but I did not check how it renders on a home screen.

Leaving this open for you.

Branch `m1-01-repo-scaffold`, one commit, ready for a PR. **What's in it** - `project.yml` — XcodeGen. The `.xcodeproj` is gitignored and generated. Swift 6 language mode, complete strict concurrency, warnings as errors. - `Stash/` — `StashApp.swift` and a `ContentView` that draws a waveform glyph and the word Stash. Nothing else. - `Stash/Assets.xcassets` — the amethyst `#9966CC` accent, and the moustache-over-waveform app icon carried over unchanged from the archived app. - `AGENTS.md` — the build standard, with the public-repository warning as the first thing on the page. Feature branch per issue, the 15–20 minute PR rule, tested-before-PR (device where the label says so), docs in the same commit, helpful error messages, no timelines anywhere, reliability over fanciness, system-standard UI, decisions recorded in `stash-docs`. Your framing is quoted where the wording is the requirement. - `CLAUDE.md` — one line, `@AGENTS.md`. - `README.md` — same public warning at the top, then what it is, how to build, how to run. - `.gitignore`, `.swiftlint.yml`. **What I validated** Cloned the branch fresh into an empty directory and ran the full path from nothing: 1. `xcodegen generate` — project created, no `.xcodeproj` in the clone beforehand. 2. `swiftlint lint --strict` — 0 violations in 2 files. 3. `xcodebuild -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max'` — **BUILD SUCCEEDED**. 4. Booted the iPhone 17 Pro Max simulator, installed the `.app`, launched `today.wes.stash`. It came up as pid 41348 and was still alive in `launchctl list` afterwards, so it launched rather than launching-and-crashing. Screenshot shows the amethyst tint resolving through `AccentColor`. I also confirmed the guardrails do what they claim rather than just being set: an unused-variable warning fails the build (`error: initialization of immutable value 'unused' was never used`), and the staged tree carries zero `.xcodeproj` paths. **What I did not validate** - **Nothing has run on a physical device.** No signing identity is configured here and none belongs in a public repo, so this is simulator-only. - **There are no tests.** No test target exists yet — the scaffold has no behaviour to test, and I didn't add a target for the sake of having one. - The app icon compiles into the catalog, but I did not check how it renders on a home screen. Leaving this open for you.
Owner

This has been resolved

This has been resolved
wk closed this issue 2026-08-06 14:30:40 -04:00
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Stash/stash-ios#1
No description provided.