{
  "repository": "https://github.com/reiqr/shiroha-quiz",
  "commit": "45f06728a5ddf3b760bea4586127852da525fc73",
  "branch": "main",
  "license": "GPL-3.0",
  "sourceSubdirectory": "apps/web",
  "customizationVersion": "0.2.0",
  "customizedOn": "2026-10-31",
  "modifiedFiles": [
    "web/app.js",
    "web/index.html"
  ],
  "omittedFiles": [
    "apps/web/libs/download-mathjax.ps1",
    "apps/web/libs/download-pdfjs.ps1",
    "apps/web/libs/ocr/core/README.md",
    "apps/web/libs/ocr/download-ocr.ps1",
    "apps/web/serve.ps1",
    "apps/web/打开Shiroha Quiz.cmd"
  ],
  "artwork": "Artwork comes from the upstream web directory within its GPL-3.0 project repository; no separate artwork terms were found in that repository. The artwork is not original to this customization.",
  "upstreamTests": {
    "tests/upstream-ai/cases.cjs": {
      "source": "test/web-ai-practice/cases.cjs",
      "sha256": "bbb1b508d11a762fc20ab82e6ea0fe44334cec6f30ac0daa160a939782c1c27f",
      "modification": "Formula context assertion updated for existing V38.1 payload and two structured follow-up draft-safety cases added."
    },
    "tests/upstream-ai/fixtures.cjs": {
      "source": "test/web-ai-practice/fixtures.cjs",
      "sha256": "1ab3609bfba5794c2db1e643186b9dd618e911f9f3e42b09be00aa3c2f8ceb9e",
      "modification": "Unmodified."
    },
    "tests/upstream-ai/harness.cjs": {
      "source": "test/web-ai-practice/harness.cjs",
      "sha256": "f32f4a1ae73fe04c76500f432e49434d106fd68442b3a0f6866cd19ddaa16ff5",
      "modification": "Relative Web root and mock response contract adapted to existing V38.1 structured JSON follow-up; no application AI logic changed."
    },
    "tests/upstream-ai/runner.cjs": {
      "source": "test/web-ai-practice/runner.cjs",
      "sha256": "c3ebf05ad0b569cc66403c0e81b81a3df458e2904f7b022e55f2f2fbf79897ba",
      "modification": "Framework plain transport mock named separately from V38 structured follow-up."
    },
    "tests/upstream-webdav/request.test.cjs": {
      "source": "test/web-webdav/request.test.cjs",
      "sha256": "8ba108c578b52c0dc7e9f5c608639042cf861c6acda5b53221bab166a7300411",
      "modification": "Relative Web root changed and network diagnostic display-label expectation localized; protocol code, request and timer assertions preserved."
    }
  },
  "customizationSummary": [
    "Custom brand, SVG wordmark, local OFL font and attribution/about page.",
    "Isolated state, credentials and sidebar keys; reset only this fork.",
    "Empty initial state and explicit upstream C1 sample loading.",
    "Ordinary imports reject unconverted legacy fields; an explicit preview-and-consent lane migrates supported old question files and wrong markers, never old accounts/sessions or whole backups.",
    "Preserve recognized number on new/append/bank-edit save.",
    "Local-only MathJax loader; no automatic CDN fallback in that loader.",
    "Loopback-only read-only static server and independent tests/lint.",
    "Renamed the custom app to 萌题岛; storage keys, backup identifiers and legacy prototype remain unchanged.",
    "Removed the redundant dashboard introduction/data notice; retained sidebar attribution/about and settings data notice.",
    "Localized interface headings, help and dialogs to Chinese; preserved user English question content, technical identifiers, backup schema and all five AI prompt builders.",
    "Added a compact stored-question-number badge to practice/exam cards, separate from round position; no source number or grading changes.",
    "Persistent personal practice replaces the warning-only boundary: compact versioned references, pending/graded/self-review states, pause/resume/reminder, stable record identity and atomic local completion.",
    "Limited transient notices to two and coalesced exact repeats; incompatible-import reasons stay in the preview summary.",
    "Completed Chinese OCR progress, document export and file/regex/archive errors; Chinese file controls work in English browsers, while original filenames/text, format identifiers, protocol payloads and diagnostic originals remain intact.",
    "Practice drafts share the main state and complete Web backup; restore refuses changed/missing sources, merge does not take over drafts, stale-tab writes are rejected, and failed writes retain retryable work. Exams, cloud and native cross-device resume are excluded.",
    "Completed remaining Chinese-only interface copy for local provider labels, import help, sizes, connection diagnostics and static errors; retained protocol identifiers and original study content. Disabled the bundled English math context menu without changing vendor files; diagnostic copies redact both form and saved keys.",
    "Explicit legacy question migration preserves source wording/options/answers/numbers and provenance; existing unique matches only gain missing wrong entries. Plain-prose soft-wrap matching is read-only and visible, while ambiguous/structured/conflicting cases are blocked. Partial and self-grading require consent; failed writes roll back; current wrong state stays separate from source flags and question-only exports.",
    "Stored-number practice selection defaults to existing question numbers, with an explicit filtered-position mode; missing/duplicate matches need confirmation. Optional basis preference uses existing storage, backups and write protection; active drafts keep their exact refs/order. Unified zero/missing-source number preservation including question-only copies/merges with failed-write rollback and guarded exact duplicate cleanup avoid renumbering or erasing linked learning data; wrong/favorite shortcuts ignore stale custom filters.",
    "Added read-only local-day study activity from persisted answer details and validated checkpoints, with bank/question grouping, distinct questions versus attempts, stable-session deduplication, optional source-number snapshots, exam submission labels, pagination and midnight refresh; no inferred old history or new activity store.",
    "Disclose existing uncertainty/source-review notes as escaped, folded import preview text. A separately named private AIF source-structure correction and optional isolated audit preserve the original PDF/JSON, answer mappings and all unaffected questions; private material is never copied into the Web root.",
    "Reject explicit unresolved text-answer placeholders only when accompanied by an unresolved-source warning. Original files and existing stored questions are not rewritten; unresolved source references are never counted as ready study content.",
    "Localized legacy preview type labels without changing provenance/report identifiers; localized page metadata and native/mixed-language exception displays in settings, intelligent import/review, import save, practice save and single-question analysis/follow-up; retain original diagnostics, AI fallback request data, protected prompt builders, source study content, storage and rollback behavior.",
    "Completed a separately named private transcription of all 32 AIF hotspot row/candidate images with 31 source-highlighted references and one disclosed conflicting PDF answer still blocked. Explicit source conflicts receive a Chinese diagnostic and remain blocked even with a filled-in non-placeholder answer; existing saved questions are preserved, not deleted or regraded. Explicit comprehensive/self-grade import reuses existing consent and provenance, not native dropdown/ordering or automatic grading. Optional private source QA verifies all 31 real practice flows, reload, daily activity, records, replay, complete backup and protection of older conflicting placeholders; original files, 420 ordinary questions and real browser data remain untouched.",
    "Versioned new exam self-assessment keeps answered subjective questions pending regardless of exact reference text, with saved snapshot review in results/records, provisional-score disclosure, atomic/idempotent grade-and-wrong updates, stale-tab/quota protection, detached-source safety, late assessment on submission day and an actionable read-only reminder. Unanswered zeroes do not register wrong attempts; legacy exams are not regraded. Web backups preserve pending records, native projections omit incompatible whole exams with an explicit ID note and native export is blocked until supported completion; merged self-review identities are distinct. Running unsubmitted exams remain non-resumable.",
    "Completed folded help and accessibility captions, unsupported import type labels, generated document names, mixed-language file errors, invalid display dates and bundled TeX diagnostic tooltips in Chinese; preserved source questions/answers, real filenames and worksheet names, internal rich-text markers, error identities, diagnostic originals, all protocol/state identifiers and untouched vendor hashes.",
    "Separated explicit native question normalization from inferred text recognition across JSON/spreadsheet/AI results, state load, edits, copies, saves and restore. Preserve explicit source text, option boundaries, reference alternatives, numbering and images; never infer new answer keys from parentheses or reclassify declared types. Preserve unchanged editor fields and blank groups; Web exports retain source while native image projection is explicit. Bulk bank edits roll back on quota/stale-tab failures and retain the editor. No schema migration, historical regrading or guessed repair of previously damaged data; new boundary and isolated real-page tests cover the entire source-content roundtrip. Manual option editing parses explicit headers and continuation/code/math blocks, fails closed on ambiguity or incomplete blocks, preserves untouched option text and requires proposed-key/order confirmation; grading-content edits still finalize the prior round before saving and never rewrite historical snapshots.",
    "Closed Chinese interface exception exits in cloud configuration save, sample-bank load, text-parser candidates, source validation, historical self-review reading and mixed-language timeout diagnostics; unknown type labels cannot expose inherited functions. Preserve original console diagnostics, input/source/record values, storage and grading semantics, protected AI builders and vendor hashes. Added four unit and three isolated English-browser regressions; clarified source-language and attribution boundaries on the about page.",
    "Personal wrong review retains actual last wrong answers and compact optional evidence associations; lazy historical-snapshot or explicitly current fingerprint review, single-question relearning, read-only navigation refresh, status-only manual mastery and atomic management rollback. Preserve unrelated raw/opaque wrong history without startup normalization; disclose unidentifiable entries. Guard invalid objective references, empty subjective reveals, duplicate identities, invalid target counters and invalid exam replacement while preserving existing input/paper/timer; detached exam self-assessment never changes current wrong proof. Full Web backup retains raw history/evidence and remaps sources; native omits Web associations and unrepresentable wrong data with explicit counts, and native ZIP export blocks unsafe projection rather than inventing counts/dates. Added 26 focused model/management checks and 23 isolated browser workflows without real profiles/services or source content changes.",
    "Persistent unsubmitted exams save fixed literal paper snapshots, source numbers/order, effective scores, raw answers, position and the original absolute deadline in optional personalExamDraftV1. Restore verified snapshots even after source edits, detach changed-source grading, keep practice/exam drafts independent and atomically save records/wrong updates/removal. No idle timer writes or grading on home/backup import; explicit expired-paper recovery submits locked answers once, preserves identity/automatic provenance on retry and caps duration. Full Web backup includes recoverable unsaved input, overwrite replaces runtime only after commit, merge preserves local exams with disclosure, unknown drafts remain backed up and native export blocks unsupported unsubmitted papers. Added 16 pure-model and 19 isolated-browser checks, including mock cloud restoration; no real users/services or AI prompt changes.",
    "Combined the earlier subject-directory and question-table layout with the current theme in the banks view only. Read-only group/bank browsing, source-number/stem/provenance search, type/wrong filters and complete pagination do not change storage or practice scope. Page-local selection reuses existing guarded practice snapshots and actual per-bank records; preview folds references, row editing retains explicit original-bank save, and management remains in collapsed tools. Preserve source content, current wrong history and all existing import/backup identifiers. Added 12 pure-model and 18 isolated browser checks, including four PC widths, full pagination beyond 300 items, cross-bank resume, canceled/quota/stale-tab replacement and editor rollback. Also close the pending exam debounce on failed timeout submission and ignore post-deadline focus changes; retries retain the original preallocated record identity. No real browser data, vendor/AI prompt changes, services or deployment.",
    "Pink-purple visual skin in web/custom/polish.css: a last-loaded presentation layer (colour tokens, floating sidebar card, glass topbar with page title restored, rounded cards, gradient primary buttons, dashboard hero and tiles, mobile tuning). Upstream styles.css is not touched.",
    "Dashboard decluttered: removed the intro paragraph, the duplicate data-backup card and the 独立本地版 badge. The open-source attribution moved from the sidebar footer into the existing settings origin note, so about.html and the GPL notice stay one click away.",
    "Removed the legacy-import migration panel and the scanned-document OCR panel from web/index.html. The legacy-import.js data engine stays loaded so already-imported questions keep their preserved fields, and the optional StudyLegacyImportUI bootstrap in app.js is guarded with optional chaining.",
    "Reorganized the import view into source, review and confirmation sections with an optional dual-file panel. Added read-only, single-question source/options/reference/analysis preview and reused existing editor, parsing and atomic single-save paths. No backup schema or prompt changes; original input remains in the page on failure. Existing missing legacy-migration and OCR UI entry points were documented as unavailable, not recreated. Legacy incompatibility guidance now checks whether its migration panel and module actually exist. Added eight isolated browser checks for preview fidelity, filter state, retry, dual-file append, blocked legacy flags and responsive layouts.",
    "Removed the dashboard current-bank summary and topbar bank picker while retaining page titles. The existing bank-management selector now sets both the active bank and the single-bank practice scope, keeping explicit bank selection available for practice, exams and wrong-book views. Merely removing the displays does not migrate or rewrite user data.",
    "Added a home-only local date and 24-hour clock to the header. It stops updating outside the visible dashboard, resynchronizes on return, and does not access learning data or request a time service.",
    "Simplified the import page by removing the decorative heading, step strip, sidebar guidance, sample button, dual-file and format-help entry points. Single-file or text import, question review, append and backup import in settings remain. Existing dual-file parsing code remains unexposed; no user bank or backup format is migrated.",
    "Restyled the four import-target and recognition selects while retaining native controls and existing values. Capable desktop browsers get a themed, viewport-constrained option picker; touch devices, forced colors and unsupported browsers use the system picker. No storage or import protocol changes.",
    "Moved import review into a separate in-view confirmation scene after recognition. Preserve source and retryable preview, block duplicate saves and changed append targets, and do not interrupt another view when an asynchronous result arrives. No new storage format or automatic writes.",
    "Moved bank management into an on-demand dialog and added direct bank metadata and question editing in the catalog. Explicit source and stale-write checks retain raw unrelated fields; grading edits referenced by an unfinished practice are blocked. No new storage format.",
    "Restyled bank metadata as a right-side drawer and added explicit single-bank and one-level group confirmation. Preserve or remove the actual banks as selected, retain unrelated raw data, reject stale writes and protect unfinished practice. Optional bank descriptions survive web backup/restore and structured new-bank import; native behavior is unverified.",
    "Removed the catalog footer scope/current-bank note and the more-management entry. Existing handlers are retained without a public entry; bank editing, explicit current-bank selection, question editing and full web backup remain.",
    "Refined the bank-directory group chevrons with accessible expanded state, retained keyboard focus, touch sizing and reduced-motion support; no data changes."
  ],
  "supplementalLicenses": [
    {
      "Sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
      "Path": "web/libs/mathjax/LICENSE",
      "Name": "MathJax 3.2.2",
      "Source": "https://cdn.jsdelivr.net/npm/mathjax@3.2.2/LICENSE"
    },
    {
      "Sha256": "b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1",
      "Path": "web/libs/ocr/tesseract/LICENSE",
      "Name": "Tesseract.js 5.1.1",
      "Source": "https://cdn.jsdelivr.net/npm/tesseract.js@5.1.1/LICENSE.md"
    },
    {
      "Sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594",
      "Path": "web/libs/LICENSE_PDFJS",
      "Name": "PDF.js 5.7.284",
      "Source": "https://cdn.jsdelivr.net/npm/pdfjs-dist@5.7.284/LICENSE"
    }
  ],
  "displayName": "萌题岛"
}
