Files

325 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Checklists
## Scanner Change
- [ ] The expected crop or capture behavior is clear.
- [ ] Genshin is not accessed through memory reads, hooks, injection, or game files.
- [ ] Auto-scan starts only from confirmed artifact inventory plus visible detail card, or blocks with a reason.
- [ ] Native Artifact scan resets the inventory to the top with a bounded grid-anchor scroll and stabilization wait.
- [ ] A user-facing full-inventory run resolves its target from the OCR-confirmed
current owned Artifact count, never from inventory capacity; missing or
invalid current count blocks safely before native start.
- [ ] Artifact and row limits both clamp to the owned count and the 2,400 target
safety bound; row conversion uses the detected grid column count.
- [ ] A `B` plus Artifact-tab reopen is not promoted over the bounded wheel reset
without a guarded live A/B test for state safety, targeting, and timing.
- [ ] Native automated clicks and wheel events require Genshin to remain foreground; focus loss stops without refocusing.
- [ ] Stop, ESC, Enter, and F9 remain active during native reset, capture, and scrolling.
- [ ] Capture failures are shown to the user.
- [ ] OCR uncertainty remains inspectable in Details.
- [ ] Parser output does not silently trust low-confidence text.
- [ ] Current native capture jobs preserve direct visual `starCount`,
`starConfidence`, and `starSource`; an absent, invalid, or conflicting star
field is never silently assumed to be 5★.
- [ ] Direct visual rarity ambiguity enters `Review` before value evaluation.
- [ ] Scanner controls contain no automatic in-game salvage, Quick Select,
deletion, feed, enhance, lock/unlock, or resource-spending action.
- [ ] Any Inventory local-result removal is explicitly confirmed, tombstones the
result before crop cleanup, preserves raw `scan-results.json` evidence,
remains contained to app-local files, and never invokes game input. An
optional Store-record removal is limited to the exact linked local record.
- [ ] A native-result deletion is blocked while capture or processing is active,
remains idempotent after its tombstone, and cannot remove a crop outside the
selected run directory.
- [ ] `npm run lint` passes.
- [ ] `npm run helper:test` passes when native input safety changed.
- [ ] `npm test` passes when parser/scoring logic changed.
- [ ] `npm run build` passes.
- [ ] Manual Smart Capture is tested when possible.
## Live Scan Timing Claim
- [ ] `/health.appBuild.signature` matches the current `APP_RUNTIME_SIGNATURE`.
- [ ] `npm run scan:live:preflight` passes, or use the validated command that runs it first.
- [ ] During manual UAC startup, `npm run scan:live:preflight:wait` may be used before the scan chain.
- [ ] `npm run scan:assessment:test` passes.
- [ ] Use `npm run scan:iterate:validated` or `npm run scan:iterate:validated:wait` for short 20-artifact tuning loops.
- [ ] Prefer `npm run scan:goal:validated` or `npm run scan:goal:validated:wait` for the final live run because it runs preflight, scan, and assessment validation in sequence.
- [ ] The run includes `scan-performance-assessment.json`.
- [ ] `npm run scan:assessment:validate -- --latest` or explicit `--input=<path>\scan-performance-assessment.json` passes.
- [ ] If claiming the current scanner path, the validator is run with `--expect-winner=current`.
- [ ] Final report cites the validator JSON or `--summary` output, including the assessment path.
- [ ] For iteration claims, the 20-artifact run finishes cleanly and is validated with `--limit=20`.
- [ ] For final claims, the 100-artifact run finishes cleanly.
- [ ] Parsed count is at least the requested count.
- [ ] Miss rate is at or below 2%.
- [ ] Review rate is at or below 15%.
- [ ] Capture rate, processing rate, and end-to-end rate are reported as separate metrics.
- [ ] A streaming end-to-end claim records native start, capture start/end,
processing start/end, and final result reconciliation on one shared wall clock.
- [ ] `run-timing.json` is present, uses `native-scanner-run-timing-v1`, and
contains valid ordered first-observed lifecycle markers through durable result
reconciliation.
- [ ] The smoke report validates target/capture/queue/parse/durable-result
reconciliation together with the timing record; a historical timing report is
not reused for a current-build claim.
- [ ] Overlapping capture and processing durations are never added to derive an
end-to-end rate.
- [ ] Speed reporting uses quality gates, not click count alone.
## Revised Scope Live Acceptance
- [x] Current elevated-dev 50-artifact smoke `20260711-154827`: target/captured/
clicked/queued/processed/parsed/loaded `50/50`, 2 pages, 0 Review, 0 errors,
0 Store writes, `persist=false`, and 50 jobs/non-empty PNGs. A valid
`native-scanner-run-timing-v1` record reconciled at `28,022 ms`; it is not a
3/s performance claim.
- [x] Real Settings-UI Artifact limit 5: Genshin/detail/grid preflight passed;
target/captured/processed/parsed `5/5`, Review/errors `0`, `persist=false`, and
five current-session result rows.
- [x] Complete packaged full-inventory baseline resolves OCR-owned target 2,211,
captures 2,211 crops over 70 pages, reprocesses all 2,211 with the current
package at 136 Review (6.15%), 0 errors, `persist=false`, and passes saved-run
validation with 0 issues.
- [x] Real packaged Settings-UI row limit 1 resolves the detected eight-column
grid to target 8 and finishes captured/processed/parsed `8/8`, Review/errors
`0`, `persist=false`; foreground loss is proven to block with zero clicks.
- [ ] Any `B`-reopen candidate is benchmarked separately and does not replace
the accepted wheel reset without stronger reliability and timing evidence.
## UI Change
- [ ] Scanner, Artifacts, Review, and Builds preview follow the primary user
journey; Overlay and Diagnostics remain secondary tools.
- [ ] The Scanner page shows app/Genshin readiness and one unambiguous primary
start/stop action before advanced controls.
- [ ] The main workflow remains visible without unnecessary scrolling.
- [ ] Debug or secondary information is moved behind buttons/modals where appropriate.
- [ ] Builds stays visibly labeled as a preview until Build-Fit is implemented;
roll efficiency is not presented as character/build suitability.
- [ ] Review describes extraction correction and never implies trash, feed,
deletion, or an in-game mutation.
- [ ] Disabled states prevent actions without required data.
- [ ] Initial content loading reserves layout with a skeleton; bounded actions
use a spinner; scan progress remains durable view state.
- [ ] During scanning, the left main work surface shows phase,
processed-versus-target progress, and read/parsed/stored/review/duplicate/error
outcomes without a duplicate standalone progress card.
- [ ] Toasts confirm explicit mutations and failures without replacing durable
progress, review, blocked, or error state.
- [ ] Status meaning is available through text/icons and not color or animation alone.
- [ ] Keyboard focus is visible for navigation, buttons, disclosures, fields,
dialogs, and toast dismissal.
- [ ] `prefers-reduced-motion: reduce` disables non-essential motion without
hiding state changes or feedback.
- [ ] Text fits in controls and panels.
- [ ] The Scanner, Artifacts, Review, Builds preview, Overlay, and Diagnostics
views are checked at the packaged desktop viewport for clipping, overflow,
accidental page-level scroll, nested-scroll traps, and empty/loading/error states.
- [ ] Primary scanner controls remain usable at the smallest supported desktop
window; narrower layouts reflow instead of clipping cards or action labels.
- [ ] Before/after screenshots or equivalent current-build visual evidence are
inspected for the changed views.
- [ ] A fresh/missing/invalid app locale starts in English, German can be
selected in Settings, and the preference persists locally without changing
the English-only Genshin scanner contract.
- [ ] Localized UI acceptance uses stable semantic hooks where possible and
verifies that translated labels do not cause clipping, focus, or overflow.
- [ ] The artifact detail local-delete control states its app-local scope,
requires confirmation, and remains unavailable for an active native run.
- [ ] `npm run lint` and relevant renderer tests pass.
- [ ] `npm run build` passes.
## Scan Results And Inventory UX
- [ ] The scan page keeps preview, Stop/status, and the live result rail visible without page-level scrolling.
- [ ] The result rail is empty on a fresh app launch, contains only results from
the current app scan session, and leaves persisted history in Artifacts.
- [ ] Progress and completion use the resolved owned-inventory target or the
selected Artifact/row limit consistently.
- [ ] Capture and evaluation progress advance independently: the left bar uses
captured/target while the right result panel uses evaluated/target.
- [ ] Processing starts once when the native run first exposes `runDir`, keeps
waiting across temporary JSONL EOF, and finishes only after producer terminal
plus queue drain.
- [ ] The live rail shows fully evaluated artifact rows only, not intermediate
OCR/debug state, and appends every current-session row in capture order.
- [ ] Result delta polling deduplicates stable IDs/sequences and a final full
load reconciles captured, processed, and durable-result counts.
- [ ] Newly inserted result rows use a left-to-right mount cue; reduced-motion
users receive the same content and status without the animation.
- [ ] Each live row has scan number, artifact name or compact fallback, value score, and a short status pill.
- [ ] Extraction confidence and artifact value remain separate in the data model.
- [ ] Native post-capture runs write `scan-results.json` with extraction status and deferred/review value status.
- [ ] Native post-capture reports include bounded queue evidence such as `queueConcurrency` when OCR/parse workers run.
- [ ] Native artifact post-processing records IK/GOOD match metadata and sends IK set/piece/slot conflicts to review.
- [ ] Native scan result details preserve parser field confidence for review instead of hiding uncertainty.
- [ ] Native inventory promotion is previewed as a dry-run decision before any artifact-store write path is enabled.
- [ ] Weapon, character, and material IK matching claims are backed by category-specific capture evidence, not just catalog availability.
- [ ] Native `supportedCategories` distinguishes `catalogAvailable` from `nativeCaptureSupported`.
- [ ] Native scan start, run manifest, status, and capture jobs carry an explicit scan category.
- [ ] Native preflight and post-capture processing block catalog-only categories before OCR/parsing.
- [ ] Native preflight blocks blank or too-uniform Genshin captures before any click is sent.
- [ ] Native crop previews are loaded only through the Electron bridge and stay constrained to PNG files inside the selected run directory.
- [ ] Native live smoke uses `npm run scan:native:smoke` before broad native timing or store-promotion claims.
- [ ] Artifact-only scope is visible in the UI; weapons, materials, and character details are not presented as active scanner features while they are not scanned.
- [ ] Low-confidence or conflicting reads show `Review` instead of a normal weak/strong value decision.
- [ ] Explicit visual 14★ native results use `excluded`, receive no score,
projection, or store promotion, and remain visible for manual inspection.
- [ ] The separate read-only `Nicht 5★` filter contains only explicitly
recognized 14★ entries and retains screenshot/crop plus parsed details.
- [ ] The `Nicht 5★` view does not call entries safe to salvage and exposes no
automatic salvage or Quick Select control.
- [ ] Duplicate state is represented separately from artifact quality.
- [ ] The artifact inventory view can browse stored scan results without opening diagnostics.
- [ ] Inventory filters/sorting cover review, score, set, slot, equipped, locked, and newest scan where data exists.
- [ ] Artifact detail shows screenshot/crop, parsed fields, OCR confidence, parser notes, value reasons, and review state.
- [ ] Upgrade projection, if shown, is labeled as a projection and includes worst/middle/best cases.
- [ ] Unit tests cover score/status derivation and projection edge cases when those modules change.
- [ ] Scanner safety rules and existing quality gates are unchanged.
## Parser Or Scoring Change
- [ ] Known-good OCR samples still parse correctly.
- [ ] Ambiguous data becomes unknown or review, not false certainty.
- [ ] Character, set, stat, and slot dictionaries are updated deliberately.
- [ ] Tests cover changed behavior when practical.
## Artifact Roll Evaluation
- [ ] Extraction status and value status remain separate fields.
- [ ] Clean legal results become `evaluated`; Review receives no normal score.
- [ ] Only explicitly confirmed 5★ evidence enters `roll-efficiency-v1` for
current native jobs.
- [ ] Explicit visual 14★ evidence becomes `excluded`, not a weak score;
missing, invalid, or conflicting direct star evidence becomes `Review`.
- [ ] Incomplete or inconsistent clean data becomes `unknown`, not a guessed score.
- [ ] Score is labeled as roll efficiency, not universal Artifact or build value.
- [ ] Build fit stays explicitly deferred without character/build context.
- [ ] Locked and equipped state do not change roll efficiency.
- [ ] Rarity-specific legal values and total roll counts are enforced.
- [ ] Reason codes and per-substat roll breakdown explain the result.
- [ ] Legacy saved scan results are enriched on load without requiring a rescan.
- [ ] Unit tests cover evaluated, review, unknown, ambiguity, and rarity edges.
## Build-Fit Contract
- [x] Input, contract, and assessment schemas are explicitly versioned.
- [x] Contracts require character/target identity, revision, game-versioned
provenance, explained Set/Main-Stat/Substat rules, aggregate targets, and
explicit conflict behavior.
- [x] V1 safety floors cannot be lowered below 80% overall extraction and 70%
for every required identity/value field.
- [x] Review, non-parsed, incomplete, low-confidence, or non-canonical Set data
blocks before downstream fit work.
- [x] Native Artifact results map into the contract without guessing a Set key;
non-Artifact categories are rejected.
- [x] Roll-Efficiency is recorded only as separate context and is never used as
Build-Fit eligibility or presented as a fit score.
- [x] V1 assessments retain `score: null` and deferred recommendations even
when the separate evidence-ranking layer is available.
- [x] Real local account snapshots do not call the legacy demo scorer.
- [x] Four current profiles (Furina, Neuvillette, Raiden Hyperbloom, Nahida
Deepwood) are source-bound, game-versioned, IK-6.7.0-key validated, have
explicit expiry, and are covered by Golden plus Review/low-confidence or
pending-context adversarial fixtures.
- [ ] Every further character/build profile is sourced, game-versioned,
reviewed, expiry-bound, and covered by Golden/adversarial fixtures before
product use.
- [x] Five-piece evaluation verifies unique slots, Set shape, sourced aggregate
targets, nested extraction gates, and cross-character/build conflicts together;
missing non-Artifact context remains `pending` rather than guessed.
- [x] The Builds UI reads only the newest complete native run and exposes at
most three non-overlapping, read-only suggestions with profile, source,
Set/Main-Stat/Substat evidence, conflicts, uncertainty, and selection reason.
- [x] The ranker never uses `roll-efficiency-v1`, roll magnitude, or OCR
confidence as a rank weight; confidence stays a hard gate.
- [x] Required aggregate targets accept only explicit, user-confirmed,
session-only local context and otherwise defer the profile.
- [x] The built-renderer Builds/UI acceptance verifies fresh English, German
switching/restoration, loading, deferred/context, suggestion, focus,
reduced-motion, overflow, and native plus Store local-delete confirmation probes.
- [ ] An elevated packaged-executable run separately verifies the same renderer
behavior when making a package-runtime claim; built-renderer evidence alone
does not prove UAC, bridge, or native runtime behavior.
## Upgrade Projection
- [ ] Projection appears only below +20 with four known legal substats.
- [ ] Worst is less than or equal to Middle; Middle is less than or equal to Best.
- [ ] Remaining roll count matches the current Artifact level.
- [ ] Review, illegal, incomplete, three-substat, 4-star, and rarity-ambiguous
data disables projection.
- [ ] +20 is complete and does not invent future rolls.
- [ ] UI states that target substat and tier are random and not guaranteed.
- [ ] Projection does not claim character/build usefulness.
## Native Offline Replay
- [ ] Replay reads an existing `scan-results.json` and never starts capture/input.
- [ ] At least three repeats produce the same full derived-payload hash.
- [ ] Every clean parsed Artifact is evaluated or the command fails.
- [ ] Explicit 14★ entries replay as stable `excluded` results and are not
counted as clean-but-unevaluated failures.
- [ ] Review remains Review and is not counted as an evaluation failure.
- [ ] Report includes value/projection counts and score range.
- [ ] Accepted bounded 20/50/100 runs and the 2,211 full-inventory corpus are
replayed before changing the evaluation contract.
- [ ] `npm run scan:native:validate:saved` passes for the latest complete
evidence set, including `-- --targets=2211` for full-inventory-sensitive work.
- [ ] Saved-run validation confirms manifest/status/job/result counts, PNG
containment, zero processing errors, non-persistence, review provenance,
and projection ordering.
## Release Or Packaging
- [ ] `npm run acceptance:offline` passes before the live acceptance session.
- [ ] Production build succeeds.
- [ ] Electron preload bridge is copied to `dist-electron/preload.cjs`.
- [ ] App starts outside browser preview.
- [ ] Smart Capture bridge is available.
- [ ] No generated debug artifacts are included accidentally.
- [ ] `npm audit --omit=dev` reports zero production vulnerabilities.
- [ ] `npm run package:offline-check` passes before packaged runtime testing.
- [ ] ASAR contains renderer, Electron main, preload, and package manifest.
- [ ] Packaged `dist/index.html` uses relative `./assets/...` references; the
verifier rejects root-absolute `/assets/...` references.
- [ ] `resources/input-helper/InputHelper.exe` exists in the unpacked app.
- [ ] `resources/ik-inventorylists` exists and its version matches source data.
- [ ] Packaged helper/IK resolution uses `process.resourcesPath` without an
implicit `process.cwd()` repository fallback.
- [ ] Packaged and source `APP_RUNTIME_SIGNATURE` values match, so evidence from
an older runtime is rejected as stale.
- [x] `npm run package:live:builds` passed against the built renderer: fresh
English, German selection, restored English, Builds loading/context/focus,
reduced motion, no document overflow, and native plus Store delete-confirmation UI probes.
- [ ] The same UI evidence is collected from an elevated packaged executable
before claiming current package-runtime/UAC behavior.
- [ ] Packaged runtime launch, UAC, bridge, helper, and crop preview are tested
separately; offline resource checks do not prove runtime behavior.
## Next Live Acceptance Session
Use [TOMORROW_LIVE_TEST_PLAN_2026-07-10.md](TOMORROW_LIVE_TEST_PLAN_2026-07-10.md)
in order. Start with packaged launch and existing Inventory data, then one
Smart Capture, native 5, and only then gated 20/50/100 runs.
## Git Merge And Gitea Push
- [ ] `git status --short --branch` is checked before switching branches,
committing, merging, or pushing.
- [ ] Work is committed on the intended feature branch before merging into
`main`.
- [ ] Merge into `main` uses fast-forward when possible, or a deliberate merge
commit when the history requires it.
- [ ] `main` is clean before push except for explicitly ignored or deliberately
untracked local files.
- [ ] `git remote -v` points to the intended Gitea remote before pushing.
- [ ] Gitea HTTPS credentials are stored through Git Credential Manager, not in
repository files or remote URLs.
- [ ] If authentication fails, refresh the credential using
[GITEA_AUTH.md](GITEA_AUTH.md), then rerun the same `git push`.
- [ ] After push, `git status --short --branch` shows `main...origin/main`
without ahead/behind drift.