Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
a54366b
Merge pull request #6865 from TrainLCD/chore/dev-from-master
TinyKitten Sep 5, 2026
c718d32
Bump version for canary release (#6867)
github-actions[bot] Sep 6, 2026
4a4d6e9
英語TTSで「Keisei」が「かいせい」と読まれる誤読を読み上げ直前の表記置換で修正 (#6869)
TinyKitten Sep 6, 2026
30f927c
Bump version for canary release (#6871)
github-actions[bot] Sep 6, 2026
f98c284
リモートTTSへは「Keisei」の読み替えを適用せず原文のまま送るよう端末内蔵TTS限定に変更 (#6872)
TinyKitten Sep 6, 2026
a6de12e
Bump version for canary release (#6874)
github-actions[bot] Sep 6, 2026
be360b6
英語TTSで「Seibu」が「さいぶ」と読まれる誤読を端末内蔵TTS向けの読み替え表に追加して修正 (#6876)
TinyKitten Sep 6, 2026
57cfb06
全ナンバリングアイコンでAndroidのグリフ上下ズレを補正 (#6875)
TinyKitten Sep 6, 2026
ce25d9f
Bump version for canary release (#6878)
github-actions[bot] Sep 6, 2026
9a2d0bc
Kotlinデーモンのメタスペース上限を明示してAndroidリリースビルドのOutOfMemoryErrorを解消 (#6879)
TinyKitten Sep 7, 2026
83dbb5e
Bump version for canary release (#6881)
github-actions[bot] Sep 7, 2026
99f9a49
iOSでリモートTTSが使えない回の日本語をVOICEVOX(端末内合成)で読み上げるフォールバックを追加 (#6882)
TinyKitten Sep 8, 2026
63ccb3d
Bump version for canary release (#6886)
github-actions[bot] Sep 8, 2026
0ea3b5d
VOICEVOXモジュールで曖昧になるVoicevoxResultCode型の参照をInt32に置き換えてiOSビルドを修正 (#6887)
TinyKitten Sep 8, 2026
472a188
Bump version for canary release (#6889)
github-actions[bot] Sep 8, 2026
4218017
voicevox_onnxruntimeのCFBundleIdentifierに含まれるアンダースコアを取得時にハイフンへ正規化してiOS…
TinyKitten Sep 8, 2026
ca137e9
Bump version for canary release (#6892)
github-actions[bot] Sep 8, 2026
bce4657
VOICEVOXフレームワークを取得時にad-hocで署名し直して署名識別子をCFBundleIdentifierに揃えTestFligh…
TinyKitten Sep 8, 2026
2f5f16e
Bump version for canary release (#6895)
github-actions[bot] Sep 8, 2026
1909ee4
オフライン用日本語音声の案内文をダウンロードしなくても端末内蔵音声で読み上げられることが分かる表現に改める (#6897)
TinyKitten Sep 8, 2026
0bfff19
速度フィルタの基準をEMA後ではなく生座標にして新幹線速度での現在地凍結を修正 (#6898)
TinyKitten Sep 8, 2026
6158650
Bump version for canary release (#6901)
github-actions[bot] Sep 8, 2026
20ea9eb
測位パイプラインを実際に通して検証するためのGPX生成スクリプトと新幹線サンプルを追加 (#6899)
TinyKitten Sep 8, 2026
d2d9e41
GPXをAndroidのテストプロバイダへ流して実機の測位パイプラインを検証するスクリプトとスキルを追加 (#6902)
TinyKitten Sep 8, 2026
c03a1aa
argentツールキットをv0.24.0へ更新して物理iPhone対応とQAフローのスキルを取り込む (#6903)
TinyKitten Sep 8, 2026
9416229
位置テレメトリにアプリバージョン・プラットフォーム・チャネルを付与してTHQ側でビルド間比較できるようにする (#6904)
TinyKitten Sep 9, 2026
66baf06
Bump version for canary release (#6906)
github-actions[bot] Sep 9, 2026
240472a
警告パネルの既読状態を種別ごとに保持してオートモード通知の再表示を防止 (#6908)
TinyKitten Sep 9, 2026
1b9450a
Bump version for canary release (#6910)
github-actions[bot] Sep 9, 2026
b7f3855
列車種別グループのlineGroupIdからGPXを生成できるようにして通過駅をstopConditionから自動判定 (#6911)
TinyKitten Sep 9, 2026
0eaa1d5
測位が速度を持たない場合にDEV OVERLAYの速度を変位から算出して表示 (#6913)
TinyKitten Sep 9, 2026
47fb6f6
Bump version for canary release (#6915)
github-actions[bot] Sep 9, 2026
a6e6eb0
EMAスムージングのαを測位の配信間隔で正規化して到着判定が駅の直前までずれ込む不具合を修正 (#6917)
TinyKitten Sep 10, 2026
7232dde
Bump version for canary release (#6919)
github-actions[bot] Sep 10, 2026
90a3364
GPXの置き場所をiosディレクトリからassets配下へ移し総武快速線のサンプルを追加 (#6920)
TinyKitten Sep 10, 2026
e9c5acd
エージェント向け手順書に分岐の前提検証・指摘の解釈確認・承認範囲の遵守を追加 (#6923)
TinyKitten Sep 10, 2026
400b4a0
リモートTTSを強制的に有効・無効へ切り替えられる試験的機能を追加 (#6922)
TinyKitten Sep 10, 2026
b28e34a
Bump joi from 17.13.3 to 17.13.7 (#6912)
dependabot[bot] Sep 10, 2026
40dc00f
Bump js-yaml from 3.14.2 to 3.15.2 (#6885)
dependabot[bot] Sep 10, 2026
1e1181b
Bump version for canary release (#6925)
github-actions[bot] Sep 10, 2026
ef47aad
外観設定の「自動」ラベルから自明なカッコ書きを削除 (#6926)
TinyKitten Sep 10, 2026
6a70e41
Bump version for canary release (#6928)
github-actions[bot] Sep 10, 2026
8a0ac7c
回転ラッパー外の開発者オーバレイでドラッグが軸ずれする問題を修正 (#6929)
TinyKitten Sep 10, 2026
7cb3798
Bump version for canary release (#6935)
github-actions[bot] Sep 10, 2026
dc502b0
VOICEVOX資産のstaging配信先の手順を設計書に追記 (#6933)
TinyKitten Sep 10, 2026
4a08d8c
エージェント向け手順書に既存実装の経緯確認と既存テストの扱いを明文化 (#6937)
TinyKitten Sep 11, 2026
3f2e7d9
ETAが許す進行量を超える測位を棄却して地下鉄で無関係な駅へ飛ぶのを防ぐ (#6939)
TinyKitten Sep 11, 2026
71b746c
Bump version for canary release (#6941)
github-actions[bot] Sep 11, 2026
9c6e71d
ETA補助を有効にした状態でassets/gpx配下の全GPXを測位パイプラインへ流す回帰テストを追加 (#6942)
TinyKitten Sep 11, 2026
2d4700b
設定画面とフィードバックモーダルによくある質問への導線を追加 (#6943)
TinyKitten Sep 11, 2026
d11782e
Bump version for canary release (#6945)
github-actions[bot] Sep 11, 2026
a7f02d9
ビルドワークフローにSENTRY_DSNを渡してCI製ビルドから例外が送信されない問題を修正 (#6946)
TinyKitten Sep 11, 2026
3045420
よくある質問をアプリ内ブラウザで開き設定画面の項目に外部リンクの印を付ける (#6947)
TinyKitten Sep 11, 2026
e5c7eb3
Bump version for canary release (#6949)
github-actions[bot] Sep 11, 2026
ee6e456
実走で到着判定を悪化させたETA到着圏緩和(R1)を廃止 (#6950)
TinyKitten Sep 11, 2026
fc1829d
Bump version for canary release (#6952)
github-actions[bot] Sep 11, 2026
c0a6c39
ストア版と同居できるAndroidのlocalビルドバリアントを追加 (#6954)
TinyKitten Sep 11, 2026
c8b8969
エージェント向けドキュメントのバージョン管理手順をjjからgitへ戻す (#6953)
TinyKitten Sep 11, 2026
ea5ec7f
v10.15.1 をリリース
TinyKitten Sep 11, 2026
992a429
行き先ナンバリングが消える駅番号indexの取り違えを修正 (#6956)
TinyKitten Sep 12, 2026
e5404dc
ポートレートのステート表示を省略せず全文出す (#6957)
TinyKitten Sep 12, 2026
e2db2d7
Bump version for canary release (#6959)
github-actions[bot] Sep 12, 2026
7bf4717
地下鉄で到着表示が最大90秒遅れるETA棄却のデッドロックを解消 (#6960)
TinyKitten Sep 12, 2026
3054072
devの最新をv10.15.1リリースブランチへ取り込み
claude Sep 12, 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
309 changes: 30 additions & 279 deletions .agents/skills/argent-create-flow/SKILL.md

Large diffs are not rendered by default.

240 changes: 240 additions & 0 deletions .agents/skills/argent-create-flow/references/flow-yaml.md

Large diffs are not rendered by default.

264 changes: 264 additions & 0 deletions .agents/skills/argent-create-flow/references/live-authoring.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# Reliability and recovery

Read this file for selector warnings, raw coordinates, unavailable trees, swallowed actions, overlays, or replay failures.

- [Coordinate fallback gate](#coordinate-fallback-gate)
- [iOS selector recovery](#ios-selector-recovery)
- [Other tree sources](#tree-source-recovery-on-android-chromium-and-vega)
- [Strong transition gates](#strong-transition-gates)
- [Obscured targets](#obscured-targets-and-persistent-overlays)
- [Replay diagnosis](#diagnose-a-replay-failure)
- [Corrections](#correct-the-smallest-justified-unit)

## Coordinate fallback gate

Use this target order:

1. A strict stable id.
2. Narrow, stable text or accessibility label.
3. A stable role only when it is unique.
4. `scroll-to` plus one of those selectors for an off-screen target.
5. Raw coordinates only after the checks below.

Convert element-seeking swipes to `scroll-to`. Keep a coordinate swipe only when the gesture itself is the tested action and no directive expresses it.

### Run the gate when capture warns

Work this gate as soon as capture warns that it kept a raw point — and equally when it silently recorded a role-only selector, which warns about nothing. Keep the source screen available and do these checks:

1. **iOS:** query plausible ids or labels with `native-find-views`. If no term is useful, call `native-full-hierarchy` with narrow fields and `maxDepth: 100`. `describe` and `native-describe-screen` are accessibility projections. They cannot prove that no flow selector exists.
2. **Other platforms:** use `debugger-component-tree` for React Native; otherwise, use `describe`. Verify Android and Chromium candidates in step 3. Their discovery trees can omit runner elements.
3. Test each candidate in a scratch fragment with `assert: { visible: <candidate> }` on the valid screen. Inspect every failure before trying a better id, label, app, or container.
4. If source is available, inspect its `testID`, `accessibilityIdentifier`, or `resource-id`. If none exists, report the missing stable id as the real fix.

An unavailable tree makes the candidate test void. It proves the tree was absent, not that the selector failed, so it never authorizes coordinates. Relevant failures include `native devtools is unavailable` or `No native-devtools-connected apps are available` on iOS, an unreachable Android helper, an unreachable Chromium CDP session, or missing Vega page source. The recorder quotes the same reason back in its `selector capture failed` warning, so read that warning before treating it as a verdict about the element. Restore the tree and repeat the test.

Keep coordinates only for a genuinely unlabeled target or after all plausible labeled candidates fail against a working flow tree. Add an echo naming the target and a hard check on the action's outcome. Report the point, discovery results, and candidate failures. Re-record every uncleared point.

QA flows are stricter. They can keep a coordinate only for a genuinely unlabeled target. Failed selector candidates alone are insufficient.

## iOS selector recovery

The full iOS flow tree exists only for an app launched by Argent with instrumentation.

1. If Metro, Expo, Xcode, an icon, or a prior process launched the app, call `restart-app`. Restore the source screen and retry capture. `launch-app` can only foreground the existing process.
2. Tap capture does **not** wait for that connection. It makes one tree read and turns any failure straight into the kept-coordinates warning. A recording-time `restart-app` returns before the devtools connection opens, so the first tap after a restart can warn transiently. Re-record that tap once before escalating; only a warning that survives the retry is evidence of a real fault.
3. If the warning survives, call `native-devtools-status` with the same UDID and bundle id and follow its `message`, which names the one action that helps and says when to stop. `requiresRestart` covers only the states a fresh process fixes: an `unregistered` or `connecting` app reports it false, because it already launched under the terms a restart would recreate.
4. If an injectable app remains disconnected, call `stop-all-simulator-servers` once, **scoped to `devices: [<this simulator's UDID>]`**. One tool-server serves every agent on this Argent install, so an unscoped call tears down their devices too. This does not change app or account data. Then restart and check status again.
5. If it still fails, report an instrumentation blocker. Do not replace selectors with coordinates in a QA flow.

Use the same explicit UDID throughout. Multiple booted simulators are not an injection fault. Pass `--device <udid>` when standalone selection is ambiguous.

### Terminally non-injectable iOS apps

This fallback applies only to `com.apple.*` system apps. A connection failure in another app never authorizes it.

Argent refuses `com.apple.*` bundle ids at every native-devtools read that names one, because a system app is never the app under test. The instrumentation has been seen both loading and not loading into one, depending on the simulator runtime — either way it is no basis for a selector. `restart-app`, `launch-app`, and `describe` still work on one; it just never gets a flow tree.

Give the flow a `launch:` step as usual. On iOS the launch waits the full devtools budget out, then passes for one of these bundle ids: starting the app is all that step is for, and a coordinate-driven flow needs nothing more. The flow stays e2e; it just pays roughly sixteen seconds at the launch. Where the refusal bites is selector resolution, and the first selector step reports it there — terminally, naming the coordinate remedy — rather than as a launch failure. The rest of the tree-free form:

- Raw `tool: await-ui-element` accessibility checks.
- Point taps or long-presses derived from `describe`, each named by an echo.
- A point focus tap plus a raw text-only `keyboard` with `delayMs: 500`, and a second raw `keyboard` with `key: "enter"` to submit.
- Raw swipes with `momentum: false` because `scroll-to` needs the missing flow tree. Momentum-free scrolling keeps later coordinate taps valid. `momentum: false` needs `durationMs` of at least 150 and is rejected below it, so keep the 300 default or raise it.

Every point tap, long-press or coordinate swipe in such a flow passes **carrying a warning** for as long as the app serves no tree: each [selector-less gesture](flow-yaml.md#directives) dispatches unsettled. Nothing here repairs it. Accept the warnings, read each green as "the gesture was sent, not that it landed", and put an explicit `wait:` or a raw `tool: await-ui-element` before a gesture that follows a transition. Raw `tool:` steps take no settle, so they never carry that warning.

A recorded wait carries a different warning: it adds about one second and reports that the runner tree is unavailable. That warning is expected too. Keep the wait as a raw `tool:` step.

Report that the flow has no flow tree and its coordinates are not portable. It cannot satisfy the QA contract. Report the artifact and platform blocker instead.

A normally injectable app that is broken in the environment gets the same coordinate-only treatment, but not the same launch: there the `launch:` step fails, since the gate withholds its verdict only for a bundle id argent refuses outright. Start such a flow with a raw `tool: restart-app`, which terminates and relaunches without the readiness gate, and accept that the result is a **fragment** — its first non-echo step is not `launch:`, so the runner never classifies it as e2e, and it cannot complete `argent-qa-flows`, which requires a leading `launch:`. Report the blocker rather than labeling that fallback a completed QA test.

## Tree source recovery on Android, Chromium, and Vega

While the required source is down, selector failures and raw-point capture are void. Restore the source and re-record affected taps.

| Platform | Symptom | Recovery |
| -------- | -------------------------------- | ------------------------------------------------------ |
| Android | Cannot reach the devtools helper | Unlock the device, allow `adb install -t`, and rerun |
| Chromium | No reachable CDP session | Boot again with `electronAppPath` and remote debugging |
| Vega | Toolkit returns no page source | Relaunch an app built with automation support |

On Android, healthy `describe` output does not prove the flow tree is available. It can fall back to legacy `uiautomator`, while the runner refuses that trimmed fallback.

## Strong transition gates

Every navigation needs destination identity followed by readiness. Do not identify a screen with a shared header, persistent tab bar, source element, positional id, counter, username, timestamp, or other data-derived value.

Prefer navigation with a fixed destination. A back button or swipe pops one stack entry, so repeated visits can change its destination. Use back only when back navigation is under test, and gate its result like any other screen change.

## Obscured targets and persistent overlays

A selector tap can resolve the intended element while an overlay receives the touch.

When an overlay intersects the next target:

1. Record the overlay as `visible` while it exists.
2. Record its real dismissal action.
3. Record the same selector as `hidden`.
4. Only then touch the covered region.

Do not rely on auto-dismiss timers. Prefer an app e2e affordance that disables transient overlays. On iOS, use `native-user-interactable-view-at-point` for hit-test diagnosis. Other platforms rely on the recorded visibility trio.

Keep a dismissal swipe only when the UI supports it. Pass it through the coordinate gate and hard-check that the overlay disappeared.

## Diagnose a replay failure

Classify before editing:

| Outcome | Meaning | Response |
| ------------------ | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Hard failure | A step fails and later steps skip | Inspect that step and actual state |
| Environment error | The reason says the check could not run | Repair the environment and rerun; it is no verdict about the app. A failed `launch:` is `errored` too but **is** a verdict — treat it as a hard failure |
| Silent misfire | The run passes but final state is wrong | Restore the first wrong screen and record a stronger gate |
| Partial divergence | An intermediate result disagrees with its echo | Find the first divergent transition |
| Acceptance failure | Actions pass but a requested check fails | Preserve the check and investigate behavior |
| Idle warning | A readiness step passes without settling | Read [which of the six warnings](flow-yaml.md#idle-readiness) it is, then gate the next action on a stable element |
| Unsettled gesture | A selector-less gesture passes unsettled | Restore the tree source, usually by relaunching the app; the green says [only that the gesture was sent](flow-yaml.md#directives) |

Then:

1. Record the first failure or divergence index and message.
2. Capture `screenshot` and `describe`. Use native or React Native discovery when needed.
3. Compare actual state with the preceding echo and expected destination.
4. Classify the cause: selector, screen, missing element, readiness, stale data, optional interstitial, or product behavior.
5. State the diagnosis in one sentence before correcting it.

## Correct the smallest justified unit

- For one parameter or selector error, edit the YAML and prefer a stable selector.
- For readiness or identity failure, repair that gate and audit every transition with the same shape.
- For one missing transition or two to three structural steps, copy the working prefix and re-record the affected span live.
- For four or more broken steps, unclear state, or a comparison or profiling flow, fully re-record.
- Treat manual recovery as diagnosis only. It never counts as a replay pass.

Starting again under the same name truncates the YAML. Copy any working prefix before re-recording.

### Make every replacement gate stronger

| Weak gate | Do not use | Add the missing proof |
| ----------------------------- | -------------- | ----------------------------------------- |
| Shared or positional identity | Longer timeout | Destination-only root or control |
| Tap lost during motion | Fixed wait | `idle` after destination identity |
| Toast absorbs tap | Retry | Verified overlay dismissal |
| `hidden` never established | Longer timeout | Same-selector `visible`, action, `hidden` |
| Typed value is wrong | Retype | Assert the committed value |

State the added proof before rerunning.

### Correction limit

After each correction, audit and replay from the declared start. Stop after two unsuccessful correction cycles and report the remaining blocker. If failures move while the flow grows, re-record the affected span instead of adding more patches.

Never weaken, remove, or hide a requested check to obtain a pass. Keep a failing product check and report the flow as an unproven regression artifact. QA remains incomplete until its two-pass gate succeeds.
Loading
Loading