Appearance
Main sealed catalogue reclassification
Applied on 12 October 2026
Backend PR #461 and frontend PR #650 were merged into staging at the owner's request. Migration 0037 and both import scripts were then applied to the VPS. The database backup was validated with pg_restore --list (605,114 bytes), and retained in the restricted main-sealed deployment directory.
- Reclassification dry run and apply: 348 products (28 Blister, 109 Booster, 53 Demi-Display, 93 Display, 65 ETB).
- Composition dry run and apply: 302 eligible, 46 skipped, no invalid set IDs.
- Before/after fingerprints confirm unchanged product counts, identities, image references and metadata outside the two classification fields and composition.
- Public API validation: readiness, all five type filters, 60 distinct products across two pages, secondary series membership, fallback series and image HTTP 200.
- Published catalogue remains at 2,301 products, now with 15 types.
- No API or Nginx restart was necessary: the running routes read the database mappings.
- Mobile page and facet caches refresh on requests after their two/five-minute TTL.
The remaining sections preserve the pre-deployment validation record; their "awaiting merge" and "not applied" statements describe that earlier checkpoint.
Pre-deployment record
Validated; awaiting merge as of 12 October 2026. Backend PR #461 addresses issue #460 on feature/main-sealed-catalogue, at commit 4105cdb. All six backend CI checks and all frontend CI checks passed. The independent Planck review found no additional concrete defect on this backend head. No merge, database apply or deployment has taken place. Implementation, research and validation facts below are supplied by the delivery owner; they are not independent backend, frontend or production checks performed by this docs task.
Existing products, not a second import
The main-sealed inventory contains 348 assets with unique SHA-256 hashes. Every asset has an exact, unique SHA match among the 404 existing main-items assets under pokemon/main-items-sealed. The inventory's legacy source is pokemon-tcg-sealed, with paths beginning main-items-sealed/. Both files in each matched pair were rehashed: 696 SHA-256 checks across 348 aliases.
Reclassifying the corresponding 348 existing product rows avoids duplicate products and preserves their IDs, holdings, scan associations and images. The earlier report recorded main-sealed as excluded because its category mappings were missing; exact-SHA comparison now establishes that their images were already imported through main-items-sealed. This does not establish that reclassification has already been applied to production.
| Main sealed category | Assets |
|---|---|
| Blister | 28 |
| Booster | 109 |
| Demi-Display | 53 |
| Display | 93 |
| ETB | 65 |
| Total | 348 |
These are asset counts, not counts of newly created products or published compositions. The remaining 56 main-items assets are intentionally outside main-sealed and unchanged.
Backend contract
Migration 0037 adds five packaging mappings and two new types, preserving the existing Notion nomenclature snapshot. It extends the mapping instead of rewriting the snapshot or treating packaging labels as booster evidence.
The new reclassify-main-sealed.ts script defaults to a dry run. Before updating an existing row, it checks the legacy product ID, legacy path, exact SHA-256, current mapping and rights. The reclassification atomically updates the two catalogue JSON leaves, packaging_key and main_sealed_path. Existing product identity, holdings, scan data and images are preserved.
The existing composition importer is reused with the legacy source_path. The consolidated manifest uses source_path for the legacy main-items path and main_source_path for the new main-sealed path, so evidence continues to address the existing product. The intermediate research lots use legacy_source_path; that field is not present in the final consolidated manifest. Existing evidence holds remain in force; an identical image or a new packaging mapping does not lift a hold or authorize publication.
Booster evidence and limits
All 348 records reuse exact-SHA evidence from src/api/scripts/data/sealed-research-consolidated.json, checked for relevance to the matched product. Booster quantities and set IDs are unchanged from the old records. New URLs and notes improve the evidence; one previously unresolved record is now partial. No new booster assortment is inferred from the packaging category or filename.
The consolidated manifest is src/api/scripts/data/main-sealed-research.json, with SHA-256:
text
1eee405bc2bbc9d2426effd7935a065a5c81d95a69bfa40e5daec11ac77479c1| Research result | Records |
|---|---|
| Verified, nonempty booster compositions | 302 |
| Partial | 46 |
| Unresolved | 0 |
| Total exact-SHA evidence records reused | 348 |
The scope is the complete booster assortment only. It does not claim a full inventory of accessories, fixed cards, Energy cards or promotional cards. Unknown series remain null; partial evidence and publication holds must remain visible. Research status is distinct from eligibility for composition import.
The offline composition plan validates 302 eligible compositions, with existing evidence holds retained. This is an eligibility result, not a newly published composition count: no database apply has taken place.
Read-only live checks and API validation
The delivery owner reports the following SQL checks against the live catalogue. These checks were read-only and did not apply the migration, reclassification or composition import.
| Live check | Result |
|---|---|
| Expected products | 348 |
| Matched products | 348 |
| Matching legacy paths | 348 |
| Matching SHA-256 values | 348 |
| Products with the expected generic packaging | 348 |
| Products with public-reviewed rights | 348 |
| Missing non-null canonical set IDs | 0 |
Final reported local validation at backend commit 187a597:
- API: 1,092 passed, zero skipped.
- Ingest: 550 passed.
- JavaScript type checking: passed.
Native Docker validation could not run because local Docker is unavailable. The initial E2E fixture omitted the required, non-null image.source_path; commit 4105cdb corrects that fixture. All six checks passed on this final head in backend CI run 38223281217.
| Backend CI check | Result | Duration |
|---|---|---|
| API E2E (PostgreSQL/HTTP) | Passed | 65 s |
| Compose build | Passed | 204 s |
| Ingest integration | Passed | 36 s |
| Probe | Passed | 16 s |
| API | Passed | 37 s |
| Ingest | Passed | 23 s |
The independent Planck review reported no additional concrete defect on 4105cdb. The local Docker limitation remains recorded above; successful CI container checks do not imply a local Docker run or a production deployment.
Frontend validation and cache behavior
Frontend PR #650 contains tests and documentation/changelog updates, with no production-code changes. The reported frontend result is 2,404 passed and 11 skipped, and all frontend CI checks passed. The catalogue page cache lasts two minutes and the facets cache lasts five minutes. These cache lifetimes must be considered when checking catalogue changes; the frontend PR does not itself apply backend reclassification.
Delivery status
- Backend: PR #461, issue #460, branch
feature/main-sealed-catalogue, commit4105cdb; all six CI checks passed, independent review found no additional concrete defect. Validated, awaiting merge; not deployed. - Frontend: PR #650, tests and documentation/changelog updates only; no production-code changes. All CI checks passed; not merged or deployed.
- Documentation branch:
docs/main-sealed-catalogue, based on the fetchedorigin/staging; documentation PR #199 records the validated delivery awaiting merge. - Research: 302 verified nonempty compositions, 46 partial, zero unresolved; all 348 records reused. Offline plan validated 302 eligible compositions; no database apply has taken place.
- Documentation validation:
npm run tracking:indexandnpm run docs:buildpassed on 12 October 2026. The first sandboxed build failed withEPERMwhile resolving a VitePress dependency; the unrestricted retry passed. Backend and frontend suites were not rerun in this documentation worktree.
Merging and deployment remain outside this documentation delivery.