Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e485077
Preserve Roadmap display options
SIkebe Aug 25, 2026
04c909a
Remove obsolete compatibility paths
SIkebe Aug 25, 2026
2a4251f
Harden Roadmap display validation
SIkebe Aug 25, 2026
5e76dcf
Make Roadmap capture fail independently
SIkebe Aug 25, 2026
fb328d2
Validate required schema-v2 template state
SIkebe Aug 25, 2026
58de71b
Exercise rendered Roadmap output in shared E2E
SIkebe Aug 25, 2026
8892134
Add mixed-state Roadmap fixture coverage
SIkebe Aug 25, 2026
4e45bdb
Centralize Roadmap rendering selectors
SIkebe Aug 25, 2026
df3bd58
Count only visible Roadmap dates
SIkebe Aug 25, 2026
e42898a
Model Roadmap display options as shared state
SIkebe Aug 25, 2026
b2be781
Revert "Harden Roadmap display validation"
SIkebe Aug 25, 2026
52e07fc
Revert "Preserve Roadmap display options"
SIkebe Aug 25, 2026
e58b1fc
Document unsupported Roadmap display controls
SIkebe Aug 25, 2026
04e88ef
Reject incomplete schema-v2 snapshots
SIkebe Aug 25, 2026
6420d8d
Normalize malformed snapshot errors
SIkebe Aug 25, 2026
ca885b2
Require explicit schema-v2 state
SIkebe Aug 25, 2026
29a938f
Align schema-v2 documentation
SIkebe Aug 25, 2026
ebe404a
Reapply "Preserve Roadmap display options"
SIkebe Aug 26, 2026
974ee0e
Reapply "Harden Roadmap display validation"
SIkebe Aug 26, 2026
23a6953
Persist browser-only view settings across sessions
SIkebe Aug 26, 2026
be72928
Flush recoverable Roadmap writes
SIkebe Aug 26, 2026
357ab38
Keep profile persistence regression lightweight
SIkebe Aug 26, 2026
6afd0c1
Verify Roadmap display controls independently
SIkebe Aug 26, 2026
dbb2ec6
Validate Roadmap state before import writes
SIkebe Aug 26, 2026
591168a
Target Roadmap pills in rendering checks
SIkebe Aug 26, 2026
1a05ea2
Restore browser profile after E2E drift
SIkebe Aug 26, 2026
d5c225c
Describe all retained E2E drifts
SIkebe Aug 26, 2026
2b3a106
Test partial Roadmap state persistence
SIkebe Aug 26, 2026
cbd23e6
Gate Roadmap rendering fixture before import
SIkebe Aug 26, 2026
93dbfd7
Retry delayed field default persistence
SIkebe Aug 27, 2026
89d6fb8
Explain live API failures on pull requests
SIkebe Aug 28, 2026
de680e4
Isolate live API failure reporting
SIkebe Aug 28, 2026
b8e8df6
Fix trusted reporting and fixture guidance
SIkebe Aug 28, 2026
6e12dd7
Sanitize integration test names in PR comments
SIkebe Aug 28, 2026
673c6f5
Keep reusable live API workflow read-only
SIkebe Aug 28, 2026
af78fe7
Scope reporter token to individual steps
SIkebe Aug 28, 2026
c9f39af
Warn before using undocumented Roadmap UI
SIkebe Aug 28, 2026
5c58cee
Isolate live API comments by commit
SIkebe Aug 28, 2026
6c8d5ed
Serialize live API status comments per PR
SIkebe Aug 28, 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
81 changes: 67 additions & 14 deletions .github/skills/ghpmv-e2e-validation/SKILL.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Tokens are resolved from `--token`, then the `GITHUB_TOKEN` / `GHPMV_TOKEN` envi

| Category | Verification coverage |
|---|---|
| Project | Description, README, visibility, closed state, and organization template state. A changed title is informational because import supports title overrides. Legacy snapshots without `project.template` preserve and do not compare the target template state. |
| Project | Description, README, visibility, closed state, and organization template state. A changed title is informational because import supports title overrides. |
| Field | Field presence/type, select option order/name/color/description, Issue Field description/visibility/linkage, and iteration dates/durations. |
| Item | Counts/types, issue and pull request identity, draft body, field values (including Project and Issue Field multi-select values), active-item order, and archived state. Archived-item order is excluded because GitHub cannot restore it. |
| StatusUpdate | History order, body (including the imported attribution note), status, start date, and target date. |
Expand Down
5 changes: 3 additions & 2 deletions docs/BROWSER_AUTOMATION_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ GraphQL と Playwright を組み合わせた View・Workflow 移行の詳細設
| sort(複数キー+方向) | GraphQL `sortByFields`(`ProjectV2SortByField.direction`) | **UI** | |
| **Slice by** | ❌ API に無い → **UI で読む** | **UI** | |
| **Field sum** | ❌ API に無い → **UI で読む** | **UI** | Board と grouped Table / Roadmap。Count、複数 Number field、空集合を complete-set 同期 |
| **Roadmap 設定(Dates / Zoom / Markers)** | ❌ API に無い → **UI で読む** | **UI** | |
| タブの並び順 | **UI**(`navigation "Select view"` 内のsaved tab `href`順) | **UI**(タブの drag & drop) | GraphQL `POSITION`は現行UIのsaved-tab順と乖離する場合がある。`ViewSnapshot.tabPosition`はschema v1のnullable additive field |
| **Roadmap 設定(Dates / Zoom / Markers / Truncate titles / Show date fields)** | ❌ API に無い → **UI で読む** | **UI** | 2つの表示 option は boolean として独立に同期 |
| タブの並び順 | **UI**(`navigation "Select view"` 内のsaved tab `href`順) | **UI**(タブの drag & drop) | GraphQL `POSITION`は現行UIのsaved-tab順と乖離する場合がある |

### Workflow のプロパティ別ソースマップ

Expand Down Expand Up @@ -336,6 +336,7 @@ browser importer 自体は各 view / workflow の適用直後に完全な read-b
2. "Fixture Board" — Board, Column by, swimlane, Field sum=[Fixture Number]
3. "Fixture Roadmap" — grouped Roadmap, Field sum=[Fixture Number 2], Dates, Zoom, Markers
4. "Fixture Empty Sums" — grouped Table, Field sum=[]
5. "Fixture Roadmap Dates Hidden" — grouped Roadmap, Truncate titles=on, Show date fields=off
- Workflows: W-1〜W-8 を非デフォルト Status 値で有効化、W-9 を 2 本(別リポ + 別フィルター)。1 つは disabled のまま設定を持たせる(§4.3 の D0 論点の検証用)
- Items: issue 10 / PR 3 / draft 3(archived 2 を含む)
- Field defaults: Fixture Text=`既定値 🌏`、Fixture Number=`-7`、Fixture Number 2=`0`、Fixture Select=`Beta`
Expand Down
32 changes: 22 additions & 10 deletions docs/MANUAL_TEST_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ EMU / SAML / OIDC backed organization の場合は、PAT と browser session の

Team link の手動 E2E では共有 Team を変更せず、source/target の各 organization にこのテスト専用 Team を作成してください。source fixture には `--fixture-team <source-team-slug>` を渡します。target Team は同じ slug、または renamed mapping を確認する別 slug にします。

Views の作成と name / layout / filter / visible fields は GraphQL API で設定します。標準 fixture には API 未対応の View 設定、非自明な `Fixture Roadmap → View 1 → Fixture Board → Fixture Empty Sums` の tab order、Workflows も含まれるため、`ghpmv setup --fixture-ui` は API View import の後に C# の Playwright layer で補完します。手動で UI をぽちぽち濃くする必要はありません。
Views の作成と name / layout / filter / visible fields は GraphQL API で設定します。標準 fixture には API 未対応の View 設定、非自明な `Fixture Roadmap → View 1 → Fixture Board → Fixture Empty Sums → Fixture Roadmap Dates Hidden` の tab order、Workflows も含まれるため、`ghpmv setup --fixture-ui` は API View import の後に C# の Playwright layer で補完します。手動で UI をぽちぽち濃くする必要はありません。

---

Expand Down Expand Up @@ -336,15 +336,18 @@ dotnet run --project src/Ghpmv.Cli -- setup `
`--fixture --fixture-ui` の再実行では、別の操作で作成された同名 Project は Workflows の重複作成を避けるため UI 適用を自動で skip します。この操作が所有する Project は、前回の UI 適用が未完了なら再開し、完了済みなら skip します。既存 Project に fixture を強制的に再適用する場合だけ、`--fixture` を外して `--fixture-ui --fixture-project <source-project-number>` を明示してください。

> **再実行時の注意:** `setup --fixture-ui` の View import は既存 View を名前で再利用するため、`Fixture Board` / `Fixture Roadmap` は重複しません。Workflows は built-in entries を再設定できますが、複製した Auto-add workflow は重複し得るため、完全にクリーンな検証には新しい fixture Project を使用してください。
>
> `--fixture-ui --fixture-project` を単独で使う既存 Project は、Roadmap rendering 検証用の長い dated item を含む必要があります。含まれない場合は書き込み前に停止するため、`setup --fixture --fixture-ui` で browser fixture を作成してください。

このコマンドは、既存 Project に対して標準テスト用の以下を作成します。

- Views
- `View 1`: grouped Table、filter、sort、Slice by、Field sum=`Count` + `Fixture Number` + `Fixture Number 2`、visible fields
- `Fixture Board`: Board、Column by、Swimlanes、Field sum
- `Fixture Roadmap`: grouped Roadmap、Field sum=`Fixture Number 2`、date fields、Quarter zoom、markers
- `Fixture Roadmap`: grouped Roadmap、Field sum=`Fixture Number 2`、date fields、Quarter zoom、markers、`Truncate titles`=on、`Show date fields`=on。fixture は truncation 確認用の長い draft title を含む
- `Fixture Empty Sums`: grouped Table、Field sum の空選択
- tab order: `Fixture Roadmap` → `View 1` → `Fixture Board` → `Fixture Empty Sums`
- `Fixture Roadmap Dates Hidden`: grouped Roadmap、`Truncate titles`=on、`Show date fields`=off
- tab order: `Fixture Roadmap` → `View 1` → `Fixture Board` → `Fixture Empty Sums` → `Fixture Roadmap Dates Hidden`
- Workflows
- item state 系 built-in workflows
- `Auto-add to project`
Expand All @@ -361,7 +364,7 @@ dotnet run --project src/Ghpmv.Cli -- setup `

Views:

- タブを `Fixture Roadmap` → `View 1` → `Fixture Board` → `Fixture Empty Sums` の順に並べる
- タブを `Fixture Roadmap` → `View 1` → `Fixture Board` → `Fixture Empty Sums` → `Fixture Roadmap Dates Hidden` の順に並べる
- `View 1` (Table)
- filter=`status:Todo`
- visible fields を標準 fixture に合わせる
Expand All @@ -379,9 +382,16 @@ Views:
- Dates=`Fixture Date` → `Fixture Sprint end`
- Zoom=`Quarter`
- Markers=`Fixture Date`
- Truncate titles=on
- Show date fields=on
- `Fixture Empty Sums` (Table) を作成
- group by Status
- Field sum は空(`Count` を含めてすべて解除)
- `Fixture Roadmap Dates Hidden` (Roadmap)
- group by Status
- Dates=`Fixture Date` → `Fixture Sprint end`
- Truncate titles=on
- Show date fields=off

Workflows:

Expand Down Expand Up @@ -502,13 +512,14 @@ dotnet run --project src/Ghpmv.Cli -- export `
- `Fixture Board`: `fieldSum=["Fixture Number"]`
- `Fixture Roadmap`: `fieldSum=["Fixture Number 2"]`
- `Fixture Empty Sums`: `fieldSum=[]`(submenu を取得できた空選択。control/submenu を取得できない場合は View UI 未取得 warning)
- `Fixture Roadmap Dates Hidden`: `fieldSum=["Fixture Number 2"]`, `truncateTitles=true`, `showDateFields=false`

3 件以上の Field sum は GitHub UI で `1 more` と省略されますが、snapshot には実フィールド名が全件必要です。既存の snapshot 確認に次を追加し、別 export は実行しません。

```powershell
$snapshot = Get-Content "$env:GHPMV_SNAPSHOT_DIR/snapshot.json" -Raw | ConvertFrom-Json
$snapshot.views |
Where-Object name -in @('View 1', 'Fixture Board', 'Fixture Roadmap', 'Fixture Empty Sums') |
Where-Object name -in @('View 1', 'Fixture Board', 'Fixture Roadmap', 'Fixture Empty Sums', 'Fixture Roadmap Dates Hidden') |
Select-Object name, groupByFields, @{ Name = 'fieldSum'; Expression = { @($_.ui.fieldSum) -join ', ' } }
Comment thread
SIkebe marked this conversation as resolved.
Outdated
```

Expand Down Expand Up @@ -627,7 +638,7 @@ human-readable category table と `verify-report.json` の両方に `StatusUpdat
Field defaults と Field sum はこの既存 round trip の中で確認し、別の export/import シナリオは実行しません。

1. 初回 browser-assisted verify で `View: Match` を確認します。Group by、Field sum menu の完全な選択集合、空集合は Playwright capture と verifier が機械比較するため、同じ内容を目視しません。
2. Issue #62 の派生描画 checkpoint は次の command で自動検証します。Playwright が target の `View 1` と `Fixture Roadmap` を reload し、visible group header、`Count` rendering、各 Number field の numeric aggregate label を DOM で確認します。ユーザーによる reload / 目視確認は不要です。
2. Issue #62/#65 の派生描画 checkpoint は次の command で自動検証します。Playwright が target の `View 1`、`Fixture Roadmap`、`Fixture Roadmap Dates Hidden` を reload し、visible group header、aggregate label、長いtitleのtruncation、date fieldの表示/非表示をDOMで確認します。ユーザーによる reload / 目視確認は不要です。

```powershell
dotnet run --project src/Ghpmv.Cli -- setup `
Expand All @@ -637,7 +648,7 @@ dotnet run --project src/Ghpmv.Cli -- setup `
--browser-profile target
```

`Rendered Field sums verified` が両 View に出力され、最後に `Fixture field-sum rendering verified: project=#<target-project-number> views=2` と exit code 0 になることを確認します。
`Rendered Field sums verified` が3 Viewに出力され、最後に `Fixture field-sum rendering verified: project=#<target-project-number> views=3` と exit code 0 になることを確認します。
3. `ghpmv setup --fixture-field-default-check --fixture-org <target-org> --fixture-project <target-project-number> --browser-profile target` を実行し、Projects UIから作成されたdisposable draftにText / negative Number / zero / Single-select defaultsが自動入力されることを確認します。出力されたdraft item ID / titleをresource inventoryに追加し、cleanup同意前には削除しません。
4. `ghpmv setup --fixture-field-default-drift --fixture-org <target-org> --fixture-project <target-project-number> --browser-profile target` と既存の `--fixture-field-sum-drift` を同じ target に実行します。前者は Text / zero Number / Single-select を変更し、negative Number default を clear します。
5. browser-assisted verify を `--categories Field,View` で再実行し、4 件の `default value mismatch` と `view 'View 1': field sum mismatch` を確認します。
Expand Down Expand Up @@ -698,9 +709,11 @@ warning / error が出た場合は、次の観点で切り分けます。

- [ ] Table view の filter / visible fields / sort / group by / field sum は browser-assisted `verify` で `View: Match`。
- [ ] Board view の Column by / Swimlanes / Slice by / field sum は browser-assisted `verify` で `View: Match`。
- [ ] Roadmap view の group by / field sum / date fields / zoom / markers は browser-assisted `verify` で `View: Match`。
- [ ] Roadmap view の group by / field sum / date fields / zoom / markers / Truncate titles / Show date fields は browser-assisted `verify` で `View: Match`。
- [ ] Roadmap の長い title と date-field 表示が source/target で一致し、reload 後も維持される。
- [ ] `setup --fixture-roadmap-display-drift` が `Show date fields` を維持したまま `Truncate titles` だけを変更し、verify が `truncate titles mismatch` だけを報告して、同じ target への再 import で `View: Match` に戻る。
- [ ] View 名が一致。
- [ ] View tab order が `Fixture Roadmap` → `View 1` → `Fixture Board` → `Fixture Empty Sums` で一致。
- [ ] View tab order が `Fixture Roadmap` → `View 1` → `Fixture Board` → `Fixture Empty Sums` → `Fixture Roadmap Dates Hidden` で一致。
- [ ] 通常幅とタブが画面幅を超える狭い幅の両方で source/target 順が一致。
- [ ] import を再実行しても既に正しい tab order は変化しない。

Expand Down Expand Up @@ -737,7 +750,6 @@ warning / error が出た場合は、次の観点で切り分けます。
- [ ] source と target の `project.template` が一致し、Organization の Templates UI と Create project ダイアログに表示される。
- [ ] Status Updates を含む import では、target が一時的に通常 Project となり、全 writer 完了後に template へ戻る。
- [ ] snapshot の `project.template` を `false` にして既存 template target へ再 import すると、最終段で通常 Projectへ戻る。
- [ ] `project.template` 行を削除した schema v1 snapshot では、既存 target の template 状態が変わらない。

---

Expand Down
6 changes: 3 additions & 3 deletions docs/MIGRATION_SCOPE.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Issue and pull request content and metadata, including labels, milestones, assig
| Project collaborators | ✅ with browser automation / API import-only | GitHub exposes a write API but no read API for project collaborators. With `--enable-browser-automation`, `ghpmv` exports explicitly listed project collaborators from Settings → Manage access and imports them through the API. Inherited/base-role access is outside `ghpmv`'s scope and is expected to come from GEI, organization/team/repository settings, or enterprise policy. |
| Project status updates | ✅ | Body, status, start/target dates, and history order are migrated. Because GitHub cannot preserve the original author or creation time, `ghpmv` prepends them to the recreated body. |
| Project-to-Team links | ✅ for organization-owned Projects | Exported through `ProjectV2.teams`, stored as `organization/slug`, resolved before any write, and recreated with `linkProjectV2ToTeam`. Explicit Team collaborators remain separate. Target-only links are reported but not removed. User-owned Projects use empty/no-op/not-applicable behavior. |
| Project templates | ✅ for organization-owned Projects | `ProjectV2.template` is exported and applied only after Items, Status Updates, Views, Workflows, and other writers finish. Existing template targets are temporarily unmarked when a blocked write is required. A legacy snapshot without `project.template` preserves the target state; user-owned Projects reject `template: true` before any write. |
| Project templates | ✅ for organization-owned Projects | `ProjectV2.template` is exported and applied only after Items, Status Updates, Views, Workflows, and other writers finish. Existing template targets are temporarily unmarked when a blocked write is required; user-owned Projects reject `template: true` before any write. |

## Fields and field values

Expand Down Expand Up @@ -63,9 +63,9 @@ View names, layouts, filters, and ordered visible fields are imported through th
|---|---:|---|
| Table views | ✅ / best effort | Name, layout, filter, and visible-field order use GraphQL. Group by, the first sort key, Slice by, and grouped-view Field sum use browser enrichment. Field sums preserve Count, multiple Number fields, and an empty selection. Additional sort keys are exported but only the first is applied. |
| Board views | ✅ | Column by, Swimlanes and Field sum are tested. |
| Roadmap views | ✅ | Date fields, zoom level, markers, and grouped-view Field sum are tested. Field sums preserve Count, multiple Number fields, and an empty selection. |
| Roadmap views | ✅ | Date fields, zoom level, markers, title truncation, date-field display, and grouped-view Field sum are tested. |
| View API settings | ✅ | Name, layout, filter, and ordered visible fields are migrated without browser automation. |
| View UI-only settings | ✅ | Grouping, sorting, slicing, field sums, and Roadmap settings are exported/imported by browser automation where the UI exposes them. |
| View UI-only settings | ✅ | Grouping, sorting, slicing, field sums, and Roadmap settings are exported/imported by browser automation where the UI exposes them. Roadmap checkbox failures identify the property and View. |
| View tab order | ✅ with browser automation | The public GraphQL `POSITION` order can differ from the saved-tab order shown by GitHub. Browser-assisted export/verify read tab `href` values in DOM order, and browser-assisted import applies the minimum drag-and-drop moves after all View settings. API-only export leaves tab order uncaptured, API-only import warns when a snapshot contains it, and API-only verify marks it not verified. |
| Insights charts | ❌ | Out of scope for v1. They require a separate UI automation design. |

Expand Down
4 changes: 2 additions & 2 deletions docs/ui-maps/insights-ui-discovery.md
Original file line number Diff line number Diff line change
Expand Up @@ -460,8 +460,8 @@ test flow:

Discovery blockers を解消後、次の順で分ける。

1. **Contract / pure logic**: nullable custom chart collection (`CurrentSchemaVersion` は上げない)、
normalization、field identity、comparison、backward compatibility。historical points は model に入れない。
1. **Contract / pure logic**: custom chart collection、normalization、field identity、comparison。
historical points は model に入れない。
2. **Selectors + read-only exporter**: `Sel.cs`、custom list/order、filter/config reader、default exclusion。
3. **Importer lifecycle**: mandatory host/login preflight → pending create + baseline persist → create/reconcile →
target chart ID persist → rename → configure → filter → read-back。
Expand Down
Loading