20 KiB
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
Bplus 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, andstarSource; an absent, invalid, or conflicting star field is never silently assumed to be 5★. - Direct visual rarity ambiguity enters
Reviewbefore 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.jsonevidence, 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 lintpasses.npm run helper:testpasses when native input safety changed.npm testpasses when parser/scoring logic changed.npm run buildpasses.- Manual Smart Capture is tested when possible.
Live Scan Timing Claim
/health.appBuild.signaturematches the currentAPP_RUNTIME_SIGNATURE.npm run scan:live:preflightpasses, or use the validated command that runs it first.- During manual UAC startup,
npm run scan:live:preflight:waitmay be used before the scan chain. npm run scan:assessment:testpasses.- Use
npm run scan:iterate:validatedornpm run scan:iterate:validated:waitfor short 20-artifact tuning loops. - Prefer
npm run scan:goal:validatedornpm run scan:goal:validated:waitfor 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 -- --latestor explicit--input=<path>\scan-performance-assessment.jsonpasses.- If claiming the current scanner path, the validator is run with
--expect-winner=current. - Final report cites the validator JSON or
--summaryoutput, 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.jsonis present, usesnative-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
-
Current elevated-dev 50-artifact smoke
20260711-154827: target/captured/ clicked/queued/processed/parsed/loaded50/50, 2 pages, 0 Review, 0 errors, 0 Store writes,persist=false, and 50 jobs/non-empty PNGs. A validnative-scanner-run-timing-v1record reconciled at28,022 ms; it is not a 3/s performance claim. -
Real Settings-UI Artifact limit 5: Genshin/detail/grid preflight passed; target/captured/processed/parsed
5/5, Review/errors0,persist=false, and five current-session result rows. -
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. -
Real packaged Settings-UI row limit 1 resolves the detected eight-column grid to target 8 and finishes captured/processed/parsed
8/8, Review/errors0,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: reducedisables 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 lintand relevant renderer tests pass.npm run buildpasses.
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.jsonwith extraction status and deferred/review value status. - Native post-capture reports include bounded queue evidence such as
queueConcurrencywhen 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
supportedCategoriesdistinguishescatalogAvailablefromnativeCaptureSupported. - 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:smokebefore 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
Reviewinstead of a normal weak/strong value decision. - Explicit visual 1–4★ 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 1–4★ 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-v1for current native jobs. - Explicit visual 1–4★ evidence becomes
excluded, not a weak score; missing, invalid, or conflicting direct star evidence becomesReview. - 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
- Input, contract, and assessment schemas are explicitly versioned.
- Contracts require character/target identity, revision, game-versioned provenance, explained Set/Main-Stat/Substat rules, aggregate targets, and explicit conflict behavior.
- V1 safety floors cannot be lowered below 80% overall extraction and 70% for every required identity/value field.
- Review, non-parsed, incomplete, low-confidence, or non-canonical Set data blocks before downstream fit work.
- Native Artifact results map into the contract without guessing a Set key; non-Artifact categories are rejected.
- Roll-Efficiency is recorded only as separate context and is never used as Build-Fit eligibility or presented as a fit score.
- V1 assessments retain
score: nulland deferred recommendations even when the separate evidence-ranking layer is available. - Real local account snapshots do not call the legacy demo scorer.
- 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.
- 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
pendingrather than guessed. - 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.
- The ranker never uses
roll-efficiency-v1, roll magnitude, or OCR confidence as a rank weight; confidence stays a hard gate. - Required aggregate targets accept only explicit, user-confirmed, session-only local context and otherwise defer the profile.
- 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.jsonand 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 1–4★ entries replay as stable
excludedresults 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:savedpasses for the latest complete evidence set, including-- --targets=2211for 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:offlinepasses 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=devreports zero production vulnerabilities.npm run package:offline-checkpasses before packaged runtime testing.- ASAR contains renderer, Electron main, preload, and package manifest.
- Packaged
dist/index.htmluses relative./assets/...references; the verifier rejects root-absolute/assets/...references. resources/input-helper/InputHelper.exeexists in the unpacked app.resources/ik-inventorylistsexists and its version matches source data.- Packaged helper/IK resolution uses
process.resourcesPathwithout an implicitprocess.cwd()repository fallback. - Packaged and source
APP_RUNTIME_SIGNATUREvalues match, so evidence from an older runtime is rejected as stale. npm run package:live:buildspassed 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 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 --branchis checked before switching branches, committing, merging, or pushing.- Work is committed on the intended feature branch before merging into
main. - Merge into
mainuses fast-forward when possible, or a deliberate merge commit when the history requires it. mainis clean before push except for explicitly ignored or deliberately untracked local files.git remote -vpoints 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, then rerun the same
git push. - After push,
git status --short --branchshowsmain...origin/mainwithout ahead/behind drift.