|
| 1 | +# Round 1 — Agent A: New Files Inventory |
| 2 | +**Branch:** `if/main` vs `upstream/release/10.0` |
| 3 | +**Total added files:** 159 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +## Summary Table |
| 8 | + |
| 9 | +| Category | Path glob | File count | Purpose | |
| 10 | +|---|---|---|---| |
| 11 | +| GitHub CI/CD | `.github/workflows/` | 11 workflows | Fork-specific GitHub Actions automation pipeline | |
| 12 | +| GitHub meta | `.github/CODEOWNERS`, `.github/ISSUE_TEMPLATE/` | 5 | Ownership rules + issue templates for the autonomous pipeline | |
| 13 | +| Fork config | `.if-fork/` | 14 | Policy YAML, patch ledger, Claude prompt library | |
| 14 | +| Python tools | `tools/` | 19 | CLI scripts powering CI workflows (ledger signing, review, regression checks) | |
| 15 | +| Python tests | `tests/` | 55 | pytest suite verifying all `tools/` scripts and CI workflow contracts | |
| 16 | +| .NET smoke tests | `test/InitialForce.WpfSmoke/` | 22 | NUnit smoke + BenchmarkDotNet perf harness for the WPF fork | |
| 17 | +| .NET hello-world app | `test/InitialForce.WpfHelloWorld/` | 6 | Minimal WPF app used as a build/smoke sanity target | |
| 18 | +| NuGet packaging | `packaging/` | 11 | `InitialForce.WPF` and `InitialForce.WPF.RuntimeOverride` package projects | |
| 19 | +| Documentation | `docs/` | 8 | Operator runbook, risk register, decision log, known limitations | |
| 20 | +| Perf baseline | `perf/` | 1 | Example BenchmarkDotNet JSON baseline for regression checks | |
| 21 | +| Root-level | `NOTICE.md`, `pyproject.toml` | 2 | Legal attribution + Python project descriptor | |
| 22 | + |
| 23 | +--- |
| 24 | + |
| 25 | +## Group Details |
| 26 | + |
| 27 | +### `.github/workflows/` — 11 files |
| 28 | +CI/CD workflows implementing the fully autonomous upstream-PR review-and-merge pipeline. |
| 29 | + |
| 30 | +| File | Description | |
| 31 | +|---|---| |
| 32 | +| `build.yml` | Builds the fork on every PR to `if/main`/`if/staging` | |
| 33 | +| `nightly-rebase.yml` | Scheduled (03:07 UTC daily) rebase onto `upstream/release/10.0` | |
| 34 | +| `pr-discovery.yml` | Scans upstream `dotnet/wpf` for new community PRs and creates ledger entries | |
| 35 | +| `pr-ingestion.yml` | Triggered by `pr-discovered` dispatch; pulls PR diff and kicks off review | |
| 36 | +| `pr-review.yml` | Runs 2× independent Claude Opus reviewers, then merges verdicts | |
| 37 | +| `release.yml` | Packs and publishes `InitialForce.WPF` NuGet packages (gated to `@oysteinkrog`) | |
| 38 | +| `upstream-stable-adoption.yml` | Applies PRs that graduated from staging to `if/main` | |
| 39 | +| `weekly-differential.yml` | Weekly diff of fork vs upstream to surface drift | |
| 40 | +| `autonomy-check.yml` | Periodic health-check of the autonomous pipeline itself | |
| 41 | +| `test-autonomy-check.yml` | CI job that runs the pytest suite for `tools/` | |
| 42 | +| `claude-on-failure.yml` | Fires Claude analysis on any failed workflow run | |
| 43 | + |
| 44 | +### `.github/ISSUE_TEMPLATE/` — 4 files + `CODEOWNERS` |
| 45 | +Structured issue templates used by automated workflows to report pipeline events to human operators. |
| 46 | + |
| 47 | +| File | Description | |
| 48 | +|---|---| |
| 49 | +| `cherry-pick-failure.yml` | Filed when a graduated PR fails to apply cleanly | |
| 50 | +| `perf-regression.yml` | Filed when BenchmarkDotNet detects a regression vs baseline | |
| 51 | +| `review-disagreement.yml` | Filed when the two Opus reviewers cannot reach consensus | |
| 52 | +| `operator-followup.yml` | General escalation template for items requiring human action | |
| 53 | +| `CODEOWNERS` | Enforces `@oysteinkrog` review for policy files, ledger, prompt library, and release/review workflows | |
| 54 | + |
| 55 | +### `.if-fork/` — 14 files |
| 56 | +Fork-specific configuration and Claude prompt library. |
| 57 | + |
| 58 | +| File | Description | |
| 59 | +|---|---| |
| 60 | +| `config.yaml` | Canonical policy file: denylist, tier thresholds, allowlists; all Claude workflows read this | |
| 61 | +| `patch-ledger.jsonl` | Append-only hash-chained JSONL ledger recording every discovered/reviewed/applied PR | |
| 62 | +| `patch-state.json` | Regenerated summary of current ledger state (graduated/applied counts by tier) | |
| 63 | +| `seed-input.json` | Bulk-import seed list of upstream PRs to pre-populate the ledger | |
| 64 | +| `prompts/preamble.md` | 12 hard prohibitions inherited by every Claude prompt in this repo | |
| 65 | +| `prompts/pr-review-1.md`, `pr-review-2.md` | Independent reviewer prompts (roles differ to avoid anchoring) | |
| 66 | +| `prompts/cherry-pick.md` | Prompt driving the graduation/cherry-pick workflow | |
| 67 | +| `prompts/rebase.md` | Prompt for the nightly rebase job | |
| 68 | +| `prompts/failure-analysis.md` | Prompt for post-failure root-cause analysis | |
| 69 | +| `prompts/release-notes.md` | Prompt generating release notes from ledger diffs | |
| 70 | +| `prompts/resolve-rebase-conflict.md` | Prompt for conflict resolution during rebase | |
| 71 | +| `prompts/pr-discovery.md` | Prompt for scanning upstream and scoring new PRs | |
| 72 | +| `prompts/audit-logger.md` | Prompt for structured audit logging of Claude actions | |
| 73 | + |
| 74 | +### `tools/` — 19 files |
| 75 | +Python and shell scripts that implement the logic referenced by GitHub Actions workflows. |
| 76 | + |
| 77 | +| File | Description | |
| 78 | +|---|---| |
| 79 | +| `ledger-event.py` | Appends a signed, hash-chained event to `patch-ledger.jsonl` | |
| 80 | +| `ledger-validate.py` | Validates ledger hash chain integrity | |
| 81 | +| `ledger_schema.py` | Shared schema constants (valid event types, required fields) | |
| 82 | +| `merge-verdicts.py` | Combines two reviewer JSON verdicts → `approved`/`escalated`/`rejected` | |
| 83 | +| `check-regression.py` | Compares BenchmarkDotNet JSON vs baseline; exits non-zero on regression | |
| 84 | +| `check-graduated.py` | Checks whether a PR has reached graduation tier in the ledger | |
| 85 | +| `check-denylist.py` | Checks a PR diff against the config denylist patterns | |
| 86 | +| `check-config-schema.py` | Validates `config.yaml` against `config-schema.json` | |
| 87 | +| `check-prompt-schema.py` | Validates that all `.if-fork/prompts/*.md` files declare required headers | |
| 88 | +| `diff-smoke-results.py` | Diffs fork vs upstream smoke test XML results; exits non-zero on regressions | |
| 89 | +| `dispatch-approved.py` | Fires a `repository_dispatch` to trigger the graduation workflow | |
| 90 | +| `regenerate-state.py` | Rebuilds `patch-state.json` from the full ledger | |
| 91 | +| `seed-ledger.py` | Seeds the ledger from `seed-input.json` (one-time bootstrap) | |
| 92 | +| `config-schema.json` | JSON Schema for `config.yaml` | |
| 93 | +| `cherry-pick-pre-flight.sh` | Bash: detects if upstream PR is already absorbed before cherry-pick | |
| 94 | +| `compute-version.ps1` | PowerShell: computes NuGet package version from git history | |
| 95 | +| `verify-msquic-pattern.ps1` + `.Tests.ps1` | PowerShell: verifies msquic usage pattern; Pester test | |
| 96 | + |
| 97 | +### `tests/` — 55 files |
| 98 | +pytest suite providing unit and integration coverage for all `tools/` scripts and workflow contracts. |
| 99 | + |
| 100 | +| Sub-group | File count | Coverage | |
| 101 | +|---|---|---| |
| 102 | +| `tests/fixtures/` | 23 | JSON/JSONL/XML/YAML/patch fixture files for deterministic test inputs | |
| 103 | +| `tests/test_ledger_*.py` | 4 | Ledger schema, event structure, hash-chain validation, state regeneration | |
| 104 | +| `tests/test_*_workflow.py` | 13 | Contract tests for each GitHub Actions workflow (event names, gate chains, required steps) | |
| 105 | +| `tests/test_check_*.py` | 5 | Unit tests for `check-*` tools | |
| 106 | +| `tests/test_*.py` (other) | 10 | Merge-verdicts, diff-smoke-results, cherry-pick pre-flight, csproj validation | |
| 107 | +| `conftest.py` | 1 | Pytest autouse fixtures normalising CI vs local environment | |
| 108 | + |
| 109 | +### `test/InitialForce.WpfSmoke/` — 22 files |
| 110 | +NUnit smoke test suite and BenchmarkDotNet perf harness running against the actual WPF fork assemblies. |
| 111 | + |
| 112 | +| File | Description | |
| 113 | +|---|---| |
| 114 | +| `Smoke/SmokeBase.cs` | NUnit base class: STA-thread application host for all smoke tests | |
| 115 | +| `Smoke/PixelDiffHelper.cs` + `PixelDiffTests.cs` | Pixel-level screenshot comparison (golden-image regression detection) | |
| 116 | +| `Smoke/AnimationTests.cs` | Verifies WPF animation timing and completion | |
| 117 | +| `Smoke/DataBindingTests.cs` | Data-binding correctness tests | |
| 118 | +| `Smoke/VirtualizingPanelTests.cs` | Virtualizing panel layout correctness | |
| 119 | +| `Smoke/FrugalListTests.cs`, `ListCollectionViewTests.cs`, etc. | Targeted regression guards for fork-specific optimizations | |
| 120 | +| `Perf/PerfHarness.cs` + `PerfProgram.cs` | BenchmarkDotNet harness; results fed to `check-regression.py` | |
| 121 | +| `Perf/BenchmarkConfig.cs` | BenchmarkDotNet configuration (warmup, iterations, exporters) | |
| 122 | + |
| 123 | +### `test/InitialForce.WpfHelloWorld/` — 6 files |
| 124 | +Minimal single-window WPF application used as a build and smoke sanity target. |
| 125 | + |
| 126 | +### `packaging/` — 11 files |
| 127 | +Two SDK-style NuGet package projects with no source code — they package the fork's WPF assemblies. |
| 128 | + |
| 129 | +| Package | Description | |
| 130 | +|---|---| |
| 131 | +| `InitialForce.WPF` | Primary consumer package; delivers fork WPF assemblies via `buildTransitive` MSBuild props/targets | |
| 132 | +| `InitialForce.WPF.RuntimeOverride` | Companion package that redirects the .NET runtime to use the fork's assemblies at runtime | |
| 133 | + |
| 134 | +### `docs/` — 8 files |
| 135 | + |
| 136 | +| File | Description | |
| 137 | +|---|---| |
| 138 | +| `operator-runbook.md` | Steady-state operations guide (6–10 h/month estimate, incident response) | |
| 139 | +| `DECISION_LOG.md` | Append-only log of architectural/governance decisions (human + Claude) | |
| 140 | +| `KNOWN_RISKS.md` | Detailed risk catalogue with mitigation strategies | |
| 141 | +| `risk-register.md` | Condensed on-call cheat sheet mapping risks to detection signals and response steps | |
| 142 | +| `BOOTSTRAP_STATUS.md` | Current status of the initial fork bootstrap process | |
| 143 | +| `autonomy-check-usage.md` | Usage guide for the autonomy-check workflow | |
| 144 | +| `known-limitations.md` | Documented limitations of the autonomous pipeline | |
| 145 | +| `manual-candidates.md` | PRs identified as requiring manual review rather than autonomous processing | |
| 146 | + |
| 147 | +### Root-level and misc — 3 files |
| 148 | + |
| 149 | +| File | Description | |
| 150 | +|---|---| |
| 151 | +| `NOTICE.md` | MIT license attribution acknowledging `dotnet/wpf` and .NET Foundation origin | |
| 152 | +| `pyproject.toml` | Python project descriptor for `wpf-fork-tools`; declares dependencies for `tools/` scripts | |
| 153 | +| `perf/baseline-example.json` | Example BenchmarkDotNet JSON baseline (Intel i7-10700K, .NET 10, Windows 11) | |
| 154 | + |
| 155 | +--- |
| 156 | + |
| 157 | +## Notes |
| 158 | + |
| 159 | +- The `data/` directory exists locally (contains review reports from this session) but has **no files tracked in `if/main`** — it is ephemeral/gitignored and should not be documented as a fork artifact. |
| 160 | +- All 159 added files are unique to the InitialForce fork; none appear in `dotnet/wpf release/10.0`. |
0 commit comments