Files
zeekay 079c63f6cb Add the iOS lane: hanzo-templates had zero of them
The catalogue shipped 71 web templates and one EMPTY `mobile` repo, so
"build an app" had no starting point on the platform people actually
ship to. This is the iOS lane — Expo/React Native and Flutter for
cross-platform, SwiftUI for native.

The constraint that shaped every file here: an iOS archive needs macOS +
Xcode + a signing identity, and our arc fleet has none. hanzoai has 519
registered runners and every one reports `os: linux`; luxfi has 151, same
story; zooai has none. The only macOS builds in the org today
(hanzoai/world build-desktop.yml) run on GitHub-HOSTED macos-14, which is
exactly what the house CI rule says not to do.

So `hanzo.yml` declares only what a Linux arc runner can genuinely
execute — typecheck + web bundle for Expo, analyze + test + web for
Flutter, `swiftc -parse` for SwiftUI — and the macOS archive lives in a
separate `workflow_dispatch`-only `ios.yml`. A job pinned to a label no
runner advertises would sit queued forever if it fired on push; parking
it is honest, a permanently-yellow check is not. The README of every
template states the gap and the one command that closes it.

Same reasoning on the demos. Expo and Flutter both have a real web
target, so `<slug>.hanzo.app` serves the SAME source the simulator runs.
SwiftUI has no web target, so those two templates ship with no demo link
rather than a screenshot pretending to be one.

Upstreams are permissive only and recorded per template: expo/expo
templates (MIT), flutter/samples (BSD-3-Clause), XcodeGen (MIT).

Second measured gap, found while wiring this up: `hanzo-templates` is not in
arcd's `orgs:` list either (hanzoai, luxfi, zooai, parsdao, zenlm), so the
Linux jobs would queue with no runner too. Both gaps are one installer
re-run, no code change; both are spelled out in every README rather than
left to be discovered on the first red build.

Third gap, found by probing rather than assuming, and FIXED here: every
run in this org died as `startup_failure` with no logs and no annotation.
A bare `runs-on: [self-hosted, linux]` probe queued fine while the same
job importing hanzoai/ci failed identically at @v1 and at a pinned SHA —
so it was never the tag. The org defaulted GITHUB_TOKEN to `read`, and
the reusable declares `permissions: packages: write`; a caller cannot
exceed the org maximum, so GitHub kills the run before creating a job.
hanzo-templates now defaults to `write` like hanzoai/luxfi/zooai, and
runs reach `queued` — the honest state, waiting on gap 2.
2026-07-27 23:25:30 -07:00

35 lines
2.2 KiB
Swift

import Foundation
/// Local seed data. Swap `Item.all` for a URLSession call against your own /v1
/// API — the views only depend on the Item shape, not on where it came from.
struct Item: Identifiable, Hashable, Sendable {
let id: String
let title: String
let tag: String
let blurb: String
let body: String
static let all: [Item] = [
Item(id: "declarative",
title: "The view is a function of state",
tag: "swiftui",
blurb: "You never mutate a view; you change state and it is recomputed.",
body: "A SwiftUI view is a lightweight value type, recreated on every state change and diffed against the previous tree. That is why `body` must be cheap and free of side effects — it runs far more often than a UIKit `viewDidLoad` ever did."),
Item(id: "observation",
title: "@Observable over ObservableObject",
tag: "observation",
blurb: "Swift 5.9's macro tracks the properties a view actually read.",
body: "ObservableObject invalidated every observer on any @Published change. @Observable records per-property reads during body evaluation, so a view that reads only `title` does not redraw when `count` changes. Fewer invalidations, no @Published bookkeeping."),
Item(id: "concurrency",
title: "Structured concurrency, checked at compile time",
tag: "swift 6",
blurb: "`.task {}` cancels itself when the view goes away.",
body: "Strict concurrency checking makes data races a compile error rather than a crash report. A `.task` modifier ties an async job to the view's lifetime, so navigating away cancels the request instead of leaking it."),
Item(id: "toolchain",
title: "Native means the Apple toolchain",
tag: "xcode",
blurb: "No JS runtime, no renderer of our own — and no Linux build.",
body: "SwiftUI is a closed-source Apple framework that exists only in the iOS/macOS SDKs. Nothing about this target can be compiled on a Linux runner, which is exactly why the CI in this repo is split the way it is. See the README."),
]
}