Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
e3c60f9
Merge branch 'master' into development
Dani-Koza-AF Apr 15, 2026
ce46a97
DELIVERY-117000 (A/4): Split E2E vs smoke, scaffold RC smoke app, add…
Dani-Koza-AF Apr 26, 2026
07e0b3d
RC pipeline PR B: gate RC publish on E2E, remove deploy_to_qa (DELIVE…
Dani-Koza-AF Apr 26, 2026
ac365a6
DELIVERY-117000 (C/4): Add rc-smoke.yml, gate promote on rc-smoke/pub…
Dani-Koza-AF Apr 26, 2026
15f3d09
DELIVERY-117000 (D/4): RELEASE_USER_MANUAL.md and thin skill pointers…
Dani-Koza-AF Apr 27, 2026
36f1079
DELIVERY-115706: instrument example app for E2E + sync test plan to 6…
Dani-Koza-AF Apr 28, 2026
f8b6a0c
fix(android-e2e): bump example NDK to 28.2.13676358; dump logcat on f…
Dani-Koza-AF Apr 28, 2026
cb2c61e
fix(android-e2e): move logcat-on-failure to a script so sh -c parses it
Dani-Koza-AF Apr 28, 2026
9f52301
fix(e2e): bump wait_after_launch_sec from 25s to 60s for fresh-instal…
Dani-Koza-AF Apr 28, 2026
452d640
fix(android-e2e): write QA log file on Android, pull via run-as
Dani-Koza-AF Apr 29, 2026
766f068
chore(rc-release): skip Slack notify steps when dry_run=true
Dani-Koza-AF Apr 29, 2026
7c18bd4
fix(e2e): persist Android QA log synchronously and surface run-as state
Dani-Koza-AF Apr 29, 2026
2a3723c
Optimize RC pipeline with finer skip flags and clearer names
Dani-Koza-AF Apr 29, 2026
f6e0d3a
fix(ios-e2e): make custom-scheme deep links land in app, fix identity…
Dani-Koza-AF Apr 29, 2026
603fef6
fix(example): opt out of Flutter's built-in deep link handler on iOS …
Dani-Koza-AF Apr 29, 2026
513fd0a
Scope iOS log collection to the current Runner PID
Dani-Koza-AF May 3, 2026
e2c6523
Bypass iOS sim "Open in App?" prompt in deep-link phases
Dani-Koza-AF May 3, 2026
b26049c
Pick newest iOS runtime for E2E simulator boot
Dani-Koza-AF May 3, 2026
79fe369
Replay deep links via launch arg to bypass iOS sim prompt
Dani-Koza-AF May 3, 2026
6075d4d
Stabilize Android E2E and warm-app deep linking
Dani-Koza-AF May 4, 2026
e2e43f6
Replace fixed SDK-settle sleep with QA-marker polling
Dani-Koza-AF May 4, 2026
c635855
Fix Android warm-app deep link consumption race
Dani-Koza-AF May 4, 2026
67dd19a
Bump example startSDK and GCD timeouts to 90s for slow CI
Dani-Koza-AF May 4, 2026
d26a2ce
Disable bash 5.2 patsub_replacement in scenario runner
Dani-Koza-AF May 4, 2026
cdcb08d
Stabilize Android deep link E2E waits
Dani-Koza-AF May 4, 2026
c46b429
Speed up Android E2E log polling
Dani-Koza-AF May 4, 2026
fd8d431
Gate RC publish on aggregated CI + E2E and rework release Slacks
Dani-Koza-AF May 5, 2026
b9fe069
docs(changelog): add 6.18.0 entry
Dani-Koza-AF May 5, 2026
4456f79
fix(rc-release): build E2E from the cut release branch, not the calle…
Dani-Koza-AF May 5, 2026
21200ab
fix(android-e2e): pin emulator to public DNS, add connectivity precheck
Dani-Koza-AF May 5, 2026
9c0fa0a
Update CI simulator runner configuration
Dani-Koza-AF May 5, 2026
296ab39
fix(android-e2e): grant /dev/kvm perms so emulator gets KVM accel
Dani-Koza-AF May 5, 2026
0fe4746
fix(rc-smoke): mirror KVM perms + DNS pin from android-e2e
Dani-Koza-AF May 5, 2026
f4a753b
fix(android-e2e): collapse precheck retry to one line
Dani-Koza-AF May 5, 2026
f974a67
fix(android-e2e): drop ICMP ping precheck, use DNS as connectivity gate
Dani-Koza-AF May 5, 2026
7c22725
fix(rc-smoke): mirror android-e2e DNS connectivity gate
Dani-Koza-AF May 5, 2026
6d55aef
fix(rc-smoke): drop invalid `=` from pubspec version pin
Dani-Koza-AF May 6, 2026
0b080fb
fix(rc-smoke): port deep-link mechanic from .af-e2e/test-plan.json
Dani-Koza-AF May 6, 2026
d7af0b6
Merge branch 'master' into development
Dani-Koza-AF May 6, 2026
704c1f0
Merge branch 'master' into development
Dani-Koza-AF May 7, 2026
9638a52
Move release operator manual to tooling repo
Dani-Koza-AF May 7, 2026
8500cd5
Add AI delivery workflow tooling and feature catalog
Kobikg78 Jul 20, 2026
56db9d1
Add Swift Package Manager (SPM) support for Core (DELIVERY-125462)
Kobikg78 Jul 20, 2026
2435b02
Merge remote-tracking branch 'origin/development' into docs-workflow-…
Kobikg78 Jul 21, 2026
cc9671f
Merge remote-tracking branch 'origin/development' into DELIVERY-12546…
Kobikg78 Jul 21, 2026
dcef64f
Merge branch 'docs-workflow-and-feature-catalog' into DELIVERY-125462…
Kobikg78 Jul 21, 2026
365cc59
Remove af-delivery-workflow-template
Kobikg78 Jul 21, 2026
3b6a4b9
Merge branch 'docs-workflow-and-feature-catalog' into DELIVERY-125462…
Kobikg78 Jul 21, 2026
6c81517
Merge pull request #458 from AppsFlyerSDK/docs-workflow-and-feature-c…
Kobikg78 Jul 21, 2026
5a0630b
Fix SPM version-pin asymmetry with CocoaPods
Kobikg78 Jul 21, 2026
bd911e2
Rename docs/ to internal-docs/
Kobikg78 Jul 23, 2026
e7d8e58
Rename docs/ to internal-docs/ (#460)
Kobikg78 Jul 23, 2026
88f602f
Merge remote-tracking branch 'origin/development' into DELIVERY-12546…
Kobikg78 Jul 26, 2026
a6fe723
Remove plans/ and templates/ artifacts per review
Kobikg78 Jul 26, 2026
56be549
Add user-facing SPM guidance, fix stale path refs in F-060
Kobikg78 Jul 26, 2026
c6ba139
Reconcile F-060's verification status with actual E2E evidence
Kobikg78 Jul 26, 2026
c9b4da3
Merge pull request #459 from AppsFlyerSDK/DELIVERY-125462-spm-support
Kobikg78 Jul 26, 2026
ea59a82
Add independent Purchase Connector version inputs to rc-release.yml
Kobikg78 Jul 26, 2026
d5bc21f
Merge pull request #461 from AppsFlyerSDK/rc-release-independent-pc-v…
Kobikg78 Jul 26, 2026
8fe4d1b
Correct SPM + Purchase Connector guidance: mutually exclusive, not mi…
Kobikg78 Jul 26, 2026
5199b54
Merge pull request #462 from AppsFlyerSDK/spm-purchase-connector-guid…
Kobikg78 Jul 26, 2026
df73470
chore: prepare RC (iOS 6.18.1 / PC 6.18.2, Android 6.18.1)
github-actions[bot] Jul 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 163 additions & 0 deletions .claude/WORKFLOW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# AppsFlyer Flutter Plugin — AI Skill Workflow

> Last updated: auto-generated

Describes how the Claude Code skills communicate and which `docs/` directories each one reads or writes.

---

## Skill Communication & Docs Access

```mermaid
flowchart TD
User(["👤 User"])

User -->|"/af-ship"| Orch
User -->|"/af-ship-from-prd"| Orch
User -->|"/af-ship-from-tech-design"| Orch
User -->|"maintenance task"| Dave

Orch["🚦 af-ship-orch<br/>Entry router<br/>Creates tasks · fetches docs"]
Alice["👩‍💼 Alice PM<br/>alice-pm<br/>Owns: WHAT"]
Bob["👨‍🔬 Bob<br/>bob-flutter-researcher<br/>Owns: R-NNN docs"]
Erin["👩‍💻 Erin<br/>erin-flutter-analyst<br/>Owns: P-NNN docs"]
Dave["👨‍💻 Dave<br/>dave-flutter-engineer<br/>Owns: HOW + F-NNN docs"]

Orch -->|"delegates to"| Alice
Alice -->|"platform / API unclear"| Bob
Alice -->|"payloads / contracts affected"| Erin
Bob -->|"findings"| Alice
Erin -->|"field map"| Alice
Alice -->|"after Bob/Erin satisfied"| Dave
Dave -->|"code / tech design"| Alice
Alice -->|"unresolved after 2x"| User

subgraph docs ["📁 docs/"]
PRDs["prds/<br/>PRDs (staging)"]
TechDesigns["tech-designs/<br/>Tech designs (staging)"]
Features["features/<br/>F-NNN · feature catalog"]
IssueCases["issue-cases/<br/>IC-NNN · scar book<br/>GUARDRAILS.md"]
Researches["researches/<br/>R-NNN · research log"]
Payloads["payloads/<br/>P-NNN · field maps"]
end

Orch -.->|"saves fetched PRD"| PRDs
Orch -.->|"saves fetched tech design"| TechDesigns
Alice -.->|writes| PRDs
Alice -.->|reads| Features
Alice -.->|reads| IssueCases
Dave -.->|writes| TechDesigns
Dave -.->|reads + writes| Features
Dave -.->|reads| IssueCases
Bob -.->|writes| Researches
Bob -.->|reads| Features
Bob -.->|reads| IssueCases
Erin -.->|writes| Payloads
Erin -.->|reads| Features
Erin -.->|reads| IssueCases
```

**Solid arrows** = skill invocation (who calls whom).
**Dotted arrows** = docs read/write access.

---

## Docs Layer — Who Owns What

| Directory | Nickname | Owner | Consumers |
|-----------|----------|-------|-----------|
| `internal-docs/prds/` | PRDs (staging) | Alice (writes); af-ship-orch (saves external) | User review; may move to Notion |
| `internal-docs/tech-designs/` | Tech designs (staging) | Dave (writes); af-ship-orch (saves external) | User review; may move to Notion |
| `internal-docs/features/` | Feature catalog | Dave (writes F-NNN) | Alice, Bob, Erin (read) |
| `internal-docs/issue-cases/` | Scar book | Human / eng team | Alice, Dave, Bob, Erin (read) |
| `internal-docs/researches/` | Research log | Bob (writes R-NNN) | Alice (via challenge loop) |
| `docs/payloads/` | Payload map | Erin (writes P-NNN, FIELD_MAP) | Alice, Dave (via challenge loop) |

---

## Invocation Rules

| Entry point | When |
|-------------|------|
| `/af-ship <description>` | Starting a new feature from scratch |
| `/af-ship --prd <url-or-path>` | Starting from an existing PRD (Notion URL or local .md) |
| `/af-ship --tech-design <url-or-path>` | Starting from an existing tech design (Notion URL or local .md) |
| `/af-ship-from-prd <url-or-path>` | Same as `--prd` flag; dedicated command alternative |
| `/af-ship-from-tech-design <url-or-path>` | Same as `--tech-design` flag; dedicated command alternative |
| Dave (direct) | Maintenance only: logs, renames, dead-code removal, comment cleanup, test additions, minor refactors with no public API change |
| Bob (direct) | Ad-hoc platform/API research not tied to a feature |
| Erin (direct) | Ad-hoc payload or schema analysis not tied to a feature |
| Bob | Invoked by Alice when platform API / version / external behavior is unclear |
| Erin | Invoked by Alice when payloads, request fields, or server-visible schema is affected |

If unsure whether a task is maintenance or a feature → use `/af-ship`.

---

## Loop Mechanics

**New feature from scratch:**
```
/af-ship <description>
→ af-ship-orch creates task wizard → calls alice-pm
→ Alice writes PRD → saves to internal-docs/prds/<slug>.md → asks user to review
→ User approves PRD
→ Alice invokes Bob and/or Erin if needed
→ Bob/Erin produce findings → Alice challenges (max 2 iterations)
→ Alice updates PRD if scope changed → Alice invokes Dave
→ [Phase 1 / 2 / 3 below]
```

**From existing PRD:**
```
/af-ship-from-prd <url-or-path> (or /af-ship --prd <url-or-path>)
→ af-ship-orch fetches / reads PRD → saves to internal-docs/prds/<slug>.md → calls alice-pm
→ Alice challenges PRD for completeness → resolves gaps with user
→ Alice delegates to Bob/Erin/Dave (no second review pause)
→ [Phase 1 / 2 / 3 below]
```

**From existing tech design:**
```
/af-ship-from-tech-design <url-or-path> (or /af-ship --tech-design <url-or-path>)
→ af-ship-orch fetches / reads tech design → saves to internal-docs/tech-designs/<slug>.md → calls alice-pm
→ Alice runs full challenge agenda → Dave addresses issues (max 2 iterations)
→ Alice: "Satisfied — Dave, this is ready."
→ [Phase 2 / 3 below — Phase 1 skipped, PRD gate bypassed]
```

**Phase 1 — Tech design**
```
→ Dave writes tech design → saves to internal-docs/tech-designs/<slug>.md
→ Alice challenges tech design (max 2 iterations)
→ Alice: "Satisfied — Dave, this is ready."
→ Dave asks user to review tech design
→ User approves tech design
```

**Phase 2 — Implementation**
```
→ Dave implements + writes unit tests
→ Alice challenges implementation (max 2 iterations)
→ Alice: "Satisfied — Dave, this is ready."
```

**Phase 3 — Feature doc**
```
→ Dave runs impact scan → updates any affected existing F-NNN docs
→ Dave writes new F-NNN feature doc → saves to internal-docs/features/
→ Alice challenges feature doc (max 2 iterations)
→ Alice: "Satisfied — Dave, this is ready."
```

Escalation: if any item is unresolved after 2 full challenge loops → Alice escalates to User.

---

## Authority Map

| Question | Owner |
|----------|-------|
| WHY — strategy, business goal | User (escalated by Alice) |
| WHAT — requirements, scope, acceptance criteria | Alice |
| HOW — architecture, implementation, tech tradeoffs | Dave |
115 changes: 115 additions & 0 deletions .claude/commands/af-quiz-me.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
Generate an interactive HTML quiz from a tech design document.

## Step 1 — Resolve the document

**If $ARGUMENTS is empty:**
List all `.md` files in `internal-docs/tech-designs/`.
- If files exist, list them and ask:
"Which tech design should I quiz you on? (Reply with the number or filename)
Or reply **project** to generate a quiz covering the whole project from the feature catalog."
Wait for the user's selection before continuing.
- If the folder does not exist or is empty, ask:
"No tech designs found in `internal-docs/tech-designs/`. What would you like to do?
1. Provide a path or Notion URL (reply with the path/URL)
2. Generate a project quiz from the feature catalog (reply **project**)"
Wait for the user's reply before continuing.

**If the user replies `project` (or $ARGUMENTS is `project`):**
Check whether `internal-docs/features/INDEX.md` exists.
- If it does not exist, stop and say:
"No feature catalog found. Run `/af-generate-feature-catalog` first to build `internal-docs/features/`, then try again."
- If it exists, read `internal-docs/features/INDEX.md` to get the full list of features, then read each individual `internal-docs/features/F-*.md` file.
Set `<slug>` to `project` and `<title>` to the project name derived from `INDEX.md` (e.g. `MyProject — Project Quiz`).
Proceed to Step 3 in **project mode** (random 10 questions across all features).

**If $ARGUMENTS is provided (and not `project`):**
- Starts with `http` → fetch using the `notion-fetch` MCP tool.
- Otherwise → read the file at the given path directly.

## Step 2 — Derive the feature slug and title

From the document title or filename, derive:
- `<slug>` — kebab-case short name (e.g. `sharedprefs-encryption`)
- `<title>` — human-readable title for display (e.g. `SharedPreferences Encryption`)

## Step 3 — Generate 10 quiz questions

Read the resolved document(s) in full. Generate exactly 10 questions as a JSON array
using this exact structure:

```json
[
{
"q": "Question text",
"opts": ["Option A", "Option B", "Option C", "Option D"],
"ans": 2,
"exp": "One-sentence explanation of why the correct answer is correct."
}
]
```

- `ans` is the zero-based index of the correct option (0–3).
- Every question must have exactly 4 options.

### Answer position distribution

Before writing the JSON, randomly assign a correct answer position (0–3) for
each of the 10 questions. No single index may appear more than 3 times across
the set, ensuring the correct answers are spread across A, B, C, and D.

For each question, place the correct option at its assigned position and fill
the remaining slots with distractors. Set `ans` to match.

Never write all questions with the correct answer at index 0 — this is the
natural default when drafting distractors after the correct answer, and it
must be explicitly overridden.

### What to quiz on

**Tech design mode** — focus on:
- Business problem and motivation — why this feature exists
- Customer or user impact — who benefits and how
- Product goals and success criteria — what done looks like
- Scope and non-goals — what is in vs out
- Key decisions and tradeoffs — why the chosen approach over alternatives
- Risks and mitigations — what could go wrong and how it is handled
- Integration and rollout — how this lands in the product

**Project mode** — pick 10 questions randomly across all features, covering:
- What a feature does and why it exists (Business Purpose)
- What the product loses if a feature is removed
- How features depend on or interact with each other
- What triggers a feature and what it produces
- Known limitations or platform gaps
- Ensure broad spread: do not pick more than 2 questions from the same feature

### What NOT to quiz on

- Exact field names, formula strings, or API parameter names
- Specific numeric constants or thresholds (unless they represent a product decision)
- Low-level implementation details only the author would know
- Trivia answerable by ctrl+F rather than understanding

## Step 4 — Build the output file

Read the template from `templates/af-tech-quiz-template.html`.

Replace both placeholders:
- `{{QUIZ_TITLE}}` → the human-readable title from Step 2 (appears twice: in <title> and in JS)
- `{{QUESTIONS_JSON}}` → the full JSON array from Step 3 (no trailing semicolon — the template already has one)

Create the output directory if it does not exist:
```bash
mkdir -p output.af-tech-quiz
```

Write the result to `output.af-tech-quiz/af-tech-quiz-<slug>.html`.

## Step 5 — Open in browser

Run:
```bash
open output.af-tech-quiz/af-tech-quiz-<slug>.html
```

Then tell the user: "Quiz saved to `output.af-tech-quiz/af-tech-quiz-<slug>.html` and opened in your browser."
12 changes: 12 additions & 0 deletions .claude/commands/af-ship-from-prd.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
If $ARGUMENTS is empty, stop and ask:
"Please provide a Notion URL or a path to a local .md file for the PRD.
Example: `/af-ship-from-prd https://notion.so/team/my-prd`
Example: `/af-ship-from-prd internal-docs/prds/my-feature.md`"
Do not proceed until the user provides a URL or path.

Start the feature delivery workflow using an existing PRD.
The PRD source is: $ARGUMENTS

Invoke the `af-ship-orch` skill now in PRD-Given mode.
It will fetch and save the PRD, then call Alice to challenge it for completeness,
resolve gaps with you, and delegate to Bob/Erin/Dave.
12 changes: 12 additions & 0 deletions .claude/commands/af-ship-from-tech-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
If $ARGUMENTS is empty, stop and ask:
"Please provide a Notion URL or a path to a local .md file for the tech design.
Example: `/af-ship-from-tech-design https://notion.so/team/my-design`
Example: `/af-ship-from-tech-design internal-docs/tech-designs/my-feature.md`"
Do not proceed until the user provides a URL or path.

Start the delivery workflow using an existing tech design.
The tech design source is: $ARGUMENTS

Invoke the `af-ship-orch` skill now in Tech-Design-Given mode.
It will fetch and save the tech design, then call Alice to run her full challenge agenda,
work with Dave to resolve any issues, then proceed to implementation after your approval.
40 changes: 40 additions & 0 deletions .claude/commands/af-ship.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
Check $ARGUMENTS for flags before doing anything else:

**If $ARGUMENTS starts with `--prd `:**
Extract the URL or path that follows `--prd `.
If nothing follows `--prd`, stop and ask:
"Please provide a Notion URL or local .md path after --prd
(e.g. `/af-ship --prd https://notion.so/team/my-prd`)."
Do not proceed until a URL or path is provided.
Otherwise: invoke the `af-ship-orch` skill in PRD-Given mode.
The PRD source is the value extracted from $ARGUMENTS after `--prd `.

**If $ARGUMENTS starts with `--tech-design `:**
Extract the URL or path that follows `--tech-design `.
If nothing follows `--tech-design`, stop and ask:
"Please provide a Notion URL or local .md path after --tech-design
(e.g. `/af-ship --tech-design internal-docs/tech-designs/my-feature.md`)."
Do not proceed until a URL or path is provided.
Otherwise: invoke the `af-ship-orch` skill in Tech-Design-Given mode.
The tech design source is the value extracted from $ARGUMENTS after `--tech-design `.

**If $ARGUMENTS starts with `--` (unrecognized flag):**
Stop and ask:
"Unrecognized flag. Supported flags are:
- `--prd <url-or-path>` — start from an existing PRD
- `--tech-design <url-or-path>` — start from an existing tech design
Or provide a feature description directly (e.g. `/af-ship add dark mode`)."
Do not proceed.

**If $ARGUMENTS contains no flags (default — new feature from scratch):**
If $ARGUMENTS is empty or contains only one word, stop and ask:
"What feature would you like to implement? Please give a short description
(e.g. `/af-ship add dark mode to settings screen`)."
Do not proceed until the user provides a description.
Otherwise, start the full feature delivery workflow for the following feature:

$ARGUMENTS

Invoke the `af-ship-orch` skill now to begin. It will set up the workflow tasks,
then hand off to Alice to write a PRD, coordinate research and engineering
through tech design, implementation, and feature documentation.
Loading
Loading