diff --git a/.agents/skills/README.md b/.agents/skills/README.md
index 7e4fbde..9526dbe 100644
--- a/.agents/skills/README.md
+++ b/.agents/skills/README.md
@@ -1,26 +1,28 @@
# Repo-Local Skills
-This repo includes a curated subset of skills so a fresh agent can continue
-without depending on private product repositories.
+This repo owns project-specific skills and relies on the agent client's
+managed-global baseline for shared skills.
-## General Engineering Skills
+## Managed global
- `spec-creation-updating`
-- `apple-doc-research`
-- `swiftui-pro`
-- `swift-concurrency-pro`
-- `screenshot-analyze-verification`
- `harness-engineering`
- `xcode-build`
-- `swiftui-simulator-ui`
- `code-review`
- `ios-xcodegen`
- `xcode-cloud`
-- `apple-hig-designer`
-## Local to this repo
+These names must not be copied into any project skill root.
+
+## Project local
- `broker-harness-adoption`
+- `apple-doc-research`
+- `apple-hig-designer`
+- `screenshot-analyze-verification`
+- `swift-concurrency-pro`
+- `swiftui-pro`
+- `swiftui-simulator-ui`
Do not add private source snapshots, local machine paths, credentials, or
company-only task context to skill docs.
diff --git a/.agents/skills/code-review/SKILL.md b/.agents/skills/code-review/SKILL.md
deleted file mode 100644
index f823320..0000000
--- a/.agents/skills/code-review/SKILL.md
+++ /dev/null
@@ -1,118 +0,0 @@
----
-name: code-review
-description: Review pull requests, commits, or diffs for high-signal engineering issues and merge risk. Use when asked to review code, audit a patch, find bugs, or provide merge readiness feedback. Focus on defects introduced by the proposed changes (correctness, security, performance, reliability, and maintainability) and report actionable findings with severity, confidence, and precise code locations.
----
-
-# Code Review
-
-## Overview
-
-Run a high-signal review with a low false-positive rate.
-Prioritize issues the author would likely fix immediately if they knew.
-
-## Required Inputs
-
-- Changed code scope (PR, commit range, patch, or diff).
-- Author intent (PR title/description, ticket, or summary).
-- Project-specific rules if provided. Treat explicit local rules as higher priority than generic guidance.
-
-If intent or scope is missing, infer conservatively and state assumptions.
-
-## Workflow
-
-### 1. Triage Scope
-
-- Confirm what changed and where.
-- Focus on changed code first; use nearby context only when needed to validate impact.
-- Ignore mechanical noise unless it introduces risk.
-
-### 2. Run Multi-Pass Analysis
-
-- Pass A: Compile/runtime correctness (syntax, type use, imports, control flow).
-- Pass B: Security and data integrity (auth, validation, secret handling, unsafe defaults).
-- Pass C: Reliability and performance (resource leaks, blocking calls, hot-path regressions).
-- Pass D: API and compatibility impact (breaking behavior, migrations, version assumptions).
-- Pass E: Test and observability coverage for changed behavior.
-
-Use independent perspectives when possible, then merge only validated findings.
-
-### 3. Qualify Each Candidate Issue
-
-Keep a finding only if all checks pass:
-
-- Introduced by this change (not pre-existing debt).
-- Evidence-backed and reproducible from available context.
-- Meaningful impact on correctness, security, performance, reliability, or maintainability.
-- Discrete and actionable with a clear fix direction.
-- Not an intentional behavior change by the author.
-- Likely something the author would want to fix now.
-
-If confidence is low, drop the finding or convert it into an explicit question.
-
-### 4. Assign Severity and Confidence
-
-Use priority tags:
-
-- P0: Release-blocking or universally critical failure.
-- P1: Urgent and should be fixed in the next cycle.
-- P2: Important but not immediately blocking.
-- P3: Low urgency but valid and actionable.
-
-Add a confidence score from `0.0` to `1.0`.
-Default to reporting only high-confidence findings (for example, `>= 0.80`) unless the user asks for exhaustive mode.
-
-### 5. Write Findings
-
-Write one finding per distinct issue:
-
-- Title: `[Px]` plus a short imperative summary (`<= 80` chars).
-- Body: one paragraph explaining why this is a problem and when it occurs.
-- Evidence: exact file path with a minimal line range.
-- Fix direction: concise, concrete guidance (avoid large rewrites unless requested).
-- Confidence: numeric score.
-
-Keep tone factual and neutral. Avoid praise, blame, and style-only commentary.
-
-### 6. Provide Overall Verdict
-
-Always include:
-
-- `overall_correctness`: `patch is correct` or `patch is incorrect`.
-- `overall_explanation`: 1-3 sentences.
-- Residual risks or unreviewed areas, if any.
-
-If no qualified findings remain, explicitly state that no issues were found after high-signal filtering.
-
-## High-Signal Filter (Do Not Report)
-
-- Style-only nits or formatting-only concerns.
-- Speculative risks without clear evidence.
-- Issues outside changed scope unless the change clearly triggers them.
-- Broad "could be better" suggestions without defect impact.
-- Duplicate findings for the same root cause.
-- Company-specific process/policy violations unless those policies were explicitly provided for this review.
-
-## Output Template (Markdown)
-
-```markdown
-## Findings
-
-1. [P1]
-
-
-File: `path/to/file.ext:line`
-Confidence: 0.92
-Fix direction:
-
-## Overall correctness
-patch is incorrect
-
-<1-3 sentence explanation>
-
-## Residual risks
--
-```
-
-For detailed checklists and calibration rules, use:
-
-- `references/review-checklists.md`
diff --git a/.agents/skills/code-review/references/review-checklists.md b/.agents/skills/code-review/references/review-checklists.md
deleted file mode 100644
index fba8f09..0000000
--- a/.agents/skills/code-review/references/review-checklists.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Review Checklists
-
-Use this file when you need a stricter, repeatable review pass.
-
-## 1) Candidate-to-Finding Gate
-
-A candidate issue becomes a finding only if all are true:
-
-- [ ] Introduced by the proposed change.
-- [ ] High confidence it is real, not speculative.
-- [ ] Has meaningful impact (correctness, security, performance, reliability, maintainability).
-- [ ] Actionable by the author in a bounded scope.
-- [ ] Not obviously intentional based on PR context.
-- [ ] Supported by concrete code evidence and location.
-
-If any box is unchecked, do not report as a finding.
-
-## 2) False-Positive Suppressors
-
-Do not report these as findings:
-
-- Pre-existing defects not touched by the change.
-- Pedantic style comments that do not affect behavior.
-- "Might break" claims without a concrete failing path.
-- Suggestions that are only preference-based.
-- Issues likely handled by standard tooling, unless they still create a real shipped risk.
-- Duplicate observations of the same root cause.
-
-## 3) Severity Calibration (P0-P3)
-
-- P0: Critical, broadly harmful, blocks release/operation.
-- P1: High impact and urgent; should be fixed in next cycle.
-- P2: Real issue with moderate impact; should be scheduled.
-- P3: Low impact but valid and worth fixing.
-
-Quick test:
-
-- If failure is universal and severe, prefer P0-P1.
-- If failure depends on narrower conditions, prefer P2-P3.
-
-## 4) Confidence Calibration (0.0-1.0)
-
-- 0.90-1.00: Verified directly in changed code path.
-- 0.80-0.89: Strong evidence with minor assumptions.
-- 0.60-0.79: Plausible but missing key proof.
-- <0.60: Too uncertain; ask a question instead of filing a finding.
-
-Default reporting threshold: `>= 0.80`.
-
-## 5) Domain Sweep Checklist
-
-Check changed code for:
-
-- Correctness: logic errors, off-by-one, null/optional misuse, unreachable paths.
-- Security: authz/authn mistakes, secret leakage, unsafe parsing, injection vectors.
-- Data integrity: broken invariants, transaction gaps, partial updates.
-- Reliability: retries/timeouts, cancellation handling, cleanup on failure.
-- Performance: accidental N^2 paths, redundant I/O, main-thread blocking.
-- Concurrency: race conditions, shared mutable state, lock misuse.
-- Compatibility: API contract breaks, migration assumptions, backward incompatibilities.
-- Test coverage: changed behavior without meaningful verification.
-- Observability: no logs/metrics on critical new failure paths.
-
-## 6) Finding Quality Checklist
-
-Before finalizing each finding:
-
-- [ ] One issue per finding.
-- [ ] One short paragraph for explanation.
-- [ ] Clear "why this is a bug" statement.
-- [ ] Conditions under which it fails.
-- [ ] Minimal file/line location needed to act.
-- [ ] Tone is neutral and factual.
diff --git a/.agents/skills/harness-engineering/SKILL.md b/.agents/skills/harness-engineering/SKILL.md
deleted file mode 100644
index daf2871..0000000
--- a/.agents/skills/harness-engineering/SKILL.md
+++ /dev/null
@@ -1,78 +0,0 @@
----
-name: harness-engineering
-description: Build and improve agent-first engineering harnesses where AI agents perform most implementation work and humans steer architecture, constraints, and review. Use when defining or upgrading AGENTS.md rules, repository conventions, task decomposition, CI guardrails, merge strategy, quality gates, or cleanup loops to increase autonomous coding throughput and reliability.
----
-
-# Harness Engineering
-
-## Overview
-
-Use this skill to translate harness engineering principles into concrete repository changes that improve agent speed, correctness, and maintainability.
-
-## Workflow
-
-### 1) Assess the current harness
-
-- Inspect `AGENTS.md`, contributor docs, CI workflows, and repo scripts.
-- Map the actual path from prompt to merged change.
-- List concrete failure modes: ambiguous instructions, repeated mistakes, slow reviews, merge conflicts, stale docs, or noisy CI.
-
-### 2) Define operating boundaries
-
-- Separate decisions by layer:
- - Human layer: architecture, taste, policy, and final risk acceptance.
- - Agent layer: implementation, refactors, test updates, and routine maintenance.
-- Define non-negotiable constraints before coding starts:
- - Required tests and linters.
- - Directory ownership and file-scoping rules.
- - Branch, PR, and commit conventions.
-
-### 3) Make the repository the system of record
-
-- Encode process in files, not tribal knowledge.
-- Prefer deterministic entry points:
- - Single source for setup.
- - Canonical command wrappers (`make`, `just`, or scripts).
- - Stable templates for PRs, issues, and specs.
-- Remove conflicting guidance and duplicate docs.
-
-### 4) Increase agent legibility
-
-- Prefer one clear pattern over many equivalent ones.
-- Standardize naming, folder layouts, and module boundaries.
-- Add concise examples for fragile tasks.
-- Eliminate hidden behavior and implicit coupling.
-
-### 5) Add mechanical guardrails
-
-- Enforce checks automatically:
- - Fast local checks for iteration.
- - CI gates for merge readiness.
- - Static analysis for known failure classes.
-- Fail with actionable messages that point to exact fixes.
-- Keep checks strict enough to prevent regressions, but fast enough for daily use.
-
-### 6) Optimize merge throughput
-
-- Encourage smaller, composable changes instead of large batches.
-- Isolate independent work streams to reduce collisions.
-- Define explicit integration rules for overlapping files.
-- Prefer rapid merge and follow-up fixes over long-lived divergence.
-
-### 7) Build entropy-control loops
-
-- Schedule regular cleanup work: dead code removal, doc pruning, flaky test fixes.
-- Track recurring failure patterns and encode permanent safeguards.
-- Retire obsolete scripts, prompts, and templates quickly.
-
-## Deliverable format
-
-- `Harness snapshot`: current bottlenecks with evidence.
-- `Proposed harness changes`: files to add or edit and why.
-- `Guardrail plan`: checks to enforce and where they run.
-- `Rollout plan`: phased adoption with fallback strategy.
-- `Entropy plan`: recurring cleanup cadence and ownership.
-
-## References
-
-- For detailed principles, anti-patterns, and direct implementation checklists, read [references/harness-engineering-principles.md](references/harness-engineering-principles.md).
diff --git a/.agents/skills/harness-engineering/agents/openai.yaml b/.agents/skills/harness-engineering/agents/openai.yaml
deleted file mode 100644
index acfad3a..0000000
--- a/.agents/skills/harness-engineering/agents/openai.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-interface:
- display_name: "Harness Engineering"
- short_description: "Build agent-first coding harnesses and workflows"
- default_prompt: "Apply harness engineering to this repository by improving agent legibility, constraints, feedback loops, and maintenance workflows."
diff --git a/.agents/skills/harness-engineering/references/harness-engineering-principles.md b/.agents/skills/harness-engineering/references/harness-engineering-principles.md
deleted file mode 100644
index d433801..0000000
--- a/.agents/skills/harness-engineering/references/harness-engineering-principles.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# Harness Engineering Principles
-
-## Table of contents
-
-1. Human role shift
-2. Repository as system of record
-3. Agent legibility checklist
-4. Constraints and guardrails
-5. Merge and autonomy patterns
-6. Entropy management loop
-7. Anti-patterns and fixes
-
-## 1. Human role shift
-
-- Move humans up-stack: set architecture, constraints, and review bars.
-- Push agents down-stack: implement, refactor, test, and maintain.
-- Avoid spending human time on deterministic boilerplate that agents can do.
-
-## 2. Repository as system of record
-
-- Store decisions in versioned files, not chat logs.
-- Prefer discoverable conventions:
- - `AGENTS.md` for operational rules.
- - `README.md` for onboarding and canonical commands.
- - Checked-in templates for issues, PRs, and specs.
-- Remove duplicate documents that disagree on process.
-
-## 3. Agent legibility checklist
-
-- Use one canonical way to run tests and linters.
-- Keep naming consistent across modules and folders.
-- Keep dependency direction explicit and documented.
-- Keep "where to edit" obvious from file structure.
-- Keep task instructions concrete and file-scoped.
-
-## 4. Constraints and guardrails
-
-- Encode quality bars mechanically whenever possible.
-- Add fast local checks:
- - Formatting.
- - Type checks.
- - Focused test suites.
-- Add merge-time checks:
- - Full tests.
- - Security and policy scanning.
- - Required code-owner reviews for sensitive paths.
-- Prefer deterministic scripts over free-form command sequences.
-
-## 5. Merge and autonomy patterns
-
-- Split work into small, reviewable increments.
-- Run independent tracks for unrelated files.
-- Merge frequently to avoid long divergence windows.
-- Grant high autonomy where guardrails are strong.
-- Reduce autonomy where risk is high or constraints are incomplete.
-
-## 6. Entropy management loop
-
-- Run recurring cleanup tasks:
- - Remove dead files and stale configs.
- - Fix flaky tests and non-actionable alerts.
- - Prune obsolete docs and prompts.
-- Convert repeated failures into explicit rules or checks.
-- Keep maintenance ownership explicit by directory or subsystem.
-
-## 7. Anti-patterns and fixes
-
-| Anti-pattern | Symptom | Correction |
-| --- | --- | --- |
-| Prompt-only process | Different outcomes for same task | Move rules into repo files and scripts |
-| Too many patterns | Agents pick inconsistent approaches | Publish one default per task type |
-| Manual quality gates | Reviews become bottlenecks | Automate checks in local and CI flows |
-| Large branch batches | Frequent merge conflicts | Break work into smaller merges |
-| No cleanup cycle | Docs and scripts drift quickly | Schedule recurring maintenance sweeps |
diff --git a/.agents/skills/ios-xcodegen/SKILL.md b/.agents/skills/ios-xcodegen/SKILL.md
deleted file mode 100644
index a90126e..0000000
--- a/.agents/skills/ios-xcodegen/SKILL.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-name: ios-xcodegen
-description: "XcodeGen workflows for iOS/iPadOS apps: generate projects from project.yml/project.yaml, fix build/test destination issues, wire asset catalogs, configure test hosts, manage SwiftPM resolution in CI, and resolve App Store packaging errors related to embedded static libraries."
----
-
-# XcodeGen iOS workflow
-
-## Quick start
-- Treat `project.yml` (or `project.yaml`) as the source of truth; regenerate with `xcodegen generate` before building.
-- Do not edit the generated `.xcodeproj` directly; delete and regenerate as needed.
-
-## Build / Run
-- For “Designed for iPad on Mac” builds, use a macOS destination with `variant=Designed for iPad` when available.
-- For tests, prefer an iOS Simulator if any vendor frameworks lack Mac Catalyst support.
-
-## Tests
-- Ensure the test target is added to the scheme and has a host app if required.
-- If tests show 0 cases, recheck the scheme and any test plan configuration.
-- If `@testable import` fails, confirm the host app module name and that tests build for the same destination as the host.
-
-## Resources / Assets
-- Asset catalogs and storyboards must be in the resources build phase. In XcodeGen, add them under `sources` with `buildPhase: resources`.
-- Enable asset symbol generation when code uses generated `ColorAsset`/`ImageAsset` symbols:
- - `ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOLS=YES`
- - `ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS=YES`
-
-## SwiftPM in CI
-- If CI disables automatic dependency resolution, ensure `Package.resolved` is committed or copied to the expected location (usually `.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved`) before build.
-- Keep versions pinned in `project.yml` when deterministic builds are required.
-
-## App Store Connect packaging issues
-- Static `.a` files must never appear under `*.app/Frameworks`.
-- XcodeGen does not support a `library:` dependency key; to link a `.a` file, use:
- - `framework: path/to/libSomething.a`
- - `embed: false`
-- XCFrameworks that contain static libs should also be linked only:
- - set `embed: false` for those XCFrameworks to avoid `.a` slices being copied into `Frameworks/`.
-- Verify the generated project’s “Embed Frameworks” build phase contains only dynamic frameworks that must be embedded.
-
-## Diagnostics / sanity checks
-- Regenerate and clean Derived Data after changing `project.yml`.
-- After archiving, inspect the app bundle’s `Frameworks/` directory; it should contain only dynamic frameworks and Swift runtime libraries.
diff --git a/.agents/skills/spec-creation-updating/SKILL.md b/.agents/skills/spec-creation-updating/SKILL.md
deleted file mode 100644
index 159a204..0000000
--- a/.agents/skills/spec-creation-updating/SKILL.md
+++ /dev/null
@@ -1,78 +0,0 @@
----
-name: spec-creation-updating
-description: Create, update, review, and improve technical specification documents so they are complete, testable, and implementation-ready. Use when defining new features/systems/APIs, updating existing specs, restructuring documents, auditing missing requirements, or converting vague plans into concrete, verifiable requirements and acceptance criteria.
----
-
-# Spec Creation Updating
-
-## Overview
-
-Produce specs that reduce ambiguity and can be implemented with minimal back-and-forth.
-Apply this workflow to any project domain (product, backend, API, data, UI, infrastructure, ops).
-
-## Workflow
-
-### 1. Set boundaries
-
-- Capture the objective and user/business value.
-- Define in-scope and out-of-scope behavior.
-- Record assumptions, dependencies, and constraints.
-- Ask clarifying questions when decisions affect architecture, cost, security, or user-visible behavior.
-
-### 2. Choose depth
-
-- Write a lightweight spec for isolated, low-risk changes.
-- Write a full system spec for cross-team, risky, or high-impact work.
-- Keep the same quality gates regardless of depth.
-
-### 3. Build structure
-
-- Start from [`references/spec-template.md`](references/spec-template.md).
-- Preserve repository naming, section ordering, and style if they already exist.
-- Add domain-specific sections as needed, but do not remove mandatory content.
-- When a change spans existing code paths, include an implementation map that names the canonical files or directories to edit and any adjacent files that must stay untouched.
-
-### 4. Fill concrete requirements
-
-- Write requirements as testable statements, not intentions.
-- Define success paths, edge cases, and failure behavior.
-- Specify interfaces, data contracts, and state transitions when relevant.
-- Specify non-functional requirements: performance, reliability, scalability, observability.
-
-### 5. Define verification and completion
-
-- Map each requirement to a verification method.
-- Include reproducible commands, tests, and manual checks when automation is unavailable.
-- Define completion criteria with pass/fail outcomes.
-
-### 6. Close traceability
-
-- Link related specs, ADRs, designs, and operational docs.
-- Update version, last-updated date, and status.
-- Record unresolved questions and decision owners.
-- Keep implementation maps aligned with the actual repo structure so agents do not infer sibling paths from prose-only feature descriptions.
-
-### 7. Run quality gate
-
-- Validate against [`references/spec-must-have-checklist.md`](references/spec-must-have-checklist.md).
-- Use [`references/spec-review-scorecard.md`](references/spec-review-scorecard.md) when auditing an existing spec.
-- Treat any missing MUST item as blocking.
-
-## Writing rules
-
-- Prefer precise language over broad terms like "optimize", "support", or "handle".
-- Use explicit units, limits, and conditions.
-- Mark implemented vs planned behavior with explicit status labels.
-- Keep requirements and facts in the spec; keep narrative concise.
-- Avoid embedding secrets or private credentials in reusable specs.
-
-## Output expectations
-
-- When creating a spec, deliver:
- - A complete spec document.
- - A list of unresolved questions.
- - A verification plan mapped to requirements.
-- When reviewing a spec, deliver:
- - Prioritized gaps and risks.
- - Concrete rewrite suggestions.
- - A readiness verdict based on MUST items.
diff --git a/.agents/skills/spec-creation-updating/agents/openai.yaml b/.agents/skills/spec-creation-updating/agents/openai.yaml
deleted file mode 100644
index 2cd340d..0000000
--- a/.agents/skills/spec-creation-updating/agents/openai.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-interface:
- display_name: "Spec Creation"
- short_description: "Create and review complete technical specs"
- default_prompt: "Create or improve a technical specification that is complete, testable, and implementation-ready."
diff --git a/.agents/skills/spec-creation-updating/references/spec-must-have-checklist.md b/.agents/skills/spec-creation-updating/references/spec-must-have-checklist.md
deleted file mode 100644
index 8f84ddf..0000000
--- a/.agents/skills/spec-creation-updating/references/spec-must-have-checklist.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Spec must-have checklist
-
-Use this checklist as a hard gate before marking a spec as ready.
-
-## MUST items (blocking if missing)
-
-| ID | Requirement | Why it is mandatory |
-|---|---|---|
-| M01 | Document metadata (`ID`, `version`, `status`, `last updated`, optional parent/owner). | Prevent stale, ownerless specs. |
-| M02 | Clear objective and problem statement. | Anchor decisions to outcomes, not implementation guesses. |
-| M03 | Explicit scope and explicit non-goals. | Prevent scope creep and hidden assumptions. |
-| M04 | Functional requirements written as testable statements. | Make implementation and QA unambiguous. |
-| M05 | Behavior for success path, edge cases, and failures. | Avoid undefined runtime behavior. |
-| M06 | Interfaces/contracts (API shapes, events, I/O, schemas, protocol rules) where applicable. | Keep integrations deterministic. |
-| M07 | Data model and state transitions where applicable. | Define lifecycle and consistency expectations. |
-| M08 | Non-functional requirements (performance, reliability, scalability, observability). | Make quality attributes explicit and enforceable. |
-| M09 | Security/privacy/compliance requirements or an explicit `N/A` with rationale. | Prevent silent high-risk omissions. |
-| M10 | Dependencies, assumptions, constraints, and external prerequisites. | Surface risks and planning constraints early. |
-| M11 | Verification plan mapped to requirements. | Ensure each requirement is actually verifiable. |
-| M12 | Completion criteria with pass/fail outcomes. | Define "done" objectively. |
-| M13 | Traceability links to related docs/specs/ADRs/tickets. | Preserve context and decision lineage. |
-| M14 | Document history (change log by version/date/summary). | Keep updates auditable. |
-
-## SHOULD items (strongly recommended)
-
-| ID | Recommendation | Benefit |
-|---|---|---|
-| S01 | Glossary for domain-specific terms. | Reduce interpretation drift across teams. |
-| S02 | Migration/backward-compatibility strategy when changing contracts. | Lower rollout risk and regression risk. |
-| S03 | Rollout and rollback plan. | Improve operational safety in production. |
-| S04 | Monitoring and alerting expectations. | Enable quick issue detection after release. |
-| S05 | Risk register with severity and mitigation. | Make tradeoffs explicit and reviewable. |
-| S06 | Ownership mapping (who approves, who implements, who operates). | Improve execution accountability. |
-| S07 | Timeline or phase plan for multi-stage delivery. | Align delivery sequencing across teams. |
-
-## Readiness decision
-
-- Mark `Ready` only if all MUST items are present.
-- Mark `Conditionally Ready` only if all MUST items are present and open questions are low-risk.
-- Mark `Not Ready` if any MUST item is missing or ambiguous.
diff --git a/.agents/skills/spec-creation-updating/references/spec-review-scorecard.md b/.agents/skills/spec-creation-updating/references/spec-review-scorecard.md
deleted file mode 100644
index e95c751..0000000
--- a/.agents/skills/spec-creation-updating/references/spec-review-scorecard.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Spec review scorecard
-
-Use this scorecard when auditing an existing spec.
-
-## Scoring rubric
-
-- `0` = Missing or unusable.
-- `1` = Present but ambiguous/incomplete.
-- `2` = Clear, actionable, and verifiable.
-
-## Score table
-
-| Category | Score (0-2) | Notes |
-|---|---:|---|
-| Document metadata and status | | |
-| Objective and scope clarity | | |
-| Functional requirements quality | | |
-| Edge cases and failure behavior | | |
-| Interface/contract completeness | | |
-| Data model and state definitions | | |
-| Non-functional requirements | | |
-| Security/privacy/compliance coverage | | |
-| Dependencies/assumptions/constraints | | |
-| Verification mapping to requirements | | |
-| Completion criteria clarity | | |
-| Traceability and related-doc links | | |
-| Document history hygiene | | |
-
-## Verdict rules
-
-- `Ready`: no category scored `0`, total score >= 22.
-- `Needs revision`: no category scored `0`, total score 16-21.
-- `Not ready`: any category scored `0` or total score < 16.
-
-## Required findings format
-
-Report findings in this order:
-
-1. Blocking issues (missing MUST-level content).
-2. High-risk ambiguities (could cause rework/outage/security risk).
-3. Quality improvements (readability, structure, maintainability).
diff --git a/.agents/skills/spec-creation-updating/references/spec-template.md b/.agents/skills/spec-creation-updating/references/spec-template.md
deleted file mode 100644
index 850c028..0000000
--- a/.agents/skills/spec-creation-updating/references/spec-template.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# Generic specification template
-
-Use this as a starting structure. Keep sections that apply, and mark non-applicable ones as `N/A` with a short rationale.
-
-## Document header
-
-```md
-#
-
-> **Document ID:**
-> **Version:**
-> **Last Updated:**
-> **Status:**
-> **Parent/Owner:**
-```
-
-## 1. Objective and context
-
-- Problem statement.
-- User/business outcome.
-- Success criteria.
-
-## 2. Scope
-
-- In scope.
-- Out of scope / non-goals.
-- Assumptions and constraints.
-
-## 3. Requirements
-
-- Functional requirements with IDs (`REQ-001`, etc.).
-- Edge cases and failure behavior.
-- Acceptance criteria per requirement.
-
-## 4. Interfaces and contracts
-
-- API/interface definitions.
-- Request/response/event schemas.
-- Error contract and retry behavior.
-- Versioning and backward compatibility.
-
-## 5. Data and state
-
-- Data entities and relationships.
-- State machine or lifecycle transitions.
-- Retention, consistency, and deletion rules.
-
-## 6. Non-functional requirements
-
-- Performance targets.
-- Reliability/SLA/SLO expectations.
-- Scalability limits.
-- Observability (logs, metrics, traces, alerts).
-
-## 7. Security, privacy, and compliance
-
-- AuthN/AuthZ model.
-- Secret handling.
-- PII/data classification and minimization.
-- Regulatory/compliance requirements.
-
-## 8. Implementation status and plan
-
-- Implemented / in progress / planned breakdown.
-- Implementation map for existing code when the behavior spans multiple files or surfaces.
-- Dependencies and sequencing.
-- Rollout and rollback strategy.
-
-## 9. Verification and completion
-
-- Verification playbook (commands and manual checks).
-- Requirement-to-test mapping table.
-- Completion criteria with pass/fail outcomes.
-
-## 10. Risks and open questions
-
-- Known risks with mitigation.
-- Open questions with decision owner and due date.
-
-## Document history
-
-| Version | Date | Author | Changes |
-|---|---|---|---|
-| 0.1.0 | YYYY-MM-DD | | Initial draft |
-
-## Related documents
-
-- Links to upstream specs, ADRs, operational runbooks, and tickets.
diff --git a/.agents/skills/xcode-build/SKILL.md b/.agents/skills/xcode-build/SKILL.md
deleted file mode 100644
index 876af38..0000000
--- a/.agents/skills/xcode-build/SKILL.md
+++ /dev/null
@@ -1,228 +0,0 @@
----
-name: xcode-build
-description: Build and run iOS/macOS apps using xcodebuild and xcrun simctl directly. Use when building Xcode projects, running iOS simulators, managing devices, compiling Swift code, running UI tests, or automating iOS app interactions. Replaces XcodeBuildMCP with native CLI tools.
-allowed-tools: Bash, Read, Grep, Glob
----
-
-# Xcode Build Direct
-
-Build and manage iOS/macOS projects using native Xcode CLI tools instead of MCP servers.
-
-## When to Use This Skill
-
-Use this skill when:
-- Building iOS or macOS apps with Xcode
-- Running apps in iOS simulators
-- Managing simulator instances (boot, shutdown, list)
-- Taking screenshots of simulators
-- Capturing app logs
-- Running tests (unit or UI)
-- Automating UI interactions (tap, type, swipe)
-
-**Preference**: Always use direct CLI commands (`xcodebuild`, `xcrun simctl`) instead of XcodeBuildMCP tools.
-
-## Quick Start
-
-### 1. Discover Project Structure
-```bash
-# List schemes in a workspace
-xcodebuild -workspace /path/to/App.xcworkspace -list
-
-# List schemes in a project
-xcodebuild -project /path/to/App.xcodeproj -list
-
-# Show build settings
-xcodebuild -workspace /path/to/App.xcworkspace -scheme AppScheme -showBuildSettings
-```
-
-### 2. Find Available Simulators
-```bash
-# List all simulators
-xcrun simctl list devices
-
-# List as JSON (better for parsing)
-xcrun simctl list devices --json
-
-# List only available simulators
-xcrun simctl list devices available
-```
-
-### 3. Build for Simulator
-```bash
-# Get simulator UUID first
-UDID=$(xcrun simctl list devices --json | jq -r '.devices | .[].[] | select(.name=="iPhone 16 Pro") | .udid' | head -1)
-
-# Build
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme AppScheme \
- -destination "platform=iOS Simulator,id=$UDID" \
- -configuration Debug \
- -derivedDataPath /tmp/build \
- build
-```
-
-### 4. Install and Launch
-```bash
-# Find the built .app
-APP_PATH=$(find /tmp/build -name "*.app" -type d | head -1)
-
-# Install on simulator
-xcrun simctl install $UDID "$APP_PATH"
-
-# Launch app
-xcrun simctl launch $UDID com.your.bundleid
-```
-
-### 5. Take Screenshot
-```bash
-xcrun simctl io $UDID screenshot /tmp/screenshot.png
-```
-
-## Detailed References
-
-For comprehensive command documentation, see:
-- **CLI_REFERENCE.md** - Full `xcodebuild` and `xcrun simctl` command reference
-- **XCUITEST_GUIDE.md** - UI automation via XCUITest (tap, type, gestures, element queries)
-
-## Common Patterns
-
-### Build + Run Workflow
-```bash
-# 1. Boot simulator
-xcrun simctl boot $UDID 2>/dev/null || true
-
-# 2. Build
-xcodebuild -workspace App.xcworkspace -scheme App \
- -destination "platform=iOS Simulator,id=$UDID" \
- -derivedDataPath /tmp/build build
-
-# 3. Find and install app
-APP=$(find /tmp/build -name "*.app" -type d | head -1)
-xcrun simctl install $UDID "$APP"
-
-# 4. Launch with console output
-xcrun simctl launch --console $UDID com.bundle.id
-```
-
-### Log Capture
-```bash
-# Stream app logs (run in background)
-/usr/bin/log stream \
- --predicate 'processImagePath CONTAINS[cd] "AppName"' \
- --style json &
-LOG_PID=$!
-
-# ... interact with app ...
-
-# Stop logging
-kill $LOG_PID
-```
-
-### Running Tests
-```bash
-# Unit tests
-xcodebuild -workspace App.xcworkspace -scheme App \
- -destination "platform=iOS Simulator,id=$UDID" \
- test
-
-# Specific test class
-xcodebuild -workspace App.xcworkspace -scheme App \
- -destination "platform=iOS Simulator,id=$UDID" \
- -only-testing "AppTests/MyTestClass" \
- test
-```
-
-## UI Automation
-
-For tapping, typing, and UI element queries, use **XCUITest** (Apple's native UI testing framework).
-
-This is more powerful than MCP-based automation because:
-- Native to iOS, always up-to-date
-- Full access to accessibility tree
-- Can wait for elements, handle animations
-- Integrates with Xcode test runner
-
-See **XCUITEST_GUIDE.md** for complete patterns.
-
-Quick example:
-```swift
-// In a UI test file
-func testLogin() {
- let app = XCUIApplication()
- app.launch()
-
- // Type in text field
- app.textFields["email"].tap()
- app.textFields["email"].typeText("user@example.com")
-
- // Tap button
- app.buttons["Login"].tap()
-
- // Verify result
- XCTAssertTrue(app.staticTexts["Welcome"].exists)
-}
-```
-
-Run UI tests:
-```bash
-xcodebuild -workspace App.xcworkspace -scheme AppUITests \
- -destination "platform=iOS Simulator,id=$UDID" \
- test
-```
-
-## Session Configuration
-
-Unlike MCP, CLI tools don't maintain session state. Use environment variables or a config file:
-
-```bash
-# Set up session variables
-export XCODE_WORKSPACE="/path/to/App.xcworkspace"
-export XCODE_SCHEME="App"
-export SIM_UDID="DD5E339B-468E-43C7-B219-54112C9D3250"
-export APP_BUNDLE_ID="com.your.app"
-
-# Use in commands
-xcodebuild -workspace "$XCODE_WORKSPACE" -scheme "$XCODE_SCHEME" ...
-xcrun simctl launch "$SIM_UDID" "$APP_BUNDLE_ID"
-```
-
-## Troubleshooting
-
-### Build fails with "no matching destination"
-```bash
-# Check available destinations
-xcodebuild -workspace App.xcworkspace -scheme App -showDestinations
-
-# Use exact destination string from output
-```
-
-### Simulator won't boot
-```bash
-# Check if already booted
-xcrun simctl list devices | grep Booted
-
-# Force shutdown and reboot
-xcrun simctl shutdown $UDID
-xcrun simctl boot $UDID
-```
-
-### Can't find built .app
-```bash
-# Check derived data path you specified
-ls -la /tmp/build/Build/Products/Debug-iphonesimulator/
-
-# Or use default derived data
-ls ~/Library/Developer/Xcode/DerivedData/
-```
-
-## Key Differences from XcodeBuildMCP
-
-| Feature | XcodeBuildMCP | This Skill |
-|---------|---------------|------------|
-| Build | `build_sim({...})` | `xcodebuild -workspace ... build` |
-| List sims | `list_sims()` | `xcrun simctl list devices` |
-| Launch app | `launch_app_sim({...})` | `xcrun simctl launch $UDID $BUNDLE` |
-| Screenshot | `screenshot({...})` | `xcrun simctl io $UDID screenshot` |
-| Tap/Type | `tap({x,y})`, `type_text({...})` | XCUITest framework |
-| Session state | Built-in | Environment variables |
diff --git a/.agents/skills/xcode-build/references/CLI_REFERENCE.md b/.agents/skills/xcode-build/references/CLI_REFERENCE.md
deleted file mode 100644
index 3585dab..0000000
--- a/.agents/skills/xcode-build/references/CLI_REFERENCE.md
+++ /dev/null
@@ -1,526 +0,0 @@
-# Xcode CLI Reference
-
-Complete command reference for `xcodebuild` and `xcrun simctl`.
-
-## xcodebuild Commands
-
-### Project Discovery
-
-```bash
-# List all schemes in workspace
-xcodebuild -workspace /path/to/App.xcworkspace -list
-
-# List all schemes in project
-xcodebuild -project /path/to/App.xcodeproj -list
-
-# Show available SDKs
-xcodebuild -showsdks
-
-# Show available destinations for a scheme
-xcodebuild -workspace /path/to/App.xcworkspace -scheme SchemeName -showDestinations
-
-# Show all build settings
-xcodebuild -workspace /path/to/App.xcworkspace -scheme SchemeName -showBuildSettings
-
-# Get specific build setting
-xcodebuild -workspace /path/to/App.xcworkspace -scheme SchemeName \
- -showBuildSettings | grep PRODUCT_BUNDLE_IDENTIFIER
-```
-
-### Building for iOS Simulator
-
-```bash
-# Basic build
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,name=iPhone 16 Pro" \
- build
-
-# Build with specific simulator UUID
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" \
- -configuration Debug \
- build
-
-# Build with custom derived data path (recommended)
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- -derivedDataPath /tmp/build \
- build
-
-# Clean build
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- clean build
-
-# Build with specific iOS version
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,name=iPhone 16 Pro,OS=18.0" \
- build
-```
-
-### Building for Device
-
-```bash
-# Build for generic iOS device (no signing)
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "generic/platform=iOS" \
- -configuration Release \
- build
-
-# Build for connected device
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS,id=DEVICE_UDID" \
- build
-```
-
-### Building for macOS
-
-```bash
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme MacScheme \
- -destination "platform=macOS" \
- build
-```
-
-### Archives and Distribution
-
-```bash
-# Create archive
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "generic/platform=iOS" \
- -archivePath /tmp/App.xcarchive \
- archive
-
-# Export IPA from archive
-xcodebuild \
- -exportArchive \
- -archivePath /tmp/App.xcarchive \
- -exportPath /tmp/export \
- -exportOptionsPlist /path/to/ExportOptions.plist
-```
-
-### Testing
-
-```bash
-# Run all tests
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- test
-
-# Run specific test class
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- -only-testing "AppTests/UserServiceTests" \
- test
-
-# Run specific test method
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- -only-testing "AppTests/UserServiceTests/testLoginSuccess" \
- test
-
-# Skip specific tests
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- -skip-testing "AppTests/SlowTests" \
- test
-
-# Test with code coverage
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- -enableCodeCoverage YES \
- test
-
-# Save test results
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme SchemeName \
- -destination "platform=iOS Simulator,id=$UDID" \
- -resultBundlePath /tmp/TestResults.xcresult \
- test
-```
-
-### Useful Flags
-
-| Flag | Description |
-|------|-------------|
-| `-workspace ` | Path to .xcworkspace |
-| `-project ` | Path to .xcodeproj |
-| `-scheme ` | Build scheme |
-| `-destination ` | Target device/simulator |
-| `-configuration ` | Debug or Release |
-| `-derivedDataPath ` | Where to put build products |
-| `-quiet` | Suppress xcodebuild output |
-| `-parallelizeTargets` | Build targets in parallel |
-| `-jobs ` | Number of concurrent build jobs |
-
----
-
-## xcrun simctl Commands
-
-### Listing Simulators
-
-```bash
-# List all simulators (human readable)
-xcrun simctl list devices
-
-# List as JSON (better for parsing)
-xcrun simctl list devices --json
-
-# List only available simulators
-xcrun simctl list devices available
-
-# List simulators for specific OS
-xcrun simctl list devices "iOS 18"
-
-# List device types
-xcrun simctl list devicetypes
-
-# List runtimes
-xcrun simctl list runtimes
-```
-
-### Extracting UDIDs with jq
-
-```bash
-# Get UDID of specific simulator
-xcrun simctl list devices --json | \
- jq -r '.devices | .[].[] | select(.name=="iPhone 16 Pro") | .udid' | head -1
-
-# Get all booted simulators
-xcrun simctl list devices --json | \
- jq -r '.devices | .[].[] | select(.state=="Booted") | .udid'
-
-# Get available simulators
-xcrun simctl list devices --json | \
- jq -r '.devices | .[].[] | select(.isAvailable==true) | {name, udid}'
-```
-
-### Simulator Lifecycle
-
-```bash
-# Boot simulator
-xcrun simctl boot $UDID
-
-# Shutdown simulator
-xcrun simctl shutdown $UDID
-
-# Shutdown all simulators
-xcrun simctl shutdown all
-
-# Erase simulator (reset to clean state)
-xcrun simctl erase $UDID
-
-# Delete simulator
-xcrun simctl delete $UDID
-
-# Create new simulator
-xcrun simctl create "My iPhone" \
- "com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro" \
- "com.apple.CoreSimulator.SimRuntime.iOS-18-0"
-```
-
-### App Management
-
-```bash
-# Install app
-xcrun simctl install $UDID /path/to/App.app
-
-# Uninstall app
-xcrun simctl uninstall $UDID com.bundle.identifier
-
-# Launch app
-xcrun simctl launch $UDID com.bundle.identifier
-
-# Launch with console output
-xcrun simctl launch --console $UDID com.bundle.identifier
-
-# Launch with stdout/stderr redirect
-xcrun simctl launch \
- --stdout=/tmp/stdout.log \
- --stderr=/tmp/stderr.log \
- $UDID com.bundle.identifier
-
-# Launch and wait for debugger
-xcrun simctl launch -w $UDID com.bundle.identifier
-
-# Terminate app
-xcrun simctl terminate $UDID com.bundle.identifier
-
-# List installed apps
-xcrun simctl listapps $UDID
-
-# Get app info
-xcrun simctl appinfo $UDID com.bundle.identifier
-
-# Get app container path
-xcrun simctl get_app_container $UDID com.bundle.identifier
-```
-
-### Screenshots and Video
-
-```bash
-# Take screenshot
-xcrun simctl io $UDID screenshot /tmp/screenshot.png
-
-# Screenshot as JPEG
-xcrun simctl io $UDID screenshot --type=jpeg /tmp/screenshot.jpg
-
-# Record video
-xcrun simctl io $UDID recordVideo /tmp/recording.mp4
-
-# Record with codec
-xcrun simctl io $UDID recordVideo --codec=h264 /tmp/recording.mp4
-
-# Stop recording: Press Ctrl+C in the terminal running recordVideo
-```
-
-### Location
-
-```bash
-# Set custom location
-xcrun simctl location $UDID set 37.7749,-122.4194
-
-# Set location by name
-xcrun simctl location $UDID set "San Francisco, CA"
-
-# Reset location
-xcrun simctl location $UDID clear
-```
-
-### Status Bar Overrides
-
-```bash
-# Override time
-xcrun simctl status_bar $UDID override --time "9:41"
-
-# Override battery
-xcrun simctl status_bar $UDID override --batteryLevel 100 --batteryState charged
-
-# Override network
-xcrun simctl status_bar $UDID override --dataNetwork wifi --wifiBars 3
-
-# Clear all overrides
-xcrun simctl status_bar $UDID clear
-```
-
-### Push Notifications
-
-```bash
-# Send push notification
-xcrun simctl push $UDID com.bundle.identifier /path/to/payload.json
-
-# Payload example (payload.json):
-# {
-# "aps": {
-# "alert": {
-# "title": "Test",
-# "body": "Hello from simctl"
-# }
-# }
-# }
-```
-
-### Privacy Permissions
-
-```bash
-# Grant permission
-xcrun simctl privacy $UDID grant photos com.bundle.identifier
-xcrun simctl privacy $UDID grant camera com.bundle.identifier
-xcrun simctl privacy $UDID grant microphone com.bundle.identifier
-xcrun simctl privacy $UDID grant location com.bundle.identifier
-
-# Revoke permission
-xcrun simctl privacy $UDID revoke photos com.bundle.identifier
-
-# Reset all permissions
-xcrun simctl privacy $UDID reset all com.bundle.identifier
-```
-
-### Pasteboard
-
-```bash
-# Get pasteboard contents
-xcrun simctl pbinfo $UDID
-
-# Copy text to pasteboard
-echo "Hello" | xcrun simctl pbcopy $UDID
-
-# Paste from pasteboard
-xcrun simctl pbpaste $UDID
-```
-
-### URL Handling
-
-```bash
-# Open URL in simulator
-xcrun simctl openurl $UDID "https://example.com"
-
-# Open deep link
-xcrun simctl openurl $UDID "myapp://path/to/screen"
-```
-
-### Keychain
-
-```bash
-# Add certificate to keychain
-xcrun simctl keychain $UDID add-root-cert /path/to/cert.pem
-
-# Add CA certificate
-xcrun simctl keychain $UDID add-ca-cert /path/to/ca.pem
-```
-
-### Diagnostics
-
-```bash
-# Collect diagnostic info
-xcrun simctl diagnose
-
-# Verbose logging
-xcrun simctl logverbose $UDID enable
-# ... reproduce issue ...
-xcrun simctl logverbose $UDID disable
-
-# Spawn process in simulator
-xcrun simctl spawn $UDID log stream --predicate 'processImagePath CONTAINS "App"'
-```
-
----
-
-## Logging with /usr/bin/log
-
-```bash
-# Stream logs for specific app
-/usr/bin/log stream \
- --predicate 'processImagePath CONTAINS[cd] "AppName"' \
- --level debug
-
-# Stream with JSON output
-/usr/bin/log stream \
- --predicate 'processImagePath CONTAINS[cd] "AppName"' \
- --style json
-
-# Stream with timeout
-/usr/bin/log stream \
- --predicate 'processImagePath CONTAINS[cd] "AppName"' \
- --timeout 60s
-
-# Filter by message content
-/usr/bin/log stream \
- --predicate 'eventMessage CONTAINS[cd] "error"' \
- --level debug
-
-# Save to file (background)
-/usr/bin/log stream \
- --predicate 'processImagePath CONTAINS[cd] "AppName"' \
- --style json > /tmp/logs.json &
-LOG_PID=$!
-
-# Stop logging
-kill $LOG_PID
-```
-
-### Common Predicates
-
-| Predicate | Description |
-|-----------|-------------|
-| `processImagePath CONTAINS[cd] "App"` | Filter by app name |
-| `eventMessage CONTAINS[cd] "error"` | Filter by message |
-| `category == "network"` | Filter by category |
-| `subsystem == "com.apple.xxx"` | Filter by subsystem |
-| `messageType == error` | Only errors |
-
----
-
-## Finding Built App Path
-
-```bash
-# If using -derivedDataPath
-find /tmp/build -name "*.app" -type d | head -1
-
-# Default derived data location
-find ~/Library/Developer/Xcode/DerivedData -name "*.app" -path "*Debug-iphonesimulator*" | head -1
-
-# Get from build settings
-xcodebuild -workspace App.xcworkspace -scheme App -showBuildSettings | grep "BUILT_PRODUCTS_DIR"
-```
-
----
-
-## Complete Workflow Example
-
-```bash
-#!/bin/bash
-set -e
-
-# Configuration
-WORKSPACE="/path/to/App.xcworkspace"
-SCHEME="App"
-BUNDLE_ID="com.example.app"
-DERIVED_DATA="/tmp/build"
-
-# 1. Find simulator
-echo "Finding simulator..."
-UDID=$(xcrun simctl list devices --json | \
- jq -r '.devices | .[].[] | select(.name=="iPhone 16 Pro" and .isAvailable==true) | .udid' | head -1)
-
-if [ -z "$UDID" ]; then
- echo "Error: No simulator found"
- exit 1
-fi
-echo "Using simulator: $UDID"
-
-# 2. Boot simulator
-echo "Booting simulator..."
-xcrun simctl boot "$UDID" 2>/dev/null || true
-sleep 3
-
-# 3. Build
-echo "Building..."
-xcodebuild \
- -workspace "$WORKSPACE" \
- -scheme "$SCHEME" \
- -destination "platform=iOS Simulator,id=$UDID" \
- -derivedDataPath "$DERIVED_DATA" \
- -configuration Debug \
- build
-
-# 4. Find app
-APP_PATH=$(find "$DERIVED_DATA" -name "*.app" -type d | head -1)
-echo "Found app: $APP_PATH"
-
-# 5. Install
-echo "Installing..."
-xcrun simctl install "$UDID" "$APP_PATH"
-
-# 6. Launch with logging
-echo "Launching..."
-xcrun simctl launch --console "$UDID" "$BUNDLE_ID"
-```
diff --git a/.agents/skills/xcode-build/references/XCUITEST_GUIDE.md b/.agents/skills/xcode-build/references/XCUITEST_GUIDE.md
deleted file mode 100644
index 6a9211d..0000000
--- a/.agents/skills/xcode-build/references/XCUITEST_GUIDE.md
+++ /dev/null
@@ -1,602 +0,0 @@
-# XCUITest UI Automation Guide
-
-This guide covers UI automation using Apple's native XCUITest framework. XCUITest replaces MCP-based tools like `tap`, `type_text`, and `describe_ui` with more powerful, native capabilities.
-
-## Why XCUITest?
-
-| Feature | MCP Tools | XCUITest |
-|---------|-----------|----------|
-| Element discovery | `describe_ui()` | `app.debugDescription`, element queries |
-| Tapping | `tap({x, y})` | `element.tap()`, semantic targeting |
-| Typing | `type_text({text})` | `element.typeText("...")` |
-| Waiting | None | `waitForExistence(timeout:)` |
-| Assertions | None | Full XCTest assertions |
-| Gestures | `gesture({preset})` | `swipeUp()`, `pinch()`, custom gestures |
-
-XCUITest targets elements semantically (by accessibility label, identifier, type) rather than coordinates, making tests more reliable.
-
----
-
-## Setup
-
-### 1. Create UI Test Target
-
-In Xcode:
-1. File → New → Target
-2. Select "UI Testing Bundle"
-3. Name it `AppUITests`
-4. Ensure it's added to your scheme's Test action
-
-Or add to `project.pbxproj` manually.
-
-### 2. Basic Test Structure
-
-```swift
-import XCTest
-
-final class AppUITests: XCTestCase {
-
- var app: XCUIApplication!
-
- override func setUpWithError() throws {
- continueAfterFailure = false
- app = XCUIApplication()
- app.launch()
- }
-
- override func tearDownWithError() throws {
- app.terminate()
- }
-
- func testExample() throws {
- // Your test code here
- }
-}
-```
-
----
-
-## Finding Elements (replaces `describe_ui`)
-
-### Print Entire UI Hierarchy
-
-```swift
-func testPrintHierarchy() {
- print(app.debugDescription)
-}
-```
-
-This outputs the full accessibility tree - equivalent to `describe_ui()`.
-
-### Query Elements by Type
-
-```swift
-// Buttons
-let button = app.buttons["Login"]
-let allButtons = app.buttons
-
-// Text fields
-let emailField = app.textFields["email"]
-let passwordField = app.secureTextFields["password"]
-
-// Labels
-let welcomeLabel = app.staticTexts["Welcome"]
-
-// Images
-let avatar = app.images["profileImage"]
-
-// Switches
-let toggle = app.switches["notifications"]
-
-// Cells (in lists)
-let cell = app.cells["userCell_123"]
-
-// Navigation bars
-let navBar = app.navigationBars["Settings"]
-
-// Tab bars
-let tabBar = app.tabBars.firstMatch
-let tab = app.tabBars.buttons["Profile"]
-
-// Alerts
-let alert = app.alerts["Error"]
-let alertButton = app.alerts.buttons["OK"]
-
-// Sheets
-let sheet = app.sheets.firstMatch
-```
-
-### Query by Accessibility Identifier
-
-Best practice: Set `accessibilityIdentifier` in your SwiftUI/UIKit code:
-
-```swift
-// In your app code
-Button("Submit") { ... }
- .accessibilityIdentifier("submitButton")
-
-// In your test
-let submitButton = app.buttons["submitButton"]
-```
-
-### Query by Label Text
-
-```swift
-// Exact match
-let button = app.buttons["Sign In"]
-
-// Partial match
-let button = app.buttons.matching(NSPredicate(format: "label CONTAINS 'Sign'")).firstMatch
-```
-
-### Query by Index
-
-```swift
-let firstButton = app.buttons.element(boundBy: 0)
-let thirdCell = app.cells.element(boundBy: 2)
-```
-
-### Check Element Exists
-
-```swift
-let button = app.buttons["Login"]
-XCTAssertTrue(button.exists)
-XCTAssertTrue(button.isHittable) // visible and tappable
-```
-
----
-
-## Tapping Elements (replaces `tap`)
-
-### Tap by Element
-
-```swift
-// Tap button
-app.buttons["Login"].tap()
-
-// Tap text field to focus
-app.textFields["email"].tap()
-
-// Tap cell in list
-app.cells["item_123"].tap()
-
-// Tap tab
-app.tabBars.buttons["Profile"].tap()
-
-// Double tap
-app.images["zoomableImage"].doubleTap()
-
-// Two-finger tap
-app.maps.firstMatch.twoFingerTap()
-```
-
-### Tap by Coordinates (like MCP's tap)
-
-```swift
-// Tap at specific point
-let coordinate = app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
-coordinate.tap()
-
-// Tap relative to element
-let button = app.buttons["Login"]
-let offset = button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
-offset.tap()
-
-// Tap at absolute coordinates
-let point = app.windows.firstMatch.coordinate(withNormalizedOffset: .zero)
- .withOffset(CGVector(dx: 100, dy: 200))
-point.tap()
-```
-
-### Long Press
-
-```swift
-// Long press for 2 seconds
-app.cells["item"].press(forDuration: 2.0)
-
-// Long press then drag
-app.cells["item"].press(forDuration: 1.0, thenDragTo: app.cells["target"])
-```
-
----
-
-## Typing Text (replaces `type_text`)
-
-### Type in Text Field
-
-```swift
-let emailField = app.textFields["email"]
-emailField.tap()
-emailField.typeText("user@example.com")
-
-// Clear and type
-emailField.tap()
-emailField.clearAndEnterText("new@example.com") // Custom extension needed
-```
-
-### Clear Text Field
-
-```swift
-extension XCUIElement {
- func clearAndEnterText(_ text: String) {
- guard let stringValue = self.value as? String else {
- self.tap()
- self.typeText(text)
- return
- }
-
- self.tap()
-
- // Select all and delete
- let deleteString = String(repeating: XCUIKeyboardKey.delete.rawValue, count: stringValue.count)
- self.typeText(deleteString)
- self.typeText(text)
- }
-}
-```
-
-### Type in Secure Text Field
-
-```swift
-let passwordField = app.secureTextFields["password"]
-passwordField.tap()
-passwordField.typeText("secretPassword123")
-```
-
-### Special Keys
-
-```swift
-// Press return/enter
-app.textFields["search"].typeText("query\n")
-
-// Or use keyboard key
-app.keyboards.buttons["Return"].tap()
-
-// Tab key
-app.typeText("\t")
-```
-
----
-
-## Gestures (replaces `gesture`)
-
-### Swipe
-
-```swift
-// Swipe directions
-app.swipeUp()
-app.swipeDown()
-app.swipeLeft()
-app.swipeRight()
-
-// Swipe on specific element
-app.tables.firstMatch.swipeUp()
-
-// Swipe with velocity
-app.swipeUp(velocity: .fast) // .slow, .default, .fast
-```
-
-### Scroll
-
-```swift
-// Scroll in table/collection
-let table = app.tables.firstMatch
-table.swipeUp()
-
-// Scroll until element visible
-while !app.cells["item_50"].isHittable {
- app.swipeUp()
-}
-app.cells["item_50"].tap()
-```
-
-### Pinch
-
-```swift
-// Pinch to zoom
-app.maps.firstMatch.pinch(withScale: 2.0, velocity: 1.0) // zoom in
-app.maps.firstMatch.pinch(withScale: 0.5, velocity: -1.0) // zoom out
-```
-
-### Rotate
-
-```swift
-app.images["rotatable"].rotate(CGFloat.pi / 4, withVelocity: 1.0)
-```
-
-### Drag
-
-```swift
-// Drag from one point to another
-let start = app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.8))
-let end = app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.2))
-start.press(forDuration: 0.5, thenDragTo: end)
-
-// Drag element to location
-app.cells["draggable"].press(forDuration: 0.5, thenDragTo: app.cells["dropZone"])
-```
-
----
-
-## Waiting for Elements
-
-### Wait for Existence
-
-```swift
-let button = app.buttons["Submit"]
-let exists = button.waitForExistence(timeout: 5)
-XCTAssertTrue(exists)
-```
-
-### Wait for Element to Disappear
-
-```swift
-let spinner = app.activityIndicators.firstMatch
-let expectation = XCTNSPredicateExpectation(
- predicate: NSPredicate(format: "exists == false"),
- object: spinner
-)
-wait(for: [expectation], timeout: 10)
-```
-
-### Wait for Condition
-
-```swift
-let predicate = NSPredicate(format: "isHittable == true")
-let expectation = XCTNSPredicateExpectation(predicate: predicate, object: app.buttons["Login"])
-wait(for: [expectation], timeout: 5)
-```
-
----
-
-## Assertions
-
-```swift
-// Element exists
-XCTAssertTrue(app.buttons["Login"].exists)
-
-// Element doesn't exist
-XCTAssertFalse(app.alerts["Error"].exists)
-
-// Element is hittable (visible and tappable)
-XCTAssertTrue(app.buttons["Submit"].isHittable)
-
-// Element is enabled
-XCTAssertTrue(app.buttons["Submit"].isEnabled)
-
-// Label text
-XCTAssertEqual(app.staticTexts["username"].label, "john_doe")
-
-// Element count
-XCTAssertEqual(app.cells.count, 10)
-
-// Value (for text fields, sliders, etc.)
-XCTAssertEqual(app.textFields["email"].value as? String, "user@example.com")
-```
-
----
-
-## Screenshots
-
-```swift
-func testTakeScreenshot() {
- // Take screenshot
- let screenshot = app.screenshot()
-
- // Attach to test results
- let attachment = XCTAttachment(screenshot: screenshot)
- attachment.name = "Main Screen"
- attachment.lifetime = .keepAlways
- add(attachment)
-}
-
-// Screenshot of specific element
-let elementScreenshot = app.buttons["Login"].screenshot()
-```
-
----
-
-## Complete Test Examples
-
-### Login Flow Test
-
-```swift
-func testLoginFlow() throws {
- // Navigate to login if needed
- if app.buttons["Sign In"].exists {
- app.buttons["Sign In"].tap()
- }
-
- // Wait for login screen
- let emailField = app.textFields["email"]
- XCTAssertTrue(emailField.waitForExistence(timeout: 5))
-
- // Enter credentials
- emailField.tap()
- emailField.typeText("test@example.com")
-
- let passwordField = app.secureTextFields["password"]
- passwordField.tap()
- passwordField.typeText("password123")
-
- // Tap login button
- app.buttons["Login"].tap()
-
- // Verify login success
- let welcomeText = app.staticTexts["Welcome"]
- XCTAssertTrue(welcomeText.waitForExistence(timeout: 10))
-}
-```
-
-### Story Feed Swipe Test
-
-```swift
-func testStorySwipe() throws {
- // Wait for stories to load
- let storyCard = app.otherElements["storyCard"]
- XCTAssertTrue(storyCard.waitForExistence(timeout: 10))
-
- // Swipe right to like
- storyCard.swipeRight()
-
- // Verify match popup (if matched)
- if app.alerts["It's a Match!"].waitForExistence(timeout: 2) {
- app.alerts.buttons["Keep Swiping"].tap()
- }
-
- // Swipe left to pass
- let nextCard = app.otherElements["storyCard"]
- if nextCard.waitForExistence(timeout: 5) {
- nextCard.swipeLeft()
- }
-}
-```
-
-### Profile Creation Flow
-
-```swift
-func testProfileCreation() throws {
- // Step 1: Name
- let nameField = app.textFields["firstName"]
- XCTAssertTrue(nameField.waitForExistence(timeout: 5))
- nameField.tap()
- nameField.typeText("John")
- app.buttons["Continue"].tap()
-
- // Step 2: Photos
- let addPhotoButton = app.buttons["addPhoto"]
- XCTAssertTrue(addPhotoButton.waitForExistence(timeout: 5))
- addPhotoButton.tap()
-
- // Handle photo picker
- if app.sheets.firstMatch.waitForExistence(timeout: 2) {
- app.sheets.buttons["Choose from Library"].tap()
- }
-
- // ... continue flow
-}
-```
-
----
-
-## Running UI Tests
-
-### From Command Line
-
-```bash
-# Run all UI tests
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme AppUITests \
- -destination "platform=iOS Simulator,id=$UDID" \
- test
-
-# Run specific test class
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme AppUITests \
- -destination "platform=iOS Simulator,id=$UDID" \
- -only-testing "AppUITests/LoginTests" \
- test
-
-# Run specific test method
-xcodebuild \
- -workspace /path/to/App.xcworkspace \
- -scheme AppUITests \
- -destination "platform=iOS Simulator,id=$UDID" \
- -only-testing "AppUITests/LoginTests/testLoginFlow" \
- test
-```
-
-### View Test Results
-
-```bash
-# Test results are in the result bundle
-open /path/to/TestResults.xcresult
-
-# Or view in Xcode's test navigator
-```
-
----
-
-## Best Practices
-
-### 1. Use Accessibility Identifiers
-
-```swift
-// In app code
-Button("Submit") { }
- .accessibilityIdentifier("loginSubmitButton")
-
-// In test
-app.buttons["loginSubmitButton"].tap()
-```
-
-### 2. Create Page Objects
-
-```swift
-struct LoginPage {
- let app: XCUIApplication
-
- var emailField: XCUIElement { app.textFields["email"] }
- var passwordField: XCUIElement { app.secureTextFields["password"] }
- var loginButton: XCUIElement { app.buttons["Login"] }
-
- func login(email: String, password: String) {
- emailField.tap()
- emailField.typeText(email)
- passwordField.tap()
- passwordField.typeText(password)
- loginButton.tap()
- }
-}
-
-// Usage
-func testLogin() {
- let loginPage = LoginPage(app: app)
- loginPage.login(email: "test@example.com", password: "password123")
-}
-```
-
-### 3. Wait Instead of Sleep
-
-```swift
-// Bad
-sleep(3)
-app.buttons["Submit"].tap()
-
-// Good
-let button = app.buttons["Submit"]
-XCTAssertTrue(button.waitForExistence(timeout: 5))
-button.tap()
-```
-
-### 4. Handle Alerts and System Dialogs
-
-```swift
-// Add UI interruption handler in setUp
-addUIInterruptionMonitor(withDescription: "System Alert") { alert in
- if alert.buttons["Allow"].exists {
- alert.buttons["Allow"].tap()
- return true
- }
- return false
-}
-
-// Trigger the alert by interacting with the app
-app.tap() // Sometimes needed to trigger the handler
-```
-
----
-
-## Migration from MCP Tools
-
-| MCP Tool | XCUITest Equivalent |
-|----------|---------------------|
-| `describe_ui()` | `print(app.debugDescription)` |
-| `tap({x: 100, y: 200})` | `app.coordinate(withNormalizedOffset:).tap()` |
-| `type_text({text: "hello"})` | `element.typeText("hello")` |
-| `gesture({preset: "scroll-down"})` | `app.swipeDown()` |
-| `screenshot()` | `app.screenshot()` |
-
-The main shift is from coordinate-based interaction to element-based queries, which makes tests more maintainable and reliable.
diff --git a/.agents/skills/xcode-cloud/SKILL.md b/.agents/skills/xcode-cloud/SKILL.md
deleted file mode 100644
index 76d38f2..0000000
--- a/.agents/skills/xcode-cloud/SKILL.md
+++ /dev/null
@@ -1,59 +0,0 @@
----
-name: xcode-cloud
-description: Set up, configure, or troubleshoot Xcode Cloud CI/CD workflows and custom build scripts, especially for iOS apps using XcodeGen. Use for requests about Xcode Cloud setup, ci_scripts (ci_post_clone.sh/ci_pre_xcodebuild.sh/ci_post_xcodebuild.sh), build/test/archive automation, or tag-pushing after archives.
----
-
-# Xcode Cloud
-
-## Overview
-
-Provide a repeatable setup for Xcode Cloud custom scripts, with ready-to-copy templates for XcodeGen generation and post-archive Git tagging.
-
-## Quick Start
-
-1. Identify the folder that contains the `.xcodeproj` or `.xcworkspace`.
-2. Check whether the `.xcodeproj`/`.xcworkspace` is tracked in git. If it is generated and
- ignored, you must use `ci_post_clone.sh` (or commit the generated project).
-3. Create `ci_scripts/` in that folder if missing.
-4. Copy templates from `assets/`.
-5. Customize variables noted in the templates.
-6. `chmod +x ci_scripts/*.sh`.
-7. In Xcode Cloud, add required secrets (for tagging) and ensure an Archive action exists.
-
-## Workflow: XcodeGen + Tagging
-
-### 1) Place scripts where Xcode Cloud expects them
-Create `ci_scripts/` at the same level as the `.xcodeproj`/`.xcworkspace`. Xcode Cloud only recognizes the three official filenames; use `ci_pre_xcodebuild.sh` (or `ci_post_clone.sh`) for XcodeGen and `ci_post_xcodebuild.sh` for tagging.
-
-### 2) XcodeGen project generation
-Use `ci_post_clone.sh` if your `.xcodeproj`/`.xcworkspace` is generated and not committed.
-Xcode Cloud validates the project path and schemes before `ci_pre_xcodebuild.sh` runs, so
-pre-xcodebuild is too late in that setup.
-Copy `assets/ci_post_clone.sh` to `ci_scripts/ci_post_clone.sh`.
-Use `ci_pre_xcodebuild.sh` only when the project already exists in the repo.
-Adjust the root detection if your `project.yml` is not at repo root.
-
-### 3) Tagging after successful archives
-Copy `assets/ci_post_xcodebuild.sh` to `ci_scripts/ci_post_xcodebuild.sh`.
-Set `INFO_PLIST_PATH` (or provide it as an Xcode Cloud env var).
-Set `TAG_PREFIX` if you want a custom prefix.
-Ensure the workflow includes an Archive action; otherwise the script will no-op.
-Add `GITHUB_TOKEN` as a secret environment variable in Xcode Cloud.
-
-### 4) Make scripts executable
-Run `chmod +x ci_scripts/*.sh` after adding or editing scripts.
-
-## Template Assets
-
-- `assets/ci_pre_xcodebuild.sh`: XcodeGen install + project generation (two-script setup)
-- `assets/ci_post_clone.sh`: XcodeGen install + project generation (alternative)
-- `assets/ci_post_xcodebuild.sh`: archive-only tag push using `GITHUB_TOKEN`
-
-## Notes
-
-- Use the `apple-docs-research` skill when you need official Apple documentation on Xcode Cloud behavior or environment variables.
-- Keep logs free of secrets; use Xcode Cloud secret environment variables for tokens.
-- Reference `references/xcode-cloud-notes.md` for quick reminders about doc lookups.
-- If you see `Project .xcodeproj does not exist at `, Xcode Cloud validated the
- project before your script ran. Fix by switching to `ci_post_clone.sh` or committing the
- generated project.
diff --git a/.agents/skills/xcode-cloud/assets/ci_post_clone.sh b/.agents/skills/xcode-cloud/assets/ci_post_clone.sh
deleted file mode 100644
index d98978a..0000000
--- a/.agents/skills/xcode-cloud/assets/ci_post_clone.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-# Xcode Cloud post-clone script: install XcodeGen and generate the project
-
-set -e
-
-echo "=== post-clone: XcodeGen setup ==="
-
-SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
-REPO_ROOT="${SCRIPT_DIR}/.."
-
-cd "$REPO_ROOT"
-
-if [ ! -f "project.yml" ]; then
- echo "ERROR: project.yml not found at repo root: $(pwd)"
- exit 1
-fi
-
-if command -v xcodegen >/dev/null 2>&1; then
- echo "XcodeGen already installed: $(xcodegen --version)"
-else
- echo "Installing XcodeGen..."
- brew install xcodegen
-fi
-
-echo "Generating Xcode project..."
-xcodegen generate
-
-echo "=== post-clone complete ==="
diff --git a/.agents/skills/xcode-cloud/assets/ci_post_xcodebuild.sh b/.agents/skills/xcode-cloud/assets/ci_post_xcodebuild.sh
deleted file mode 100644
index 763f39c..0000000
--- a/.agents/skills/xcode-cloud/assets/ci_post_xcodebuild.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/sh
-# Xcode Cloud post-xcodebuild script: tag successful archives
-
-set -e
-
-echo "=== post-xcodebuild: tag archive ==="
-
-# Skip on failures when exit code is available.
-if [ "${CI_XCODEBUILD_EXIT_CODE:-0}" != "0" ]; then
- echo "Build failed (exit code: ${CI_XCODEBUILD_EXIT_CODE}). Skipping tag."
- exit 0
-fi
-
-# Only tag archive actions (if action is set).
-if [ -n "${CI_XCODEBUILD_ACTION:-}" ] && [ "${CI_XCODEBUILD_ACTION}" != "archive" ]; then
- echo "Not an archive action (${CI_XCODEBUILD_ACTION}). Skipping tag."
- exit 0
-fi
-
-# Require a token to push tags.
-if [ -z "${GITHUB_TOKEN:-}" ]; then
- echo "GITHUB_TOKEN not set. Skipping tag push."
- exit 0
-fi
-
-# Configure these per project (or set them as Xcode Cloud env vars).
-INFO_PLIST_PATH="${INFO_PLIST_PATH:-Info.plist}"
-TAG_PREFIX="${TAG_PREFIX:-v}"
-
-if [ ! -f "$INFO_PLIST_PATH" ]; then
- echo "Info.plist not found at $INFO_PLIST_PATH. Skipping tag."
- exit 0
-fi
-
-MARKETING_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$INFO_PLIST_PATH" 2>/dev/null || true)
-BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$INFO_PLIST_PATH" 2>/dev/null || true)
-
-if [ -z "$MARKETING_VERSION" ] || [ -z "$BUILD_NUMBER" ]; then
- echo "Version/build missing in Info.plist. Skipping tag."
- exit 0
-fi
-
-TAG_NAME="${TAG_PREFIX}${MARKETING_VERSION}-build-${BUILD_NUMBER}"
-
-git config user.email "xcode-cloud@yourdomain.example"
-git config user.name "Xcode Cloud"
-
-echo "Creating tag: ${TAG_NAME}"
-git tag -a "${TAG_NAME}" -m "Xcode Cloud archive build ${BUILD_NUMBER}"
-
-REMOTE_URL="$(git remote get-url origin)"
-
-case "$REMOTE_URL" in
- https://*)
- AUTH_URL="$(printf "%s" "$REMOTE_URL" | sed "s#https://#https://x-access-token:${GITHUB_TOKEN}@#")"
- ;;
- git@github.com:*)
- HTTPS_URL="$(printf "%s" "$REMOTE_URL" | sed "s#git@github.com:#https://github.com/#")"
- AUTH_URL="$(printf "%s" "$HTTPS_URL" | sed "s#https://#https://x-access-token:${GITHUB_TOKEN}@#")"
- ;;
- *)
- echo "Unsupported remote URL: ${REMOTE_URL}"
- exit 0
- ;;
-esac
-
-echo "Pushing tag..."
-git push "$AUTH_URL" "$TAG_NAME"
-
-echo "=== tag push complete ==="
diff --git a/.agents/skills/xcode-cloud/assets/ci_pre_xcodebuild.sh b/.agents/skills/xcode-cloud/assets/ci_pre_xcodebuild.sh
deleted file mode 100644
index 0aa9fec..0000000
--- a/.agents/skills/xcode-cloud/assets/ci_pre_xcodebuild.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-# Xcode Cloud pre-xcodebuild script: install XcodeGen and generate the project
-
-set -e
-
-echo "=== pre-xcodebuild: XcodeGen setup ==="
-
-SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
-REPO_ROOT="${SCRIPT_DIR}/.."
-
-cd "$REPO_ROOT"
-
-if [ ! -f "project.yml" ]; then
- echo "ERROR: project.yml not found at repo root: $(pwd)"
- exit 1
-fi
-
-if command -v xcodegen >/dev/null 2>&1; then
- echo "XcodeGen already installed: $(xcodegen --version)"
-else
- echo "Installing XcodeGen..."
- brew install xcodegen
-fi
-
-echo "Generating Xcode project..."
-xcodegen generate
-
-echo "=== pre-xcodebuild complete ==="
diff --git a/.agents/skills/xcode-cloud/references/xcode-cloud-notes.md b/.agents/skills/xcode-cloud/references/xcode-cloud-notes.md
deleted file mode 100644
index e7501a8..0000000
--- a/.agents/skills/xcode-cloud/references/xcode-cloud-notes.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Xcode Cloud Notes
-
-Use official Apple documentation when you need exact environment variables or workflow behavior.
-Prefer the `apple-docs-research` skill for those lookups.
diff --git a/.agents/verify/spec-only.yaml b/.agents/verify/spec-only.yaml
index fbc0718..5f143fe 100644
--- a/.agents/verify/spec-only.yaml
+++ b/.agents/verify/spec-only.yaml
@@ -9,11 +9,14 @@ commands:
run: node --test docs/test/*.test.mjs
- id: instruction-parity-check
run: cmp -s AGENTS.md CLAUDE.md || { echo "AGENTS.md and CLAUDE.md must stay identical." >&2; exit 1; }
+ - id: managed-skill-ownership
+ run: bash scripts/check_managed_skill_ownership.sh
required_artifacts:
- paths.txt
required_pass_signals:
- spec-diff-check
- instruction-parity-check
+ - managed-skill-ownership
- public-front-door-check
failure_patterns:
- "error:"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ad4525b..dfa55d7 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -31,6 +31,9 @@ jobs:
- name: Public-surface scan
run: npm run verify:public-surface
+ - name: Managed skill ownership
+ run: bash scripts/check_managed_skill_ownership.sh
+
- name: broker-core tests
run: npm run test:broker-core
diff --git a/AGENTS.md b/AGENTS.md
index 39e0d70..65e99de 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -58,6 +58,9 @@ Use local operator-provided context if available. Do not commit private/local co
- Use `swiftui-pro` for SwiftUI scene structure, sidebars, toolbars, commands, search, settings, keyboard-driven desktop behavior, view refactors, window chrome, and modern macOS materials.
- Use `swift-concurrency-pro` for async service calls, task cancellation, actors, and cross-thread correctness.
- Use `apple-doc-research` when Apple framework, signing, packaging, notarization, or platform guidance is needed.
+- `code-review`, `harness-engineering`, `ios-xcodegen`,
+ `spec-creation-updating`, `xcode-build`, and `xcode-cloud` come from the
+ managed-global baseline and must not be copied into any project skill root.
### Gate B — Verification
diff --git a/CLAUDE.md b/CLAUDE.md
index 39e0d70..65e99de 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -58,6 +58,9 @@ Use local operator-provided context if available. Do not commit private/local co
- Use `swiftui-pro` for SwiftUI scene structure, sidebars, toolbars, commands, search, settings, keyboard-driven desktop behavior, view refactors, window chrome, and modern macOS materials.
- Use `swift-concurrency-pro` for async service calls, task cancellation, actors, and cross-thread correctness.
- Use `apple-doc-research` when Apple framework, signing, packaging, notarization, or platform guidance is needed.
+- `code-review`, `harness-engineering`, `ios-xcodegen`,
+ `spec-creation-updating`, `xcode-build`, and `xcode-cloud` come from the
+ managed-global baseline and must not be copied into any project skill root.
### Gate B — Verification
diff --git a/scripts/check_managed_skill_ownership.sh b/scripts/check_managed_skill_ownership.sh
new file mode 100755
index 0000000..6cf9a75
--- /dev/null
+++ b/scripts/check_managed_skill_ownership.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+repo_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
+cd "$repo_dir"
+
+managed_skills=(
+ code-review
+ harness-engineering
+ ios-xcodegen
+ spec-creation-updating
+ xcode-build
+ xcode-cloud
+)
+
+skill_roots=(
+ .agent/skills
+ .agents/skills
+ .claude/skills
+ .codex/skills
+ .cursor/skills
+ .opencode/skills
+)
+
+for root in "${skill_roots[@]}"; do
+ for skill in "${managed_skills[@]}"; do
+ target="$root/$skill"
+ if [[ -e "$target" || -L "$target" ]]; then
+ echo "managed-global skill must not be copied into this repository: $target" >&2
+ exit 1
+ fi
+ done
+done
+
+echo "managed skill ownership check passed"
diff --git a/spec/README.md b/spec/README.md
index c8bc2c8..1a48440 100644
--- a/spec/README.md
+++ b/spec/README.md
@@ -31,7 +31,8 @@ This repo exists to develop a reusable local simulator broker:
- repo bootstrapped
- agent harness copied and wired
- Codex instructions initialized
-- useful skills copied into `.agents/skills/`
+- shared skills resolved from the managed-global baseline and project-specific
+ skills retained under `.agents/skills/`
- product-specific seed material removed from the public source tree
- reusable implementation plan drafted in `spec/implementation-plan.md`
- file-backed `broker-core` first slice implemented in `broker-core/`
diff --git a/spec/agents.md b/spec/agents.md
index 8ebed67..b939218 100644
--- a/spec/agents.md
+++ b/spec/agents.md
@@ -36,12 +36,15 @@ Maintainers and agent runs still use `agent:context` / `agent:verify` /
- `swift-concurrency-pro` for async service calls, task cancellation, actors, and cross-thread correctness
- `apple-doc-research` when Apple framework, signing, packaging, notarization, or platform guidance is needed
+Shared names supplied by the managed-global baseline are not committed under
+project skill roots. Project-local skills remain source-owned in this repository.
+
## macOS app workflow contract
- `script/build_and_run.sh` is the canonical macOS app kill/build/run entrypoint for local work.
- `.codex/environments/environment.toml` must expose a `Run` action that points at `./script/build_and_run.sh`.
- Codex harness actions in `.codex/environments/environment.toml`, including `verify-specs`, must pass `--session-dir` under `${AGENT_HOME:-$HOME/.agents}/agent-harness/simulator-broker/`. The product slug is `simulator-broker`; it is not derived from `package.json` name `simulator-broker-app`.
-- App workflow changes should route through the repo-shipped skills above instead of ad hoc shell chains or undocumented local commands.
+- App workflow changes should route through the resolved skills above instead of ad hoc shell chains or undocumented local commands.
- When the app needs desktop-only behavior that SwiftUI cannot express cleanly, document the exact gap first and keep the implementation covered by `swiftui-pro` and `xcode-build`.
## Verification model
diff --git a/spec/build-and-test.md b/spec/build-and-test.md
index c40c3c0..5e2b822 100644
--- a/spec/build-and-test.md
+++ b/spec/build-and-test.md
@@ -49,8 +49,9 @@ A first extracted implementation slice now exists:
`Simulator-Broker-.zip` on GitHub Releases (signed/notarized app
from `payload/app/Simulator Broker.app` after `package_distribution.sh`,
not `package:local`). The cask pins the published zip SHA-256.
-- public GitHub-hosted Ubuntu CI runs `verify:public-surface`,
- `test:broker-core`, `test:client`, and `test:harness-adoption`; it does not
+- public GitHub-hosted Ubuntu CI runs `verify:public-surface`, the managed-skill
+ ownership check, `test:broker-core`, `test:client`, and
+ `test:harness-adoption`; it does not
run `test:app`. The job budget is 30 minutes. Broker tests that build an
app snapshot must inject the fixture `simctl` adapter. The default
public-surface scan reads index blobs only for dirty or missing worktree
@@ -204,6 +205,7 @@ npm run test:broker-core
npm run test:client
npm run test:harness-adoption
npm run verify:public-surface
+bash scripts/check_managed_skill_ownership.sh
node client/bin/simbroker.mjs lease --help
node client/bin/simbroker.mjs host --help
node client/bin/simbroker.mjs capacity --help
diff --git a/spec/global-simulator-broker.md b/spec/global-simulator-broker.md
index c783fb2..a48be9c 100644
--- a/spec/global-simulator-broker.md
+++ b/spec/global-simulator-broker.md
@@ -522,7 +522,8 @@ This repo is ready for public-source collaboration only if:
- copied product seed material is absent from the public tree
- public examples demonstrate adoption patterns without private product data
- agent harness commands run in this repo
-- useful skills are available locally in `.agents/skills/`
+- shared skills resolve from the managed-global baseline and project-specific
+ skills remain available under `.agents/skills/`
- a fresh agent can begin here without opening a private product repo first
- `verify:public-surface` runs in the normal gate, scans tracked text for real
home paths and prohibited local artifacts, and supports an ignored