Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ccb114944a | |||
| 98483b804a | |||
| af8c48ce70 | |||
| 756ab616a2 | |||
| 5cb903b989 |
@@ -3,7 +3,3 @@
|
||||
The deployment script and Gitea workflow live in this directory and `.gitea/workflows/`. The current deployment, health/readiness, rollback, and secret-handling guidance is in the repository [infrastructure guide](../docs/infrastructure/README.md), especially [deployment](../docs/infrastructure/deployment.md) and [disaster recovery](../docs/infrastructure/disaster-recovery.md).
|
||||
|
||||
Keep the server `.env` outside the repository. Do not run production deployment, restore, migration, or credential rotation as part of local documentation work.
|
||||
|
||||
MariaDB backup connection parsing uses `scripts/parse-backup-connection.py` (Python 3, already required by deployment preflight). Keys are case-insensitive and support the documented host/user/password/database aliases. Single/double-quoted values may contain semicolons and doubled quote characters. The dump contract requires one TCP host, a database and user, with port 1-65535 (default 3306); an empty password is retained. Duplicate aliases, control characters, host lists/socket paths and database path separators are rejected before dumping. This deliberately bounded parser is not the full MySqlConnector configuration engine. Additional connection options do not change existing dump-client TLS behavior; that qualification remains separate.
|
||||
|
||||
Run `python scripts/test-deploy-backup.py` for the offline synthetic dump-boundary regression. It extracts only the backup function and never executes the deployment entry point, contacts a database or reads the production environment.
|
||||
|
||||
@@ -326,19 +326,19 @@ backup_database() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Keep secrets off argv; parse aliases/quoted separators without evaluating shell text.
|
||||
local db_host db_port db_name db_user db_pass parsed_connection
|
||||
local -a connection_fields=()
|
||||
if ! parsed_connection="$(printf '%s' "$cs" | python3 scripts/parse-backup-connection.py)"; then
|
||||
echo "Could not parse JOBTRACKER_CONNECTION_STRING for backup. Aborting deploy."
|
||||
# Parse the ADO.NET connection string. Keys are case-insensitive in .NET, so match that.
|
||||
local db_host db_port db_name db_user db_pass
|
||||
db_host="$(sed -n 's/.*[Ss]erver=\([^;]*\).*/\1/p' <<<"$cs")"
|
||||
db_port="$(sed -n 's/.*[Pp]ort=\([^;]*\).*/\1/p' <<<"$cs")"
|
||||
db_name="$(sed -n 's/.*[Dd]atabase=\([^;]*\).*/\1/p' <<<"$cs")"
|
||||
db_user="$(sed -n 's/.*[Uu]ser[ ]*[Ii]*[Dd]*=\([^;]*\).*/\1/p' <<<"$cs")"
|
||||
db_pass="$(sed -n 's/.*[Pp]assword=\([^;]*\).*/\1/p' <<<"$cs")"
|
||||
db_port="${db_port:-3306}"
|
||||
|
||||
if [ -z "$db_host" ] || [ -z "$db_name" ] || [ -z "$db_user" ]; then
|
||||
echo "Could not parse host/database/user from JOBTRACKER_CONNECTION_STRING. Aborting deploy."
|
||||
return 1
|
||||
fi
|
||||
mapfile -t connection_fields <<< "$parsed_connection"
|
||||
db_host="${connection_fields[0]}"
|
||||
db_port="${connection_fields[1]}"
|
||||
db_name="${connection_fields[2]}"
|
||||
db_user="${connection_fields[3]}"
|
||||
db_pass="${connection_fields[4]}"
|
||||
|
||||
local target="$BACKUP_DIR/jobtracker-${db_name}-${BACKUP_STAMP}.sql.gz"
|
||||
echo "Backing up MariaDB database '${db_name}' on ${db_host}:${db_port} to ${target}"
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
"sourceBranch": "test/pre-phase10-ux-acceptance",
|
||||
"localCommit": "ba04d817fed26d659bfa2a56b089d6cac851dc34",
|
||||
"localCommitMeaning": "FROZEN_TESTED_APPLICATION_BASELINE",
|
||||
"snapshotHead": "ba04d817fed26d659bfa2a56b089d6cac851dc34",
|
||||
"verifiedRemoteCommit": "ba04d817fed26d659bfa2a56b089d6cac851dc34",
|
||||
"remoteObservation": "Candidate snapshot exact remote readback at2026-10-29T23:37:45.931733+00:00; final documentation envelope HEAD must independently be rechecked.",
|
||||
"snapshotHead": "fc5b9d377199ce51f480a920a3772108094929e3",
|
||||
"verifiedRemoteCommit": "fc5b9d377199ce51f480a920a3772108094929e3",
|
||||
"remoteObservation": "Proposed execution candidate exact remote readback 2026-10-30T07:47:11.270216+00:00; frozen application source remainsba04d817fed26d659bfa2a56b089d6cac851dc34. Resolve final clean envelope HEAD independently.",
|
||||
"worktreeCleanliness": {
|
||||
"atSourceBaseline": "CLEAN",
|
||||
"atPackageGeneration": "HANDOFF_FILES_ONLY",
|
||||
@@ -128,7 +128,7 @@
|
||||
"evidence": [
|
||||
"ENTRY_PROPOSAL.json"
|
||||
],
|
||||
"limits": "Candidateba04d817fed26d659bfa2a56b089d6cac851dc34 exact remote readback at2026-10-29T23:37:45.931733+00:00; final package envelope HEAD still requires clean/current remote verification."
|
||||
"limits": "Execution candidatefc5b9d377199ce51f480a920a3772108094929e3 verified by exact remote readback; actual final envelope HEAD still requires independent current verification."
|
||||
},
|
||||
{
|
||||
"criterion": "Phase 10 Development Readiness",
|
||||
@@ -205,6 +205,6 @@
|
||||
"authority": "EXTERNAL_PROTECTED_CONTROLLER_APPROVAL"
|
||||
}
|
||||
],
|
||||
"generatedUtc": "2026-10-29T23:37:45.931733+00:00",
|
||||
"generatedUtc": "2026-10-30T07:47:11.270216+00:00",
|
||||
"recommendation": "Pre-Phase10 preparation conditionally closed. Retain release/activation debt. Stop at protected orchestrator gate until actual composite adapter, signed exact final baseline/P10-00-only scope policy and owner-controlled runtime/entry activation are satisfied. No cleanup or production action."
|
||||
}
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
"schemaVersion": 1,
|
||||
"workstreamId": "P10-ENTRY-FINAL",
|
||||
"authority": "EVIDENCE_ONLY_NOT_OWNER_APPROVAL",
|
||||
"candidateCommit": "ba04d817fed26d659bfa2a56b089d6cac851dc34",
|
||||
"candidateCommit": "fc5b9d377199ce51f480a920a3772108094929e3",
|
||||
"acceptedBranch": "test/pre-phase10-ux-acceptance",
|
||||
"applicationFixCommit": "154a9e89f565e786d7df00bf93d873da900a7c7d",
|
||||
"packageHeadRule": "Resolve final clean published envelope HEAD independently; bind it, the candidate snapshot, exact scope, policy and artifact hashes in protected approval. No self-referential commit claim.",
|
||||
"entryDecision": "NO-GO",
|
||||
"eligibleForAutomaticExecution": false,
|
||||
"productionDecision": "NO-GO",
|
||||
"generatedUtc": "2026-10-29T23:37:45.931733+00:00",
|
||||
"generatedUtc": "2026-10-30T07:47:11.270216+00:00",
|
||||
"cleanupScope": {
|
||||
"disposition": "ASSESSMENT_ONLY_NO_REMOVALS_APPROVED",
|
||||
"inventory": "CLEANUP_INVENTORY.md:19 retain/assessment entries;57preservation groups/34routes; no proven unused deletion",
|
||||
@@ -113,8 +113,8 @@
|
||||
],
|
||||
"publication": {
|
||||
"status": "VERIFIED_CANDIDATE_SNAPSHOT",
|
||||
"candidateRemoteCommit": "ba04d817fed26d659bfa2a56b089d6cac851dc34",
|
||||
"observedUtc": "2026-10-29T23:37:45.931733+00:00",
|
||||
"candidateRemoteCommit": "fc5b9d377199ce51f480a920a3772108094929e3",
|
||||
"observedUtc": "2026-10-30T07:47:11.270216+00:00",
|
||||
"finalHeadMustBeRechecked": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1613,30 +1613,6 @@
|
||||
"sha256": "bb1b1ccfb03bd888e5e429f5a17c4c106246cfb852b990298236edc7c86c7016",
|
||||
"description": "Scoped human-approved revised S01 qualification; no visual/entry/production approval"
|
||||
},
|
||||
{
|
||||
"id": "p10-final-gate-processes",
|
||||
"path": "evidence/p10-final-gate-processes.gz",
|
||||
"sha256": "1f544cdd3e2efaebe8864604bd7eb7b9dc5dcb5cf2040cc1781cebc79c89fc93",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
},
|
||||
{
|
||||
"id": "p10-proposal-check-native",
|
||||
"path": "evidence/p10-proposal-check-native.gz",
|
||||
"sha256": "8aeb977b01e68447f6a6a290e95e5d116030ddb547441b17ac7fa7bccc873955",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
},
|
||||
{
|
||||
"id": "p10-protected-entry-native",
|
||||
"path": "evidence/p10-protected-entry-native.gz",
|
||||
"sha256": "2c8d977d0b4e9dcfcc120017c44da9ad6738cfac01874815d32e701f3231128d",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
},
|
||||
{
|
||||
"id": "p10-proposal-check-source",
|
||||
"path": "evidence/p10-proposal-check-source.gz",
|
||||
"sha256": "d0505e74d05557e2a7fd64807e5cc1967695413e3e038e83485f7dcaad9c9557",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
},
|
||||
{
|
||||
"id": "s01-initial-package-negative-log",
|
||||
"path": "evidence/s01-initial-package-negative-log.gz",
|
||||
@@ -1670,7 +1646,7 @@
|
||||
{
|
||||
"id": "p10-entry-proposal",
|
||||
"path": "evidence/p10-entry-proposal.gz",
|
||||
"sha256": "3a1b618b1e5fad0adc35c093ef318ebfd7be618653716c7e02386e893345a2af",
|
||||
"sha256": "7c036e998b21ea63387d842218fb8ec1c8b4afa004d155ce54ed4f1ebdd031a6",
|
||||
"description": "Evidence-only exact proposed baseline/scope, owner visual status and remaining protected decisions; no executable permission"
|
||||
},
|
||||
{
|
||||
@@ -1690,6 +1666,30 @@
|
||||
"path": "evidence/handoff-validator-native.gz",
|
||||
"sha256": "b0a525ce25265fc319c62d730e74c72de96482cc3db929b40a060e7b8fdd0938",
|
||||
"description": "Final28 combined unit/package negative tests, exact source and native process; supersedes overlapping prior27"
|
||||
},
|
||||
{
|
||||
"id": "p10-final-gate-processes",
|
||||
"path": "evidence/p10-final-gate-processes.gz",
|
||||
"sha256": "8584076ee515b420ec6c6096918ff038160ba4d8f97f2b8f835ef06144d8fe11",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
},
|
||||
{
|
||||
"id": "p10-proposal-check-native",
|
||||
"path": "evidence/p10-proposal-check-native.gz",
|
||||
"sha256": "8aeb977b01e68447f6a6a290e95e5d116030ddb547441b17ac7fa7bccc873955",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
},
|
||||
{
|
||||
"id": "p10-protected-entry-native",
|
||||
"path": "evidence/p10-protected-entry-native.gz",
|
||||
"sha256": "e89902f1343ad5dad14221aaa7c7f7f5ad1da432bed4a40ad82d48f48c4e5b89",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
},
|
||||
{
|
||||
"id": "p10-proposal-check-source",
|
||||
"path": "evidence/p10-proposal-check-source.gz",
|
||||
"sha256": "bf7a50107916a94e6faf075c42be0116bdd33a05f88f640e149a60c70de3415b",
|
||||
"description": "Actual companion schema/negative and native blocked-entry observations; not product-case totals or protected approval"
|
||||
}
|
||||
],
|
||||
"reports": [
|
||||
@@ -2369,7 +2369,7 @@
|
||||
"id": "p10-proposal-schema",
|
||||
"bindingScope": "APPLICATION",
|
||||
"sourceCommit": "ba04d817fed26d659bfa2a56b089d6cac851dc34",
|
||||
"executedFromCommit": "1a47f7ac1d9cddd647135ebee808a77301335016",
|
||||
"executedFromCommit": "fc5b9d377199ce51f480a920a3772108094929e3",
|
||||
"status": "PASS",
|
||||
"exitCode": 0,
|
||||
"artifactId": "p10-proposal-check-native",
|
||||
@@ -2390,7 +2390,7 @@
|
||||
"id": "p10-protected-entry",
|
||||
"bindingScope": "APPLICATION",
|
||||
"sourceCommit": "ba04d817fed26d659bfa2a56b089d6cac851dc34",
|
||||
"executedFromCommit": "1a47f7ac1d9cddd647135ebee808a77301335016",
|
||||
"executedFromCommit": "fc5b9d377199ce51f480a920a3772108094929e3",
|
||||
"status": "BLOCKED",
|
||||
"exitCode": 3,
|
||||
"artifactId": "p10-protected-entry-native",
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
# P10-00 — Baseline and deletion eligibility assessment
|
||||
|
||||
> **Direct-chat review, 2 November 2026:** this draft is preserved below as historical worker evidence. The completed direct assessment is [P10-00](../../../redesign/phase-10/P10-00.md), with [continuity and the next gate](../../../redesign/phase-10/HANDOFF.md). Its current Git observations, evidence checks and narrowly nominated `App.css` candidate supersede this draft's unavailable-Git and no-candidate conclusions. Controller-specific claims below are historical, not verified authority in this chat. The owner authorised direct P10-00 assessment only; the orchestrator remains paused and untouched. No P10-01 implementation is authorised.
|
||||
|
||||
Date: 1 November 2026. Scope: read-only assessment and this Markdown report only.
|
||||
|
||||
## Decision and authority
|
||||
|
||||
P10-00 worker handoff is ready for independent controller checks. This is not checkpoint acceptance or full Phase 10 completion. No deletion is eligible on the evidence inspected. Recommend no P10-01 implementation scope at present. Stop at the protected `candidate-specific-cleanup-scope` gate.
|
||||
|
||||
The active checkpoint and supplied verified owner decisions supersede the older handoff's unconfigured-adapter/unsigned-entry statements only for this restricted assessment. They authorize inspection and Markdown reporting at proposed integration baseline `fc5b9d377199ce51f480a920a3772108094929e3`; they do not authorize product changes, later checkpoints, security waivers or production. Active manifest identity supplied by the controller is `51e12f29078c420ac4ebd10127c8b7f7ba3cd73eac09dcbb4d47da1fe88fbeaf`. Private receipts and credentials were not accessed.
|
||||
|
||||
The current control contract prohibits worker branch changes, commits and pushes. Consequently the controller must verify the current branch, clean immutable candidate, ancestry, source correspondence, normal publication and exact remote readback. No network query was made. Attempts to obtain Git identity failed because the worktree Git metadata was inaccessible. The shell started at `C:\` despite requested working directory; changing directory failed at the denied ancestor. Direct absolute-path reads of permitted repository files succeeded. This limits identity verification, not the authority of the supplied baseline. No alternate Git directory or permission bypass was used.
|
||||
|
||||
## Entry evidence reviewed
|
||||
|
||||
Read repository `AGENTS.md` and `docs/redesign/IMPLEMENTATION_PLAN.md`, especially its requirement for unused-route proof, passing tests and preserved functionality before removal. Reviewed acceptance introductions and relevant evidence sections in:
|
||||
|
||||
| Authority | Retained decision |
|
||||
| --- | --- |
|
||||
| `docs/redesign/phase-9/p9-requal-01/ACCEPTANCE_ADDENDUM_2026-10-24.md` | Historical Phase 9/10 NO-GO; RD21 resolved only in tested scope; hosted MariaDB blocked. |
|
||||
| `docs/redesign/phase-9/p9-sec-02/ACCEPTANCE_ADDENDUM_2026-10-25.md` | Later Phase 9 CONDITIONAL GO for qualified development; incomplete vendor Torch advisory response and release limitations retained. |
|
||||
| `docs/cv-redesign/ACCEPTANCE.md` | CV-UX-01 automated development PASS; overall CONDITIONAL GO; human/model/release limitations remain. This is the actual CV-UX report location. |
|
||||
| `docs/cv-import/ACCEPTANCE.md` | CV-IMPORT-01 CONDITIONAL GO for supported model-independent workflow; optional model adapter disabled/disconnected. |
|
||||
| `docs/cv-integration-qa/ACCEPTANCE.md` | CV-QA-01 CONDITIONAL GO; assessment/planning only, not cleanup authority. |
|
||||
| Supplied final entry, ready-to-run, protected request, acceptance, blockers, gates and entry proposal | Frozen tested application `ba04d817fed26d659bfa2a56b089d6cac851dc34`; published proposal `fc5b9d3`; PDF visual/S01 development approval does not establish physical printing or entry authority. |
|
||||
| Supplied active checkpoint and verified owner decisions | Assessment entry/evidence-reuse/runtime applicability granted; independent canaries pending; protected stop after P10-00. |
|
||||
|
||||
The supplied original 19-entry inventory and prior CV-QA handoffs are carried forward below, with newly inspected source observations explicitly distinguished from inherited findings. These reports are not independently rehashed native evidence in this worker turn. No old conditional decision has been promoted to unconditional acceptance.
|
||||
|
||||
## Candidate inventory
|
||||
|
||||
All entries have action **retain** unless stated otherwise. Historical purpose and current consumer are combined in the second column. An active consumer defeats a deletion proposal; it does not require proving exhaustive non-use. No entry below asserts absence of runtime consumers. Group mappings are affected groups, not new PASS claims.
|
||||
|
||||
| ID / file or area | Historical purpose / current consumers and evidence | Preservation / proposed tests / risk |
|
||||
| --- | --- | --- |
|
||||
| CLEAN-01 `src/views/CvBuilderEditor.tsx` | CV authoring owner. Directly observed `App.tsx` lazy import and `/career/builder/:id` registration; not superseded merely by new library UI. | C05–C10; blank/inherited CV, undo/history/save/recovery/browser; HIGH. |
|
||||
| CLEAN-02 `src/components/CvTemplateThumbnail.tsx` | Template preview. Directly observed `CvTemplateGallery.tsx` import and render. Inherited inventory identifies sandboxed server sample HTML/cache/error paths. | C05/C08/C12; gallery/sample error/iframe/PDF checks; HIGH. |
|
||||
| CLEAN-03 `src/components/CvTemplateGallery.tsx` | Selection/library with explicit Apply and entitlement semantics; thumbnail composition directly inspected, no duplicate implementation established. | C05/C08; selection/legacy design/entitlement/browser; HIGH. |
|
||||
| CLEAN-04 `src/views/career/CvImportReview.tsx`, `CvImportMappingEditor.tsx` | Source correction/review owner. Directly observed `CareerProfilePage.tsx` renders review for pending/applied `docling-v1` runs; mapping responsibility inherited from CV-QA. | C01–C03; PDF/DOCX correction/assignment/duplicates/provider rollback; CRITICAL. |
|
||||
| CLEAN-05 legacy `CareerProfilePage.tsx` / `ProfileCvController.cs` | Historical non-Docling review. Directly observed non-Docling diff condition, POST `/profile-cv/runs/${runId}/accept`, and `[HttpPost("runs/{id:int}/accept")]`; a paired UI/API consumer exists. | C01–C03; old-run fixtures, accept/discard/conflict/replay; CRITICAL. |
|
||||
| CLEAN-06 `src/components/DashboardLayoutEditor.tsx` | Show/hide/save/reset/conflict/navigation owner. Directly observed `components/DashboardView.tsx` imports and renders both editor and grid. Grid is not its replacement. | M01–M06/E07/E08; preferences/keyboard/navigation/conflict/responsive; HIGH. |
|
||||
| CLEAN-07 `src/dashboardLayout.ts`, `hooks/useDashboardLayout.ts` | Persisted layout migration/CAS and hidden/future widgets per inherited inventory; hook directly imported by DashboardView. | M01–M06/S01–S05; v1/v2 migration, stale save, account disposal; HIGH. |
|
||||
| CLEAN-08 `src/views/AdminProcessingPage.tsx` | Current owner-scoped operation monitor; direct lazy import and `/admin/processing` registration in App. Audit/users/system routes remain separately registered. | A01–A03/E09/W12; authorization/redaction/rate/polling/browser; CRITICAL. |
|
||||
| CLEAN-09 redirects in `src/App.tsx` | Historical bookmarks/extensions. Directly observed `/kanban`, `/correspondence/review`, `/applications/:id` use compatibility redirect elements. | E07/J04/J07/W01; query/hash/navigation/ownership contracts; HIGH. |
|
||||
| CLEAN-10 `Models/CvTheme.cs`, `Services/ThemedCvRenderer.cs` | Historical document design. Directly observed version-sensitive theme resolution and multiple `DesignVersion == 2` layout branches; new appearance does not retire old settings. | C05–C12/W06/W07; unchanged Windows/Linux CV/letter goldens and frozen archives; CRITICAL. |
|
||||
| CLEAN-11 `CareerProfileMapper.cs` and import mapping/interpreter owners | Canonical persistence versus source interpretation/review translation; inherited CV-QA distinguishes side effects. No duplicate owner proved. | C01–C03/W05; provider transactions/rollback/replay/stale revision; CRITICAL. |
|
||||
| CLEAN-12 `ApplicationAssetsService.cs`, versioned writers | Inherited application/CV/letter/frozen submission contracts include null/no-op and RD21 behavior. No obsolete writer established. | W05–W07/C10; all writer, ownership, retry/conflict/frozen-byte tests; CRITICAL. |
|
||||
| CLEAN-13 migrations/context/provider helpers | Existing installation adoption and provider compatibility; staged retirement report explicitly withholds deletion. | All groups with persistence; migration/populated startup/parity/backup-restore; CRITICAL. |
|
||||
| CLEAN-14 `tools/summarizer/parser_child.py`, legacy extraction, Docling runtime | Inherited attachment/text consumers differ from structural CV conversion. Full runtime/route/image consumer census still needed. | C03/W08/W03; legacy extraction, parser security, actual Docling; HIGH. |
|
||||
| CLEAN-15 `tools/summarizer/cv_import_ai.py`, `CV_IMPORT_AI_ENABLED` | Disabled optional capability with contract tests, not obsolete functionality. Retain disabled; no activation. | C11/C03; disabled transport/schema/grounding/failure tests, separate model qualification; HIGH. |
|
||||
| CLEAN-16 shared styles/tokens/fonts/accessibility utilities | App theme and physical document/iframe/export styles have distinct owners; no asset/token unused proof. Dynamic names/embedding/locales remain unresolved census requirements. | E08/C08/C09/C12; type/lint/build/theme/EN/NB/axe/native PDF; HIGH. |
|
||||
| CLEAN-17 package/lock dependencies | Directly inspected `package.json` runtime/test/build scripts. `DashboardGrid.tsx` imports `react-grid-layout` and its CSS. No dependency removal justified by age or dependency section. | All affected groups; runtime/tool/script/Docker/platform census, reproducible lock/build/security/provider checks; HIGH. |
|
||||
| CLEAN-18 tests/goldens/historical reports | Regression and audit consumers, including original failures. Do not discard fixtures or assertions because newer paths pass. No obsolete fixture demonstrated. | All 57; discovery membership/oracle hashes/evidence integrity; HIGH. |
|
||||
| CLEAN-19 shell/dashboard reminder reads | Inherited P9-PERF-01 measurement candidate only; current duplicate request count not measured. Proposed action: retain, consider separately bounded measurement before consolidation. | W11/M01–M06/E09; loading/error/refresh/account disposal and before/after network counts; MEDIUM. |
|
||||
|
||||
Frontend paths in this table are relative to `job-tracker-ui`; backend paths are relative to `JobTrackerApi` unless otherwise qualified. Preservation prefixes are `PRES-`.
|
||||
|
||||
## Census coverage and limitations
|
||||
|
||||
Direct source inspection covered outer/public and shell route registrations, lazy imports, paired historical import UI/API consumers, design-version branches, dashboard ownership, gallery composition and dependency scripts. This uses several independent kinds of evidence; no safety conclusion rests on a single negative search. `rg` was unavailable, so bounded PowerShell reads and searches were used. No repository-wide zero-reference claim is made.
|
||||
|
||||
Old pages/layouts/editors/import screens/document components are retained by the candidate register. Styles/tokens/hooks/utilities/dialogs/accessibility helpers have no proven unused candidate. Frontend routes and API endpoint compatibility have positive active examples; exhaustive external API-consumer absence is not established. Feature-flag inactivity is not obsolescence. Localisation keys, deprecated fixtures and dead assets need dynamic-key, bundle/export, test-discovery and historical-reference checks before any nomination. Dependency census must additionally cover conditional imports, build/test tooling, scripts, Docker and platform-specific paths; inspection of package metadata alone cannot prove non-use. Persisted-data inventories were not queried and no user data was opened. This is a bounded assessment, not a completed exhaustive dead-code proof.
|
||||
|
||||
## Historical data, SQLite and architecture
|
||||
|
||||
Retain canonical Career Profile separately from CV overrides, inherited settings, historical versions, frozen submitted HTML/binaries, letters and application associations. Retain historical extraction runs and review/accept DTOs. No migration, data rewrite, route alias removal or renderer replacement is proposed. Actual old-document load/export verification is NOT RUN in this turn.
|
||||
|
||||
Read `docs/database/mariadb-standardisation/README.md`, `ACCEPTANCE.md` and `SQLITE_RETIREMENT.md`. Retirement remains PLAN READY / REMOVAL NO-GO. The six gates require operator installation inventory, complete consistent export plus isolated restore, full-fidelity copied-data transfer, MariaDB coverage parity including direct SQLite harnesses, approved cutover with rollback after new writes, and retention-window sign-off. Existing partial export cannot establish lossless migration. No evidence reviewed closes those gates. Keep SQLite packages/helpers/provider branches and historical migrations. Track retirement independently; it does not block unrelated safe Phase 10 assessment or future qualified cleanup.
|
||||
|
||||
Architecture improvements delivered here: none to product code. The report clarifies ownership and deletion boundaries. Removed files/dependencies: none. Performance/build-size differences: NOT MEASURED; no claimed improvement. Rollback for this assessment is removal/reversion of this report only, with no data or product rollback needed. Any future implementation requires its own exact reversible patch and compatibility strategy.
|
||||
|
||||
## Preservation and validation handoff
|
||||
|
||||
Read Phase 9 preservation Markdown and parsed `p9-requal-01/preservation.json`. Carry all 57 IDs: E01–E09, J01–J10, W01–W12, C01–C12, M01–M06, S01–S05, A01–A03. Retain 56 PARTIAL / C11 DEFERRED, not PASS. Original 33-route register plus admin processing remains the 34-route preservation scope; wildcard/root routing must not be confused with independently accepted capabilities. App registration inspection is not end-to-end verification of every route.
|
||||
|
||||
Worker product tests, browser/visual checks, MariaDB, sidecar/Docling, PDF fidelity, types, lint, build, security, accessibility, EN/Bokmål and historical-document runtime checks: **NOT RUN**. No fresh test counts are claimed. Supplied prior full-suite evidence remains historical: backend 1448, frontend 1031, affected Windows browser 51, separate import 8/MariaDB 90+3/RD21 6/admission 1/Linux 8, Python 83 + Docling 14, and both-platform exports, each retaining original execution identity and limitations. Original S01 28/20 failures remain historical; approved metric requalification 36/36 per platform is not a new export or physical print test.
|
||||
|
||||
Controller must independently execute approved fixed suite IDs against the immutable handoff candidate: `backend-canary`, `frontend-canary`, `typecheck`, `lint`, `build`, `browser-canary`, `mariadb-canary`, `rd21-canary`, `python-canary`, `parser-security`, `docling-canary`, `pdf-linux-canary`. Require exact nonempty membership, process exits, source/freshness binding, no concealed failures/skips/retries, and cleanup evidence. No representative canary result can be reported as a fresh complete regression. Controller owns private receipt verification, publication and checkpoint acceptance. If identity/source correspondence fails, do not reuse historical evidence or advance.
|
||||
|
||||
## Decisions and next protected boundary
|
||||
|
||||
| Decision | Status |
|
||||
| --- | --- |
|
||||
| P10-00 report handoff | Complete for independent checks; acceptance pending controller verification. |
|
||||
| Phase 10 overall | NO-GO for completion/implementation beyond assessment; no removal eligibility or P10-01 scope approved. |
|
||||
| Redesign development completion | CONDITIONAL GO remains limited to inherited development/preparation acceptance; final cleanup completion not established. |
|
||||
| Product review readiness | NO-GO for post-Phase-10 acceptance handoff; this is a preparatory debt/ownership report only. |
|
||||
| Production release | NO-GO. |
|
||||
|
||||
Remaining debt: human physical-device/AT/contrast/EN-NB/printing checks NOT TESTED; real CV AI BLOCKED and disabled; deterministic recall/review burden and canonical-only generic-AI context limitations retained; Python vendor advisory incompleteness, hosted CI isolation, production TLS/advisories, native processing, filesystem/off-disk backup/restore and deployed identity remain separately unresolved. No risk acceptance, model activation, provider activation, schema change, main merge or deployment occurred.
|
||||
|
||||
PRODUCT-REVIEW-01 preparatory handoff: preserve all contracts and individual debt dispositions, review canonical-only generic-AI context separately, and do not infer production readiness from UI/PDF appearance approval. Final phase-10 deliverables under `docs/redesign/phase-10/`, full regression reconciliation and post-redesign acceptance remain future work outside the current writable/approved report scope.
|
||||
|
||||
TODO: controller verifies candidate/Git identity and independent checks; owner reviews this no-removal recommendation at the protected stop. A later request must name exact symbols, callers/routes/dynamic exports, old-data consumers, affected preservation IDs, compatibility transition, rollback and focused/full applicable tests. No P10-01 work should begin without that signed candidate-specific scope. If no candidate gains proof, retain it rather than invent cleanup work.
|
||||
@@ -1,21 +0,0 @@
|
||||
# Blockers
|
||||
|
||||
2 November 2026. Severity describes impact/gate importance, not an invented vulnerability rating.
|
||||
|
||||
| ID | Feature / description and known cause | Severity / dependency | Required action | Elsewhere / gate scope / status |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| B01 | P10 publication: Gitea pre-receive SIGSEGV rejected prior pushes | Mandatory checkpoint; external server fault | Normal push and exact readback | RESOLVED: remote `1692142295950e390a4cf807d9df86cc5cf96290`; no server repair performed |
|
||||
| B02 | P10-01 candidate approval absent; addendum explicitly retains this gate | Mandatory owner decision D01 | Approve/reject exact CLEAN-20 scope | Independent authorised planning allowed; blocks cleanup implementation; AWAITING_APPROVAL |
|
||||
| B03 | Ordered roadmap implementation lacks accepted predecessor phases | Mandatory dependency | Complete/accept predecessors and stage-specific scopes | Explicitly independent planning allowed; blocks dependent development; BLOCKED |
|
||||
| B04 | Physical device/AT/contrast/native-language/actual print qualification missing | Release qualification | Human review with actual evidence | Unaffected planning can proceed; production and affected acceptance; NOT_TESTED |
|
||||
| B05 | Real CV-model compatibility/semantic quality unqualified; adapter withheld | High activation gate | Separately approve safe immutable model qualification; retain disabled state | Model-independent work allowed; AI activation/claims; BLOCKED |
|
||||
| B06 | Hosted CI/isolation, production TLS/advisories, native parser/image isolation, backup/restore and deployed identity lack current qualification | High release gate; inherited evidence limits | Operator/isolated release evidence and scoped security disposition | Unrelated planning allowed; production; BLOCKED/NOT_TESTED by lane |
|
||||
| B07 | SQLite retirement lacks complete transfer, restore, parity, cutover and retention evidence | High data-preservation gate | Separate approved staged retirement | Unrelated cleanup/planning allowed; SQLite removal; BLOCKED |
|
||||
|
||||
No material security risk or missing test is accepted by this register. Current dependency advisory status has not been refreshed; historical findings are not claims about a new scan. Additional source-specific entry decisions are recorded after eligibility review.
|
||||
|
||||
Execution interruption: the three delegated workers hit a service usage limit. Parent continued and published partial I18N, homepage and release discovery checkpoints. Remaining audit/context/legal/rendered work is IN_PROGRESS/PENDING, not falsely classified as an external blocker. Resume locations are in NEXT_ACTIONS.md. No workers are running in the background.
|
||||
|
||||
Security entry: the master prompt's `DO NOT START THIS NOW!` and feature-completion dependency remain unresolved; conflicting README immediate-review wording does not authorise a formal scan. No new vulnerability findings or material risk acceptance are claimed.
|
||||
|
||||
RR-11 adds a reproduced deployment-backup parser compatibility defect (proposed P2); RR-12/13 document unqualified rollback/restore/encryption boundaries. See FINDINGS.md and the release branch recovery report. These do not block independent research or authorise deployment changes. I18N's remaining 80 dynamic calls and broader census are unfinished eligible work, not external blockers.
|
||||
@@ -1,33 +0,0 @@
|
||||
# Direct roadmap checkpoint - 2 November 2026
|
||||
|
||||
This is a consolidated progress report, not a final declaration that eligible work is exhausted. Independent research remains available. Product implementation is unchanged; the orchestrator remains paused and untouched.
|
||||
|
||||
## Completed and published
|
||||
|
||||
P10-00 assessment is complete and published; candidate-specific P10-01 scope is recorded as D01. Normal Git publication now works. Existing GJ-00 planning publication is independently verified. Detailed exact commits are in WORK_COMPLETED.md.
|
||||
|
||||
## Partial work
|
||||
|
||||
- I18N: source audit and machine-readable message inventory; initial Europe matrix and schema-validated planned locale catalogue. Dynamic/hardcoded/backend text, full contextual/legal review and final compatibility decision remain. No additional language translated or released; all 60 candidates remain planned.
|
||||
- Homepage: source audit identifies sign-in versus registration CTA mismatch, conceptual SVG previews, client-only rendering, generic metadata and missing footer legal links in the component. These are documented observations, not fixes. Four viewable concepts, genuine captures, imagery licensing, rendered accessibility/performance/SEO and owner design choice remain.
|
||||
- Release: preliminary architecture and failure-boundary inventory, ten historical blocker reconciliations and 18 mandatory gate rows. Five offline guard tests passed. No release candidate qualified.
|
||||
|
||||
## Decisions and dependencies
|
||||
|
||||
Approve or retain only CLEAN-20 (`job-tracker-ui/src/App.css`, exact blob and verification scope in OWNER_DECISIONS.md). Generic continuation is not approval. Product Review prioritisation, provider agreements, I18N implementation/native release, homepage visual design, security entry/risk and production release each retain their separate gates. Later decisions will be presented with concrete evidence, not blanket permission requests.
|
||||
|
||||
## Security and AI
|
||||
|
||||
Formal Security Audit has not started. Historical advisory/TLS/parser/image/operator qualifications remain unresolved, with no new vulnerability scan or waiver. Real CV-model compatibility and semantic accuracy remain blocked; deterministic extraction evidence does not establish model quality. No models or production services were started or accessed.
|
||||
|
||||
## Global Jobs
|
||||
|
||||
GJ-00 planning at `0ec9f98e6ed4a646fc5e017d8eb6fade07653f37` is remotely verified. No new country/provider integration implemented in this continuation. Existing NAV/source behavior is not evidence that the planned global feature set is live. GJ-01 requires accepted predecessors, exact implementation authority and provider rights.
|
||||
|
||||
## Release and preserved evidence
|
||||
|
||||
Latest scoped PDF metric/visual acceptance remains preserved; no affected renderer/font/fixture change justified reopening it. Physical print/device/AT/native-language checks are separate. Hosted MariaDB isolation remains explicitly blocked in source. Backup existence is not restore proof; final CI, recovery, migration, provider, production-equivalent identity and rollback evidence remain missing. Production is NO-GO.
|
||||
|
||||
## Next work
|
||||
|
||||
Resume the precise eligible tasks and isolated worktrees in NEXT_ACTIONS.md. Delegated work stopped at a service usage limit; the parent salvaged, corrected and extended it. No background execution is running. Ordinary independent research does not require a new blanket prompt; the remaining P10 decision does require explicit approval under the user's addendum.
|
||||
@@ -1,20 +0,0 @@
|
||||
# Continuing findings list
|
||||
|
||||
2026-11-02. Observed defects, source limitations and planning work are separate. This list does not approve implementation, accept risk or close mandatory gates. Exact branch evidence is in WORK_COMPLETED.md.
|
||||
|
||||
| ID | Finding | Evidence / current state | Next action |
|
||||
| --- | --- | --- | --- |
|
||||
| RR-11 | Deployment backup parser fails to extract the documented `Host=` alias; uppercase `SERVER=` also fails | REPRODUCED with shell-native synthetic positive control; canonical `Server=` works. Proposed P2 compatibility defect, no production impact inspected | Minimal parser/contract remediation in authorised release scope; alias/case/quoted separator/redaction checks |
|
||||
| RR-12 | Core-image rollback lacks post-rollback health check and does not reverse database/schema or AI changes | VERIFIED SOURCE LIMITATION; runtime recovery NOT TESTED | Isolated post-migration/post-write rehearsal; distinguish image-only and data recovery |
|
||||
| RR-13 | Backup format checks and off-host messages do not prove restore consistency or encryption | QUALIFICATION GAP; no actual recovery performed | Verify database/files/keys/tombstones together, off-host retrieval/decryption and agreed RPO/RTO |
|
||||
| I00-13 | Session-invalidated alert is hardcoded English | SOURCE VERIFIED, `App.tsx:488` | Localise without retaining old session tree or relying on discarded provider state |
|
||||
| I00-14 | Workflow overline `Flow` bypasses catalogue | SOURCE VERIFIED, `JobFlowBar.tsx:147` | Extract controlled UI label in approved I18N implementation |
|
||||
| I00-15 | Attachment iframe accessible title is only `pdf` | SOURCE VERIFIED, `Attachments.tsx:361` | Descriptive localised title; exclude private filenames from translation exports |
|
||||
| I00-16 | `EN`/`NO` and `English`/`Norsk` do not express planned locale/variant contract | SOURCE VERIFIED, `AppShell.tsx:692` | Native/English names, Bokmal/Nynorsk distinction and legacy nb preservation |
|
||||
| I00-17 | Attachment size uses fixed decimal formatting | SOURCE VERIFIED, `ApplicationAssets.tsx:360` | Locale-aware numeric display; preserve bytes and filename |
|
||||
| I00-18 | Language-save failure/retry reads catalogue directly | ACTIVE CONTRACT, `I18nProvider.tsx:43`; not a defect by itself | Preserve same-language retry/stale-save behavior; include in migration inventory |
|
||||
| I00-19 | Homepage framework/provider-name list is poor user-value copy | SOURCE VERIFIED, `LandingPage.tsx:133`; design recommendation | Coordinate with Launch Site concepts; no unapproved copy or feature claims |
|
||||
|
||||
I18N progress: 108/188 dynamic calls resolved to finite literal branches; 240 existing-key references validated; 80 calls remain. Four direct reads and 26 reviewed JSX/accessibility candidates recorded. These are inventory counts, not translation completeness or runtime test passes.
|
||||
|
||||
Earlier homepage and qualification findings remain in their branch reports. Add new findings with stable IDs and evidence status; do not rediscover unchanged items on each continuation.
|
||||
@@ -1,27 +0,0 @@
|
||||
# Direct roadmap integration — 2 November 2026
|
||||
|
||||
Published implementation checkpoint `557efde073a380030a39066fab2e6d961ce717f4` was independently read back on origin/codex/direct-roadmap-integration. Follow-up test-only catalogue QA adds three invariants and runs with existing provider/persistence stability tests: 10 passed in three additional suites; see ../i18n/EN_NB_CATALOGUE_QA.md. No runtime application change after the passing build.
|
||||
|
||||
Subsequent bounded localisation fix: supported-language control now names Bokmål explicitly and shows NB, retaining preference values and handlers. Seventeen shell/language tests passed; scoped lint, full typecheck and a new production static build passed after this change. See ../i18n/LANGUAGE_CONTROL_QA.md. This later run overlaps i18n-provider coverage in the 10-test QA run; keep those counts separate. No final UI design was implemented.
|
||||
|
||||
Validated isolated review branch `codex/direct-roadmap-integration`. Base Phase 10 `db818e5ebd19eeedc05ae58dc3f7a908ce0e713d`; selected application paths and docs/i18n from published `4172c23d7ce13e8327a5e51bbb09f296c24fb9b8`; backup parser/deploy function and release-readiness reports from `f19e7ebf4aeae350b43fa84cf115c393030280f0`. Content was integrated by explicit owned paths, preserving the Phase 10 accepted handoff records and approved App.css deletion. No full-branch history overwrite, orchestrator access, main merge, final UI design or deployment.
|
||||
|
||||
## Fresh qualification
|
||||
|
||||
- PASSED: 195 tests in 16 explicitly selected frontend suites, zero failures/pending, native exit 0, 40.06 seconds. Includes session/tenant client boundary, attachment preview, inherited-name fallbacks, pipeline/board, checklist/workspace and document/interview workflows. [Native JSON](integration-evidence/frontend-native.json.gz). This is a new combined execution; do not add preceding branch runs to its total.
|
||||
- PASSED: full TypeScript typecheck, full ESLint with zero warnings, native exits 0.
|
||||
- PASSED: Next 16.4.1 production static build, including TypeScript and all three generated pages, native exit 0. Local API base at build time, no live API/provider/model qualification.
|
||||
- PASSED: five actual backup-function parser tests using synthetic strings and mocked dump/Docker boundaries, native exit 0. Git Bash syntax check of deploy/deploy.sh also exit 0. No deployment script was sourced or run in full; no dump, database, model or production operation.
|
||||
- PASSED: portable register/inventory/source/owner dependency hashes match the integrated working tree; approved stylesheet remains absent. Raw inventory hash initially differed after Git CRLF checkout. Register schema 3 now declares LF-normalised reviewed-text hashes, preserving historical raw source hashes and original census content. This corrected evidence portability; no runtime failure was hidden.
|
||||
- npm ci used the locked offline cache, 825 packages; lockfile unchanged. Existing deprecation and unapproved unrs-resolver install-script notices were retained; no dependency/script approval changes.
|
||||
- Backend/API/test/configuration and automation handoff records have no diff from the integration base. Reuse the 103 selected backend / 92 frontend Phase 10 evidence only within its original scope; those are not extra integration tests.
|
||||
|
||||
## Scope and remaining gates
|
||||
|
||||
This branch makes the approved ordinary fixes reviewable together. The original 188-call dynamic key-domain census is accounted for; full I18N-00, every-string context/backend extraction, European locale registry/release, grammar/native review and all runtime coverage are not accepted. No additional locale or country is published.
|
||||
|
||||
Phase 10 P10-05 remains OPEN: full suite/preservation reconciliation, independent audit and required human/environment qualifications remain. Product Review and Global Jobs entry/provider/data gates remain. Public homepage proposals on feature/launch-site-redesign are design-neutral documentation, not included visual implementation. Five application concepts and comparison remain available in the separate design worktree; no final unapproved design integrated.
|
||||
|
||||
New browser/native-device, final integrated security/plugin scans, hosted CI, real provider, backup/restore/rollback and production tests NOT RUN here. Security source/relational attachment review remains separately scoped. No production qualification is inferred from this branch or static build. Publish only to this review branch and independently verify the ref; no main merge/deployment.
|
||||
|
||||
Next: review this combined checkpoint; continue locale context/literal QA and safe source audit, then execute affected browser and final integrated qualifications when their scope and approvals are satisfied. Do not repeat successful unchanged targeted runs merely to resume the chat.
|
||||
@@ -1,34 +0,0 @@
|
||||
# Direct execution continuation
|
||||
|
||||
Current continuation after 2a4acc17: Phase 10 acceptance register published/read back at `6f29ed4cdb7b259318282f365d737f6cfdb6a682` (P10-05 remains OPEN). Fresh integrity check: 263 indexed artifact hashes and 1,279 retained source hashes match; only approved App.css absent. No extra deletion candidate.
|
||||
|
||||
I18N branch latest published/read-back `ebd33fcf0040ed7ebe659c75171873a88cdfc025`. Actual fixes: `2108ea50` session-change message uses existing EN/NB catalogue outside private providers; `7b132ec4` own-property guards for completeness/timeline unknown labels; `36db9322` inherited-name pipeline alias fallback. Selected runs separately: 17 session tests, 41 label/workflow tests, 29 pipeline/board tests, all passing. Typecheck and scoped lint passed for each implementation package. Static production build passed before the final one-line pipeline patch; do not claim a fresh final-pipeline build. Local AST graph update completed, 18,560 nodes / 46,020 edges; generated graphs untracked. Sanitized 17/41 native reports committed; pipeline native JSON remains ignored locally. DYNAMIC_RESOLUTION_REGISTER.json binds 18 individually matched supplemental call sites and reviewed source hashes to the original inventory: 126 resolved / 62 pending of 188, no duplicate counts. Final integrated security tests remain open until relevant application changes are complete.
|
||||
|
||||
Five rendered UI concepts are review-ready: product-modernisation local-only commit `c678ebdb`, docs/product-modernisation/REVIEW_PACK.md. Gallery http://127.0.0.1:4317/gallery.html; preferred expanded A3 http://127.0.0.1:4317/expanded.html. All 70 original screenshot files and ten gallery previews confirmed present; accepted 75-screenshot execution reused, not rerun. Earlier owner choices retained; no final unapproved design implementation. Design branch not pushed under its specific publishing restriction.
|
||||
|
||||
Global Jobs eligibility rechecked against planning branch docs/global-jobs/00/DEPENDENCIES_AND_GATES.md, PROVIDER_RIGHTS_MATRIX.md and OWNER_ACTIONS.md. Their old blanket no-implementation authority is superseded only by later direct-chat authorisation for independent ordinary work; required Phase 10/Product Review acceptance, stage/data/lifecycle/provider grants remain open. GJ-00 evidence is dated 28 October, not a fresh provider check. No credentials, registrations, scraping or provider calls occurred. European localisation registry/market/native-review choices, public homepage visual/claims approval, final design, hosted/live recovery/CI and security scan/staging gates remain separate; do not silently mark them complete.
|
||||
|
||||
Next eligible work: continue the 62 unresolved dynamic calls using the machine register to avoid repeats; review processing-monitor external-key maps for inherited-property behavior, then finite interview/prep/action maps; finish European catalogue context/legal evidence and eligible fixture checks; continue security owner-filter/source matrix review without final integrated scanning. Prepare fresh build/browser checks when relevant app scope stabilises, retaining all baseline/source boundaries. No immediate owner input is required for this offline work. No orchestrator access, pre-P10 edits, main merge or production deployment.
|
||||
|
||||
Newest continuation receipts: Phase 10 `ba826de1e5c959352e4442ab2fec5d02445dd32d` (89 backend + 92 frontend selected cases, separately counted); I18N `bab240914e30fb1e8e3756fbe568cbd60e39db32` (120/188 dynamic calls resolved; 68 pending); security offline preflight `0a17a33db7b9944693976df432f1e5a319277279`. All three refs were independently read back after normal publication. Security worktree: C:\Users\Connor\.codex\worktrees\security-offline-preflight\Job tracker, branch codex/security-offline-preflight. It contains partial Phase 00/01 inventory, ROE, eight-row source endpoint matrix and honest scan register. No scan or active staging attack executed; no policy file written. Continue there from docs/security/01-threat-model.md, completing owner-filter/sibling-path/source matrix review and actual plugin capability preflight. Read further subordinate prompts before entering later audit stages. Audit acceptance remains open.
|
||||
|
||||
Decisions parked for owner catch-up: exact proposed root security policy before any policy write; separately bounded deep-scan cost/runtime; named isolated staging hosts/accounts/rates before active attacks; final comprehensive product design and implementation roadmap; native-language/market and release/human/device gates. None is required for the next offline source review. Session-boundary English text remains an implementation item requiring privacy/unmount regression checks; preserve old-provider teardown. Orchestrator and pre-P10 worktree remain untouched.
|
||||
|
||||
Latest continuation: P10-04 selected regression has 89 backend cases and 92 frontend tests passing, zero failures/skips/pending. Native evidence is archived under docs/redesign/phase-10/p10-04-evidence; P10-04.md records exact filters, source boundaries and remaining qualification. Backend checkpoint `525b5fe4d74ab75f711651fe3a36b988b07abc4d` was independently remotely verified. I18N finite-map review was published/read back at `f577565f7146c6e0cba6edd00b4e804b032ad670`: 112 dynamic calls resolved / 76 pending. It verified 15 letter/completeness keys in both catalogues; checklist default review verified all 14 current defaults but retained the legacy unknown-key gap. No additional cleanup or production change.
|
||||
|
||||
Next: continue independent audit, remaining i18n owner maps/literals, and P10-05 evidence reconciliation. Keep final design/implementation approval, market/language decisions, provider/licensing access, live recovery, hosted CI and human/device gates open; ordinary local work need not wait for these unrelated gates. No user input is required for the next static review package.
|
||||
|
||||
Latest cross-workstream receipt (2 November 2026): I18N attachment preview fix published and independently read back at `4939585fb1272de69f4b1776f6a8f08af639762a`; supplemental checklist category review at `1559697eda967b8c767ac6595ba934877df89fcd` on `codex/i18n-accessible-labels`. Thirteen focused attachment/file-picker tests passed, typecheck passed, scoped lint passed. Graph update completed locally (18,548 nodes / 45,998 edges); generated graph remains untracked. See the I18N worktree's docs/i18n/ATTACHMENT_PREVIEW_LABEL.md and CHECKLIST_DYNAMIC_REVIEW.md. Dynamic review now 109 resolved / 79 pending, supplementing the historical inventory. Phase 10 latest published retain-review checkpoint is `927f909b0d65a24d617f0bac20d4c1fd7693f072`. These receipts supersede older pending statements below.
|
||||
|
||||
Next independently executable work: inspect checklist backend/default and legacy system-key coverage, continue the remaining dynamic/literal reviews, and progress P10-04/05 qualification. Four checklist template calls remain open pending compatibility analysis. Product design still awaits final comprehensive design approval before full production overhaul. No live provider/model/production qualification or complete security audit is claimed.
|
||||
|
||||
Latest: CLEAN-20 published and remotely verified at `78f7396adb2f1d3452c10e60bc0dbbd3a4a602e4`. P10-02/03 bounded retain reviews recorded; no further deletion nominated. P10-04/05 and independent audit remain open. Earlier pending-publication statements below describe the preceding checkpoint.
|
||||
|
||||
2 November 2026. Latest owner authorisation permits independent ordinary application work, preserves genuine gates, and explicitly approves CLEAN-20 only. Older statements requiring that approval are superseded.
|
||||
|
||||
- Phase 10: CLEAN-20 implemented and verified, see ../redesign/phase-10/P10-01.md. Publication pending exact receipt. P10-02–05 remain open; no extra cleanup approved.
|
||||
- Release readiness: backup connection-parser fix published and read back at `f19e7ebf4aeae350b43fa84cf115c393030280f0` on codex/release-backup-parser, in release-readiness-discovery worktree. 31 offline tests passed; no live restore/deployment qualification.
|
||||
- Product modernisation: isolated codex/product-modernisation worktree, latest local checkpoint `192095b8`; design prototypes and user choices retained under docs/product-modernisation. A1 dashboard + D1 foundation + B1 tracking, CV editor left/preview right, context right; overview-first Career Profile; agenda/month calendar including application deadlines; automation under Settings. No final full-application implementation approval. Prototype commits not remotely published.
|
||||
- I18N: codex/i18n-accessible-labels branch created from `55adc1d`; implementation pending. Earlier translation audit counts remain historical; do not claim all dynamic calls fixed.
|
||||
|
||||
Next authorised work: publish validated CLEAN-20 normally and independently verify ref, then P10-02 retained-compatibility review and eligible independent fixes. Preserve primary/pre-P10 worktrees and all source-defined gates. No orchestrator commands, keys, configuration or queue changes; no main merge, models or production deployment. Full security/product/release acceptance remains incomplete.
|
||||
@@ -1,12 +0,0 @@
|
||||
# Next eligible actions
|
||||
|
||||
2 November 2026.
|
||||
|
||||
1. D01/CLEAN-20 is presented in chat and awaits precise owner approval. Do not delete `App.css` beforehand. When approved, recheck source identity and perform only its documented implementation/verification/publication scope.
|
||||
2. Continue I18N-00 in `C:/Users/Connor/.codex/worktrees/i18n-00-audit/Job tracker` at `55adc1db`: follow `docs/i18n/00/HANDOFF.md`. Resolve the remaining 80 dynamic calls and computed/frontend/backend text, real translator context/sensitivity, territory legal records and library compatibility. This is eligible research, not an external blocker.
|
||||
3. Continue LAUNCH-00/01 in `C:/Users/Connor/.codex/worktrees/launch-site-planning/Job tracker` at `756ab616`: rendered homepage/signup audit, pattern research, genuine synthetic captures, then four actual desktop/mobile concepts. No final design choice or implementation before owner review.
|
||||
4. Continue release Stage 1 in `C:/Users/Connor/.codex/worktrees/release-readiness-discovery/Job tracker` at `653f8d04`: complete endpoint/environment/failure-boundary census; recovery source inspection and rehearsal specification are now saved. Do not rerun unchanged full suites or touch live services.
|
||||
5. Provisional independent Product Review research is eligible, but must remain clearly provisional until accepted Phase 10. Existing GJ-00 publication is verified; reuse its 23-document planning pack and frozen subordinate prompts rather than recreating it. GJ-01 implementation remains blocked.
|
||||
6. After each completed independent task, update blockers and identify newly eligible work. Unaccepted research cannot satisfy a prerequisite requiring accepted implementation. The session has unfinished eligible work; this checkpoint is not an exhaustion-of-roadmap declaration.
|
||||
|
||||
Use `ROADMAP_STATUS.md` and the branch-specific handoffs to resume. Never use the autonomous backlog orchestrator. Keep pre-p10-ux and unrelated work intact; no main merge or production deployment. Git is currently operational; avoid repeating the resolved server investigation.
|
||||
@@ -1,16 +0,0 @@
|
||||
# Owner decisions
|
||||
|
||||
2 November 2026. The Continuous Progress Addendum explicitly says P10-01 remains blocked until precise approval. It supersedes the earlier handoff's interpretation of “continue” as permission. No signed approval or controller state is created here.
|
||||
|
||||
## D01 — P10-01 / CLEAN-20
|
||||
|
||||
**AWAITING_APPROVAL.** Choose:
|
||||
|
||||
- Approve removal of only `job-tracker-ui/src/App.css` (recommended), under the exact verification and rollback scope in [P10-00](../redesign/phase-10/P10-00.md).
|
||||
- Retain the file and request a revised/no-removal checkpoint disposition.
|
||||
|
||||
The file is 38 lines of unimported original CRA styling, Git blob `74b5e053450a48a6bdb4d71aad648e7af821975c`. No callers, routes, persisted data or replacement are expected. Verify source identity, types/lint/build and the specified existing EN/NB/theme/browser cases; restore the exact file by reverting the implementation commit if verification fails. Accepted PDF evidence remains unchanged. Approval covers only CLEAN-20 plus necessary evidence/verification, not another removal or later initiative. Publication of the assessment is now verified; implementation approval is the remaining immediate gate.
|
||||
|
||||
## Later decisions — not requested prematurely
|
||||
|
||||
Product-ranked scope, Global Jobs implementation and provider licences, I18N implementation and human language release, homepage design selection, security target/environment and material-risk disposition, and final release approval retain their own concrete review gates. Research does not grant these decisions. Do not ask for generic blanket approval or treat this list as completed sign-off.
|
||||
@@ -1,25 +0,0 @@
|
||||
# Direct roadmap status
|
||||
|
||||
Updated 2 November 2026. This is documentation, not an executable queue. The Continuous Progress Addendum controls direct-chat work; the autonomous orchestrator remains paused and untouched.
|
||||
|
||||
| Workstream/checkpoint | Status | Dependency and evidence |
|
||||
| --- | --- | --- |
|
||||
| PHASE-10 / P10-00 assessment | COMPLETED | Report in `../redesign/phase-10/P10-00.md`; assessment `7ba1367`, publication receipts `8cdff28`/`1692142`. Remote exactly `1692142295950e390a4cf807d9df86cc5cf96290` on 2 November |
|
||||
| P10-01 / CLEAN-20 | AWAITING_APPROVAL | Delete only unused `job-tracker-ui/src/App.css`; precise owner decision D01 below. Addendum explicitly withholds implementation |
|
||||
| P10-02 CV/documents | BLOCKED | Preceding cleanup checkpoint and any exact candidate approval; retain historical documents |
|
||||
| P10-03 backend/dependencies/config | BLOCKED | Predecessors; no proven removal currently approved |
|
||||
| P10-04 functional/data verification | BLOCKED | Defined and accepted cleanup scope; fresh affected verification required |
|
||||
| P10-05 full acceptance | BLOCKED | P10-01–04 and complete applicable acceptance programme |
|
||||
| PRODUCT-REVIEW-01 | BLOCKED | Final audit requires accepted Phase 10. Provisional independent research is eligible; not yet performed or substituted for final acceptance |
|
||||
| INT-GLOBAL-JOBS-01 / GJ-00 | CONDITIONAL | Existing planning at `0ec9f98e6ed4a646fc5e017d8eb6fade07653f37`; exact remote reverified 2 November. No implementation authorised |
|
||||
| INT-GLOBAL-JOBS-01 implementation | BLOCKED | Accepted Phase 10/Product Review, initiative approval and provider rights |
|
||||
| I18N-01 / I18N-00 audit | IN_PROGRESS | Partial source-bound audit published at `55adc1dbd742a570d55d3a4d13f5613a7ed2ab25`; 3,119 messages, 60 planned locale candidates; 108 conditional calls resolved, 80 remain. Contextual/legal/library review incomplete |
|
||||
| I18N-01–08 implementation/acceptance | BLOCKED | I18N-00 and stage prerequisites plus documented implementation authority; no locale publication approved |
|
||||
| LAUNCH-SITE-01 / LAUNCH-00 audit | IN_PROGRESS | Source audit and claim boundaries published at `756ab616a22746a9bafa9830afd4f8efbb085794`; rendered audit still pending |
|
||||
| LAUNCH-01 four desktop/mobile concepts | PENDING | No viewable concepts produced; eligible independent task after completing audit inputs |
|
||||
| LAUNCH-SITE final design/implementation | AWAITING_APPROVAL | Four concrete concepts must be delivered before owner selection; no final design auto-selection |
|
||||
| SECURITY-AUDIT-01 / stages 00–16 | BLOCKED | Master begins `DO NOT START THIS NOW!` and requires finished feature development/baseline tests; README's immediate-review wording does not silently override that gate. No formal scan started |
|
||||
| RELEASE-READINESS-01 / Stage 1 discovery | IN_PROGRESS | Preliminary inventory, blocker reconciliation and 18-gate matrix published at `653f8d04d469dcd52c883d4b98bea76b8adacada`; five runner guards and four workflow guards passed in separate checks; recovery review and RR-11 reproduction saved; full discovery incomplete |
|
||||
| Release stages 2–7 baseline, qualification, remediation, requalification, rehearsal, final acceptance | BLOCKED | Final release candidate/prerequisites not accepted; each stage needs actual applicable environment and source-bound evidence |
|
||||
|
||||
Implemented, tested, accepted, published and production-ready are separate. Production is NO-GO. Historical counts are not fresh executions. See [blockers](BLOCKERS.md), [owner decisions](OWNER_DECISIONS.md), [completed work](WORK_COMPLETED.md) and [next actions](NEXT_ACTIONS.md).
|
||||
@@ -1,33 +0,0 @@
|
||||
# Work completed
|
||||
|
||||
2 November 2026.
|
||||
|
||||
| Work | Commit / evidence | Limits |
|
||||
| --- | --- | --- |
|
||||
| Direct P10-00 assessment, preserved prior draft, candidate inventory, rollback/verification proposal | `7ba1367fd2e84375b3065eeedf9176a34996f77b` | Markdown only; no P10-01 deletion |
|
||||
| Publication failure/continuity receipts | `8cdff28f0781e4c99efd06079149d9933e01cd4e`, `1692142295950e390a4cf807d9df86cc5cf96290` | Earlier server failures remain historical |
|
||||
| Restored normal publication | Push succeeded; independent `ls-remote` exactly `1692142295950e390a4cf807d9df86cc5cf96290` | No server repair, hook bypass, force push, main merge or deployment |
|
||||
| P10 evidence integrity/source applicability | 263 indexed hashes; 1,280 source files; 7 verifier sources; 57 groups/34 routes | Previous direct-assessment checks; not freshly rerun product suites in this continuation |
|
||||
| Lightweight direct-roadmap register | This documentation checkpoint | No runner, scheduler, approval service or replacement orchestrator |
|
||||
|
||||
The application baseline remains source-equivalent to accepted `ba04d817`. Historical PDF metric/visual acceptance is preserved. Current continuation product suites: NOT RUN. Models/production services: NOT ACCESSED.
|
||||
|
||||
## Published partial research checkpoints
|
||||
|
||||
All three branches start at accepted conditional handoff `5cb903b989742b7a96cb22ddf4c0e24993b18980`; no unaccepted Phase 10 changes were integrated. Normal pushes succeeded and each remote ref was independently read back exactly.
|
||||
|
||||
| Branch | Exact remote commit | Actual output / limits |
|
||||
| --- | --- | --- |
|
||||
| `feature/i18n-00-audit` | `138d8fbb6da51141b50f2acb3979458ce173a6c3` | Ten research files; 3,119 English entries, 3,164 static calls, 134 files; 188 dynamic/unknown calls unresolved; initial 59-territory matrix and 60 planned locales. Existing Ajv/Intl checks passed, including rejection of released status. Full audit NOT COMPLETE |
|
||||
| `feature/launch-site-redesign` | `756ab616a22746a9bafa9830afd4f8efbb085794` | Three source-audit/claims/handoff documents. No mockups or final implementation; rendered audit NOT RUN |
|
||||
| `planning/release-readiness-discovery` | `edd2aa9ae428435773e5cf48167af4e0db1ef36a` | Five preliminary discovery/evidence/matrix/handoff documents; 5 existing offline MariaDB runner guards passed. No real DB/hosted/production qualification |
|
||||
|
||||
Global Jobs planning remote independently verified at `0ec9f98e6ed4a646fc5e017d8eb6fade07653f37`. This resolves publication uncertainty, not GJ-01 entry gates.
|
||||
|
||||
Delegated workers hit a service usage limit. Parent continued, reviewed and corrected incomplete draft claims, then produced and published these partial checkpoints. No worker remains active. No partial stage is promoted to completed merely because its documents exist.
|
||||
|
||||
## Further continuation - published and remotely verified
|
||||
|
||||
- Release discovery `653f8d04d469dcd52c883d4b98bea76b8adacada`: complete deployment-script source inspection, recovery review and isolated rehearsal specification; RR-11 synthetic parser reproduction and RR-12/13 qualification gaps. Four existing workflow-quarantine tests PASSED, shell syntax PASSED. Initial direct Windows/sed harness failed its positive control and was discarded; shell-native rerun established the three-case result. No deployment/restore/database activity.
|
||||
- I18N research `55adc1dbd742a570d55d3a4d13f5613a7ed2ab25`: records for 188 dynamic calls; 108 finite conditional calls resolved with 240 verified key references, 80 remaining; four direct catalogue reads; 26 individually reviewed literal candidates; seven stable findings. No application/test implementation changes.
|
||||
- FINDINGS.md consolidates ten new observations/contracts/qualification gaps with precise next actions. These remain separate from implementation acceptance.
|
||||
@@ -1,26 +0,0 @@
|
||||
# I18N-00 baseline audit
|
||||
|
||||
Date: 2026-11-02. Verdict: **IN_PROGRESS; partial research checkpoint, not full I18N-00 acceptance. I18N-01 through 08 BLOCKED. Production NO-GO.**
|
||||
|
||||
Research only, authorised by master prompt and continuous-progress instruction. Branch `feature/i18n-00-audit`, worktree `C:/Users/Connor/.codex/worktrees/i18n-00-audit/Job tracker`, baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`. Application/API/tests/UI/sidecar diff against `ba04d817` was empty. This is the accepted conditional development handoff, not blanket runtime, language or production acceptance. No controller or approval state was changed. All ten supplied I18N prompts were read. Their implementation requirements are future specifications, not authority to execute them.
|
||||
|
||||
Architecture authority is `docs/architecture/current.md`, which redirects to `overview.md`. Existing React/MUI, ASP.NET/EF/MariaDB, Python sidecar and rendering ownership remain. Graph absent in this baseline: bounded source inspection used; no graph rebuild needed for documentation.
|
||||
|
||||
## Verified source findings
|
||||
|
||||
* `job-tracker-ui/src/i18n/translations.ts`: custom two-language `en | nb` object; it is not an i18next or FormatJS installation.
|
||||
* `I18nProvider.tsx`: local storage accepts `nb`, `nb-NO`, `no`; otherwise English. Auth hydration and cross-tab storage update language. `{word}` substitution handles simple values, not ICU plural/select grammar. Failed preference save offers retry; sequence tracking avoids stale error handling.
|
||||
* `JobTrackerApi/Controllers/AuthController.cs:601`: language endpoint accepts `en` or Bokmål aliases, writes `nb-NO`; unsupported input returns hardcoded English error. Do not rename canonical English to `en-GB` without migration tests.
|
||||
* `CoverLetterDocumentRenderer.cs:36`: labels distinguish `nb-NO` from English; document HTML has its own language. `ThemedCvRenderer.cs:60` derives HTML language from document settings. UI language must not become the output-language owner.
|
||||
* `HumanLanguageCatalog.cs` is CV skill-language recognition, including environment-independent seeds and variant collapsing. It is not an eligible UI-locale registry; reusing it would lose script/region distinctions.
|
||||
* Manifest dependencies: React `^19.2.4`, Next `16.4.1`, MUI `^7.3.9`, TypeScript `^5.9.3`, date-fns `^4.1.0`. These are manifest ranges, not freshly installed/runtime versions. No i18next/FormatJS direct dependency. Lockfile/runtime compatibility must be qualified before implementation.
|
||||
|
||||
## Gate evidence
|
||||
|
||||
`docs/pre-phase10-ux/ACCEPTANCE.md` grants conditional development review, not Phase 10 implementation. `docs/automation/handoffs/pre-phase10/FINAL_DEVELOPMENT_ENTRY.md` separates P10-00 assessment from candidate-specific P10-01 permission. This checkpoint cannot grant either. Product-review and launch-site accepted decisions are absent from this baseline; absence is not permission. Global Jobs planning exists separately at `0ec9f98` in the main workspace (`docs/global-jobs/00/DEPENDENCIES_AND_GATES.md` inspected read-only); it is not integrated here and does not authorise live providers or GJ-01.
|
||||
|
||||
## Honest limits
|
||||
|
||||
The TypeScript AST inventory contains 3,119 existing English catalogue entries and 3,164 syntactically identified static call sites across 134 non-test frontend files. It records 188 dynamic/unknown calls separately as an unresolved count; 853 catalogue entries have no identified static caller. These are not deletion candidates: wrappers, dynamic keys and direct object access remain unresolved. A subsequent partial JSX/accessibility literal inventory now contains 26 source-context-reviewed candidates. CONTEXT_TRIAGE.md records the current 80 unresolved dynamic calls after 108 finite-branch resolutions. This is still not a complete non-catalogue inventory. Every-string attribution, translator context, accessible states and country-specific legal recognition require additional review. Therefore the stage's complete-inventory criterion has not passed. No translations, native approval, screenshots, model results, browser results or locale release are manufactured.
|
||||
|
||||
The country matrix covers an initial 59 territory/market contexts from versioned CLDR 49, with targeted official-record checks for Norway, Switzerland and Serbia. The remaining legal cross-checks are pending. The draft catalogue contains 60 planned locale candidates, not 60 supported languages. Schema, uniqueness, BCP-47 parsing and rejection of a forged released status passed using existing local tools. Node/ICU canonicalises `cnr-ME` to `sr-ME`; retain this unresolved identity issue rather than accepting an automatic product alias. See BASELINE_TESTS.md.
|
||||
@@ -1,19 +0,0 @@
|
||||
# Planning evidence and baseline checks
|
||||
|
||||
2026-11-02. Baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`, branch `feature/i18n-00-audit`. Documentation only. No runtime code, test code, lockfiles or settings changed.
|
||||
|
||||
| Check | Result | Scope |
|
||||
| --- | --- | --- |
|
||||
| `git diff ba04d817fed26d659bfa2a56b089d6cac851dc34 HEAD --stat -- JobTrackerApi JobTrackerApi.Tests JobTrackerApi.MariaDb.Tests job-tracker-ui tools/summarizer` | PASSED: empty diff, exit 0 | Source identity only; no fresh runtime assertion |
|
||||
| English catalogue AST extraction using existing TypeScript | PASSED: 3,119 unique keys | Property assignments required to be string literals; duplicate/unsupported members throw; 134 non-test TS/TSX files scanned |
|
||||
| Static syntactic `t` call association | 3,164 sites; 188 dynamic/unknown calls; 853 entries without static caller | Partial inventory, not symbol resolution or coverage proof; no dead-code inference |
|
||||
| Existing Ajv draft-07 validation | PASSED: 60 entries | `LOCALE_SCHEMA.json` compiled and validated `LOCALE_CATALOG.json`; no installed dependency changes |
|
||||
| Uniqueness and `Intl.getCanonicalLocales` parsing | PASSED: 60 unique parseable tags | Node v24.19.0, ICU 78.3; syntax acceptance is not runtime translation availability |
|
||||
| Negative publication fixture | PASSED | In-memory copy changed first `surfaces.ui` from `planned` to `released`; validator rejected it |
|
||||
| Montenegrin identity | OPEN | Intl maps `cnr-ME` to `sr-ME`; product semantics require explicit resolution before registry implementation |
|
||||
| Product/unit/browser/MariaDB/Python suites | NOT RUN | No implementation changes; existing accepted evidence remains historical |
|
||||
| Native/legal/AT/device/PDF/hosted/production/provider/model qualification | NOT RUN | No authority or claim conferred by planning checks |
|
||||
|
||||
The inventory records its baseline, parser version, exact source SHA-256 and source line for each English message. Callers retain expressions and file/line, making manual review possible. Extraction covers the `en` object in `translations.ts`, excludes `*.test.*`, and associates literal first arguments of expressions named `t` or ending in `.t`. Dynamic keys, aliases, direct property reads, C#/Python messages and hardcoded JSX are not completely captured. Recompute after source changes; do not extrapolate counts to full application completeness.
|
||||
|
||||
Research sources checked on this date: CLDR 49 territory table, EU official-language list, i18next plural documentation, FormatJS ICU syntax, Norwegian Language Act, Swiss federal multilingualism guidance and Serbian government constitution. Specific links and limitations are in the matrix and implementation plan. No production data or private user text was sent to translation services.
|
||||
@@ -1,31 +0,0 @@
|
||||
# Source-context triage continuation
|
||||
|
||||
2026-11-02, unchanged application baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`. No translation or runtime implementation.
|
||||
|
||||
## Completed inventory refinement
|
||||
|
||||
- All 188 previously counted dynamic/unknown `t` calls now have source file/line/hash and exact expression in DYNAMIC_MESSAGE_CALLS.json.
|
||||
- 108 calls resolve to finite literal conditional branches, accounting for 240 possible-key references. Each referenced key exists in the English catalogue. Nested ternaries are included. This is key resolution, not translator or runtime acceptance.
|
||||
- 80 calls still need lookup-table, wrapper, template-token or runtime-key review. Type assertions such as `as any` or a single asserted literal must not be treated as proof of actual possible values.
|
||||
- Four direct catalogue reads were located in I18nProvider: save-failure/retry feedback and the evaluator/fallback. These are active consumers missed by a `t("key")`-only search; preserve them during migration.
|
||||
- 26 JSX text/selected accessibility-label candidates were extracted and individually reviewed in source context. The JSON records preservation/extraction decisions and excludes adjacent private runtime values. This scan does not cover every computed JSX expression, object-held label, string-returning helper, backend string or app-shell document text.
|
||||
|
||||
## Findings to carry into approved implementation
|
||||
|
||||
| ID | Source | Finding / required handling |
|
||||
| --- | --- | --- |
|
||||
| I00-13 | `App.tsx:488` | Session-invalidated alert is hardcoded English. Localisation must preserve disposal of the old application tree and must not depend on its discarded session/provider state |
|
||||
| I00-14 | `JobFlowBar.tsx:147` | `Flow` is controlled UI copy outside the catalogue; extract with workflow context |
|
||||
| I00-15 | `Attachments.tsx:361` | Preview iframe title is only `pdf`; use descriptive localised purpose while keeping private filenames out of translator exports |
|
||||
| I00-16 | `AppShell.tsx:692` | `EN`/`NO` with `English`/`Norsk` labels conflates country-like abbreviation and Norwegian variant. Future selector needs native/English names and explicit Bokmal/Nynorsk distinction; preserve existing nb aliases |
|
||||
| I00-17 | `ApplicationAssets.tsx:360` | File-size display uses `toFixed(1)` with KB. Review locale number formatting; filename and underlying byte count remain unchanged |
|
||||
| I00-18 | `I18nProvider.tsx:43` | Save-failure feedback accesses catalogue directly. Migration must preserve same-language retry and stale-save sequencing; static t-call inventory alone misses this contract |
|
||||
| I00-19 | `LandingPage.tsx:133` | Technology-name list is not ordinary translatable prose. Coordinate user-outcome copy with homepage design work; do not translate trademarks or add unverified feature claims |
|
||||
|
||||
Brand/provider names, host examples and technical identifiers were not blindly classified as missing translations. Unit/version fragments require formatting and accessibility context rather than mechanical dictionary substitution. All findings are planning tasks, not permission to edit application files.
|
||||
|
||||
## Verification and remaining work
|
||||
|
||||
The same 134 non-test TS/TSX files were scanned using the installed TypeScript AST parser. Assertions confirmed exactly 188 dynamic calls and that all 240 resolved branch-key references exist. No full application typecheck or browser suite was run. The 26 literal records were reviewed against adjacent source lines; broader semantic census remains IN_PROGRESS.
|
||||
|
||||
Next: resolve the remaining 80 table/template/wrapper calls; cover computed frontend values and app document metadata; inventory backend errors, queued communication text and Python processing messages. Country legal records, reviewer allocation and runtime-library choice remain separate unfinished tasks.
|
||||
@@ -1,47 +0,0 @@
|
||||
{
|
||||
"baseline": "5cb903b989742b7a96cb22ddf4c0e24993b18980",
|
||||
"method": "TypeScript AST syntactic triage; no symbol resolution or runtime coverage claim",
|
||||
"filesScanned": 134,
|
||||
"entries": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 43,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations[l].settingsLanguageSaveFailed",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 44,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations[l].retry",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 67,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations[language][key]",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 67,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations.en[key]",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
# Europe country and language research matrix
|
||||
|
||||
Research checkpoint 2026-11-02; not a market-launch list or legal opinion. All entries are candidate scope. CLDR 49 provides an initial language relationship dataset; national/regional official-record cross-checks remain incomplete. Blank CLDR status is not proof of absence or recognition. No tag decides sovereignty, EU membership, provider rights or support. XK is a CLDR user-assigned territory code, not ISO 3166-1; do not silently persist it as an ISO identifier.
|
||||
|
||||
Source: [Unicode CLDR 49 territory-language data](https://www.unicode.org/cldr/charts/49/tsv/territory_language_information.tsv); retrieved SHA-256 `29bcadbb4362e1a7a3685f4bf199152809635acca58fab10a3576a0f7b55868c`. Population percentages are deliberately omitted; they are not product usage evidence.
|
||||
|
||||
| Territory | Code | CLDR official/de-facto | CLDR regional/recognised | Legal cross-check |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Andorra | AD | ca (official) | not recorded; further review required | PENDING |
|
||||
| Albania | AL | sq (official) | not recorded; further review required | PENDING |
|
||||
| Austria | AT | de (official) | hr (official_regional), sl (official_regional), hu (official_regional) | PENDING |
|
||||
| Åland Islands | AX | sv (official) | not recorded; further review required | PENDING |
|
||||
| Bosnia & Herzegovina | BA | bs (official), bs-Cyrl (official), hr (official), sr (official), sr-Latn (official) | not recorded; further review required | PENDING |
|
||||
| Belgium | BE | nl (official), fr (official), de (official) | not recorded; further review required | PENDING |
|
||||
| Bulgaria | BG | bg (official) | not recorded; further review required | PENDING |
|
||||
| Belarus | BY | ru (official), be (official) | not recorded; further review required | PENDING |
|
||||
| Switzerland | CH | de (official), gsw (de_facto_official), fr (official), it (official) | rm (official_regional) | PENDING |
|
||||
| Cyprus | CY | el (official), tr (official) | not recorded; further review required | PENDING |
|
||||
| Czechia | CZ | cs (official) | not recorded; further review required | PENDING |
|
||||
| Germany | DE | de (official) | frr (official_regional) | PENDING |
|
||||
| Denmark | DK | da (official) | de (official_regional), kl (official_regional) | PENDING |
|
||||
| Estonia | EE | et (official) | not recorded; further review required | PENDING |
|
||||
| Spain | ES | es (official) | ca (official_regional), gl (official_regional), eu (official_regional), ast (official_regional), oc (official_regional) | PENDING |
|
||||
| Finland | FI | fi (official), sv (official) | sms (official_regional) | PENDING |
|
||||
| Faroe Islands | FO | fo (official) | not recorded; further review required | PENDING |
|
||||
| France | FR | fr (official) | not recorded; further review required | PENDING |
|
||||
| United Kingdom | GB | en (official) | cy (official_regional), ga (official_regional), gd (official_regional) | PENDING |
|
||||
| Guernsey | GG | en (official) | not recorded; further review required | PENDING |
|
||||
| Gibraltar | GI | en (official) | not recorded; further review required | PENDING |
|
||||
| Greece | GR | el (official) | not recorded; further review required | PENDING |
|
||||
| Croatia | HR | hr (official) | it (official_regional), vec (official_regional) | PENDING |
|
||||
| Hungary | HU | hu (official) | not recorded; further review required | PENDING |
|
||||
| Ireland | IE | en (official), ga (official) | not recorded; further review required | PENDING |
|
||||
| Isle of Man | IM | en (official), gv (official) | not recorded; further review required | PENDING |
|
||||
| Iceland | IS | is (official) | not recorded; further review required | PENDING |
|
||||
| Italy | IT | it (official) | fr (official_regional), vec (official_regional) | PENDING |
|
||||
| Jersey | JE | en (official) | not recorded; further review required | PENDING |
|
||||
| Liechtenstein | LI | de (official), gsw (de_facto_official) | not recorded; further review required | PENDING |
|
||||
| Lithuania | LT | lt (official) | not recorded; further review required | PENDING |
|
||||
| Luxembourg | LU | fr (official), lb (official), de (official) | not recorded; further review required | PENDING |
|
||||
| Latvia | LV | lv (official) | not recorded; further review required | PENDING |
|
||||
| Monaco | MC | fr (official) | not recorded; further review required | PENDING |
|
||||
| Moldova | MD | ro (official) | not recorded; further review required | PENDING |
|
||||
| Montenegro | ME | sr-Latn (official) | not recorded; further review required | PENDING |
|
||||
| North Macedonia | MK | mk (official) | sq (official_regional) | PENDING |
|
||||
| Malta | MT | mt (official), en (official) | not recorded; further review required | PENDING |
|
||||
| Netherlands | NL | nl (official) | fy (official_regional) | PENDING |
|
||||
| Norway | NO | nb (official), no (official), nn (official) | se (official_regional) | PENDING |
|
||||
| Poland | PL | pl (official) | de (official_regional), csb (official_regional), lt (official_regional) | PENDING |
|
||||
| Portugal | PT | pt (official) | not recorded; further review required | PENDING |
|
||||
| Romania | RO | ro (official) | not recorded; further review required | PENDING |
|
||||
| Serbia | RS | sr (official), sr-Latn (official) | hu (official_regional), ro (official_regional), hr (official_regional), sk (official_regional), uk (official_regional) | PENDING |
|
||||
| Russia | RU | ru (official) | tt (official_regional), ce (official_regional), ba (official_regional), av (official_regional), kbd (official_regional), myv (official_regional), kum (official_regional), sah (official_regional), inh (official_regional), bua (official_regional), az-Cyrl (official_regional), lez (official_regional), mdf (official_regional), krc (official_regional), tyv (official_regional), udm (official_regional), ady (official_regional), kv (official_regional), lbe (official_regional), koi (official_regional) | PENDING |
|
||||
| Sweden | SE | sv (official) | fi (official_regional) | PENDING |
|
||||
| Slovenia | SI | sl (official) | vec (official_regional) | PENDING |
|
||||
| Svalbard & Jan Mayen | SJ | nb (official) | not recorded; further review required | PENDING |
|
||||
| Slovakia | SK | sk (official) | not recorded; further review required | PENDING |
|
||||
| San Marino | SM | it (official) | not recorded; further review required | PENDING |
|
||||
| Türkiye | TR | tr (official) | not recorded; further review required | PENDING |
|
||||
| Ukraine | UA | uk (official), ru (de_facto_official) | not recorded; further review required | PENDING |
|
||||
| Vatican City | VA | it (de_facto_official) | not recorded; further review required | PENDING |
|
||||
| Kosovo | XK | sq (official), sr (official), sr-Latn (official) | not recorded; further review required | PENDING |
|
||||
| Armenia | AM | hy (official) | not recorded; further review required | PENDING |
|
||||
| Azerbaijan | AZ | az (official), az-Cyrl (official) | not recorded; further review required | PENDING |
|
||||
| Georgia | GE | ka (official) | ab (official_regional), os (official_regional) | PENDING |
|
||||
| Kazakhstan | KZ | ru (official), kk (official) | not recorded; further review required | PENDING |
|
||||
| Greenland | GL | kl (official) | not recorded; further review required | PENDING |
|
||||
|
||||
## Scope and legal cross-check queue
|
||||
|
||||
Russia, Turkey, Cyprus, Armenia, Azerbaijan, Georgia and Kazakhstan are explicit geographic/market-review cases; inclusion here does not approve a market. Greenland, Faroe Islands, Aland, Crown dependencies, Gibraltar and Svalbard/Jan Mayen are separately considered territory contexts. This is an initial 59-code research envelope, not a claim to have exhausted every dependency or minority language.
|
||||
|
||||
Norway: [Language Act](https://lovdata.no/dokument/NLE/lov/2021-05-21-42) distinguishes Bokmal/Nynorsk and protected Sami/minority languages. Plan distinct nb-NO/nn-NO and investigate Sami/Kven review capacity; do not infer their status from the abbreviated CLDR row.
|
||||
|
||||
Switzerland: [federal multilingualism explanation](https://www.aboutswitzerland.eda.admin.ch/en/multilingualism) distinguishes national languages and official usage. Plan de-CH, fr-CH, it-CH and rm-CH with separate reviewers.
|
||||
|
||||
Serbia: [government constitution](https://www.srbija.gov.rs/tekst/56753/ustav-republike-srbije.php) establishes Serbian/Cyrillic official use. sr-Latn-RS remains an explicit product candidate, separately from sr-Cyrl-RS; not a claim of identical legal status. These source checks inform planning, not exhaustive legal clearance.
|
||||
|
||||
Regional/minority queue includes ca-ES, eu-ES, gl-ES, cy-GB, gd-GB, se-NO, smj-NO, sma-NO and fkv-NO. Country-specific recognition, applicable areas, reviewer capacity, orthography, fonts and locale-data support must be reviewed separately. No automatic mapping of Montenegrin to Serbian; cnr-ME remains a candidate requiring runtime/data validation.
|
||||
|
||||
## EU 24 language baseline
|
||||
|
||||
[EU official language list](https://european-union.europa.eu/principles-countries-history/languages_en), checked 2026-11-02: Bulgarian bg-BG; Croatian hr-HR; Czech cs-CZ; Danish da-DK; Dutch nl-NL; English en (preserve existing canonical ID; en-GB candidate); Estonian et-EE; Finnish fi-FI; French fr-FR; German de-DE; Greek el-GR; Hungarian hu-HU; Irish ga-IE; Italian it-IT; Latvian lv-LV; Lithuanian lt-LT; Maltese mt-MT; Polish pl-PL; Portuguese pt-PT; Romanian ro-RO; Slovak sk-SK; Slovenian sl-SI; Spanish es-ES; Swedish sv-SE. These locale choices are proposals, not mandated by the EU list.
|
||||
|
||||
## Proposed waves
|
||||
|
||||
Foundation candidates: preserve existing en/nb behavior, then nn-NO, sv-SE, da-DK, fi-FI and is-IS if reviewers exist. EU-24 next; broader national/script/region candidates thereafter. Actual usage analytics and reviewer allocation are unavailable, so no evidence-backed commercial ranking or promised dates are asserted. English fallback remains available irrespective of market.
|
||||
@@ -1,319 +0,0 @@
|
||||
{
|
||||
"baseline": "5cb903b989742b7a96cb22ddf4c0e24993b18980",
|
||||
"method": "TypeScript AST syntactic triage; no symbol resolution or runtime coverage claim",
|
||||
"filesScanned": 134,
|
||||
"entries": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/App.tsx",
|
||||
"line": 488,
|
||||
"sourceSha256": "3b5645d12f2c92ed8999d7a072bd7d47fac77023d460a19a9b3bfc2a4191962f",
|
||||
"kind": "jsx-text",
|
||||
"text": "Session changed. Clearing this page…",
|
||||
"ownerComponent": "job-tracker-ui/src/App.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "localise-with-session-boundary-preservation",
|
||||
"translatorContext": "Alert rendered while old application tree is invalidated; preserve unmount/privacy behavior and avoid dependencies on the discarded session/provider tree."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/assets/JobbjaktMark.tsx",
|
||||
"line": 7,
|
||||
"sourceSha256": "5a539514876a66eaf17ec68eb7ce3d28c558384bc24ab76b61f73be8df754473",
|
||||
"kind": "jsx-attribute:aria-label",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/assets/JobbjaktMark.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"line": 198,
|
||||
"sourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"kind": "jsx-text",
|
||||
"text": "· v",
|
||||
"ownerComponent": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"line": 360,
|
||||
"sourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"kind": "jsx-text",
|
||||
"text": "KB",
|
||||
"ownerComponent": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"line": 699,
|
||||
"sourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"kind": "jsx-text",
|
||||
"text": "v",
|
||||
"ownerComponent": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/Attachments.tsx",
|
||||
"line": 361,
|
||||
"sourceSha256": "fe706526f36d92c10d2a0adfd7abb634d0ebee28f5d7e1794c590179b4fd884c",
|
||||
"kind": "jsx-attribute:title",
|
||||
"text": "pdf",
|
||||
"ownerComponent": "job-tracker-ui/src/components/Attachments.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "descriptive-localised-accessible-title",
|
||||
"translatorContext": "Attachment preview iframe title; describe document preview purpose, without exposing private filename in exported translator context."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"line": 157,
|
||||
"sourceSha256": "17ea0c608db7bc05171fb3c44f378c1acaa78fbdd337f9330002ef6346b92546",
|
||||
"kind": "jsx-text",
|
||||
"text": "pt ·",
|
||||
"ownerComponent": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"line": 157,
|
||||
"sourceSha256": "17ea0c608db7bc05171fb3c44f378c1acaa78fbdd337f9330002ef6346b92546",
|
||||
"kind": "jsx-text",
|
||||
"text": "mm ·",
|
||||
"ownerComponent": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"line": 227,
|
||||
"sourceSha256": "b71228ee28ee73525014c8ece8690364e0f70ddaca3ee7211e9076123d120b1d",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "Gmail",
|
||||
"ownerComponent": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"line": 239,
|
||||
"sourceSha256": "b71228ee28ee73525014c8ece8690364e0f70ddaca3ee7211e9076123d120b1d",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "Outlook / Microsoft 365",
|
||||
"ownerComponent": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"line": 264,
|
||||
"sourceSha256": "b71228ee28ee73525014c8ece8690364e0f70ddaca3ee7211e9076123d120b1d",
|
||||
"kind": "jsx-attribute:placeholder",
|
||||
"text": "imap.example.com",
|
||||
"ownerComponent": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/JobFlowBar.tsx",
|
||||
"line": 147,
|
||||
"sourceSha256": "643053f6ac883f23ef74c66def7a42678cd7917ed11ca802b11be25ec6df0cb2",
|
||||
"kind": "jsx-text",
|
||||
"text": "Flow",
|
||||
"ownerComponent": "job-tracker-ui/src/components/JobFlowBar.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "extract-controlled-label",
|
||||
"translatorContext": "Workflow overline in JobFlowBar; ordinary user-facing UI label, not a persisted status."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/QuickCommandDialog.tsx",
|
||||
"line": 166,
|
||||
"sourceSha256": "27cbbb8b8596fdf4e7474eccfdb6d9a8a219f4baff6a9b8013b825ce5fc2c411",
|
||||
"kind": "jsx-text",
|
||||
"text": "Ctrl/Cmd + K",
|
||||
"ownerComponent": "job-tracker-ui/src/components/QuickCommandDialog.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 312,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 415,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 563,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "commit",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "localise-label-preserve-identifier",
|
||||
"translatorContext": "Technical display label may be translated; commit/job identifier remains invariant and must not enter translation resources."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 692,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-attribute:aria-label",
|
||||
"text": "English",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 692,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "EN",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 693,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-attribute:aria-label",
|
||||
"text": "Norsk",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 693,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "NO",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminAuditPage.tsx",
|
||||
"line": 146,
|
||||
"sourceSha256": "b78d0c5f6ec86a4ee3d2214e6854e638d9f73a5c69c8d5b01023d8c60b46ac81",
|
||||
"kind": "jsx-text",
|
||||
"text": "jobId=",
|
||||
"ownerComponent": "job-tracker-ui/src/views/AdminAuditPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "localise-label-preserve-identifier",
|
||||
"translatorContext": "Technical display label may be translated; commit/job identifier remains invariant and must not enter translation resources."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminUsersPage.tsx",
|
||||
"line": 274,
|
||||
"sourceSha256": "674290a26fc279a25e43176194716dea87f427d1885ecce70dea7c368ab0c6f8",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "—",
|
||||
"ownerComponent": "job-tracker-ui/src/views/AdminUsersPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "empty-state-accessibility-review",
|
||||
"translatorContext": "No-role placeholder; visual glyph can stay but verify meaningful accessible context."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"line": 99,
|
||||
"sourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"kind": "jsx-text",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"line": 133,
|
||||
"sourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"kind": "jsx-text",
|
||||
"text": "React · TypeScript · ASP.NET Core · EF Core · FastAPI AI · Gmail",
|
||||
"ownerComponent": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "launch-copy-review",
|
||||
"translatorContext": "Technology list is public brand names but poor user-value copy; coordinate replacement with Launch Site design approval."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
|
||||
"line": 100,
|
||||
"sourceSha256": "0c772feb6bde8324676b0884aaf343283465c5cd3b3318128363063df4ea22ab",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "GitHub",
|
||||
"ownerComponent": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
|
||||
"line": 55,
|
||||
"sourceSha256": "95f017b1495cf9d88a2b69e7c6ae8ef83d55f2b1ad7b6f54895e280b147743b5",
|
||||
"kind": "jsx-text",
|
||||
"text": "v",
|
||||
"ownerComponent": "job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
# Partial I18N-00 research handoff
|
||||
|
||||
Branch `feature/i18n-00-audit`, based on accepted conditional handoff `5cb903b989742b7a96cb22ddf4c0e24993b18980`. Only `docs/i18n/00/` changed. This checkpoint preserves research; I18N-00 acceptance remains IN_PROGRESS and I18N-01 implementation remains BLOCKED.
|
||||
|
||||
Completed: source-owner audit draft; ordered implementation contracts; source-bound English catalogue/static callers; initial 59-territory CLDR matrix; 60 planned locale candidates and schema; planning checks documented in BASELINE_TESTS.md. No locale translated, reviewed or released here.
|
||||
|
||||
Next authorised work, without implementation approval:
|
||||
|
||||
1. Resolve 188 dynamic/unknown calls, direct translation object access and wrappers. Review the 853 entries without static callers without treating them as unused.
|
||||
2. Inventory hardcoded frontend/ARIA/empty/error/export text and backend/Python/email/queue strings. Assign real namespace, translator context, parameter sensitivity and owning component rather than inferring from keys.
|
||||
3. Complete national/regional official-record checks beyond the initial Norway/Switzerland/Serbia checks. Expand territory/minority coverage where the current research envelope omits required contexts.
|
||||
4. Evaluate actual installed/locked library compatibility and Montenegrin canonicalisation before choosing a runtime migration. Do not install packages now.
|
||||
5. Obtain reviewer/market priorities when a concrete rollout proposal is ready. Keep human/native approval separate from planning completeness.
|
||||
|
||||
The delegated researcher was interrupted by a service usage limit; the parent continued, corrected references to nonexistent deliverables and produced the actual inventory/catalogue/matrix. No agent is working in the background. Full stage completion must not be inferred from the presence of the expected filenames.
|
||||
|
||||
Continuation: CONTEXT_TRIAGE.md records all 188 dynamic calls, 108 finite-branch resolutions (240 existing-key references), four direct catalogue reads and 26 source-context-reviewed JSX/accessibility literal candidates. Seven concrete planning findings I00-13 through I00-19 added. Remaining dynamic call queue is 80; prior 188 count is the original inventory total, not the remaining queue. No application changes.
|
||||
|
||||
Product tests NOT RUN; source equality and planning checks PASSED within their documented limits. Preserve existing PDF evidence. No application models, production services, orchestrator configuration or signing/approval material accessed.
|
||||
@@ -1,31 +0,0 @@
|
||||
# Ordered implementation specification — not execution authority
|
||||
|
||||
## Proposed architecture decision
|
||||
|
||||
Keep existing `useI18n` call sites and React/MUI owners. Replace only its message evaluation/storage behind that contract after entry approval. Compare: current substitution is smallest but cannot meet plural/select requirements; i18next offers namespace loading and CLDR plural suffixes but changes interpolation/catalogue shape; FormatJS ICU supports complete sentence plural/select messages behind the current helper with less caller churn. **Proposed preference: ICU message evaluation behind the existing API plus platform Intl formatting**, subject to actual lockfile/runtime compatibility, bundle and extraction prototype after approval. Do not install either now. Do not implement two competing message engines. .NET renders server communications from its own typed templates with shared IDs/parameter contracts; do not assume identical ICU parser support in .NET/Python.
|
||||
|
||||
Sources checked 2026-11-02: https://www.i18next.com/translation-function/plurals and https://formatjs.github.io/docs/core-concepts/icu-syntax/. These establish syntax capabilities, not repository compatibility.
|
||||
|
||||
## Independent preference contract
|
||||
|
||||
Residence `countryId`, `searchCountryIds`, typed location IDs, `uiLocale`, `adLanguageFilters`, document `outputLocale`, optional `communicationLocale` and `timeZone` are distinct. Country changes only suggestion ordering. Manual saved preference wins over URL/app choice, onboarding, browser negotiation and English fallback. Explicitly distinguish signed-out local storage from account hydration. Persist provenance and revision semantics without weakening tenant ownership. Existing `en` stays canonical until an approved compatibility migration; `en-GB` is a candidate variant, not a silent rewrite. `nb/no/nb-NO` legacy aliases preserve existing Bokmål behavior. `nn-NO` must never silently map to Bokmål. `sr-Latn` and `sr-Cyrl` retain script identity. Unsupported locale resolves to reliable English chrome; user content unchanged.
|
||||
|
||||
## Stage sequence and evidence
|
||||
|
||||
| Stage | Bounded change after prerequisites | Required exit evidence |
|
||||
|---|---|---|
|
||||
| 00 | Finish contextual census, country legal cross-check, reviewer ownership | Complete source-bound inventory; independent schema validation; planning review |
|
||||
| 01 | Registry, aliases, separate preferences, migration, formatting | Legacy roundtrip, invalid IDs, tenant/multi-device conflicts, MariaDB migration/reversal; new locales hidden |
|
||||
| 02 | Extract full UI and accessible strings into existing owners | Required-key completeness, placeholder parser, dirty-form language switch, pseudo/long-label responsive tests |
|
||||
| 03 | Stable backend codes; queued communication templates | Event-time locale snapshot proposed, retry determinism, isolated Mailpit/plain/HTML tests, legal approvals |
|
||||
| 04 | Per-document headings/fonts, import boundaries | RD21/history invariance; script/PDF extraction and layout; native/physical review distinct |
|
||||
| 05 | GJ-owned geography/provider/search integration | All-industry synthetic fixtures, explicit alias suggestions, source language and rights/retention evidence |
|
||||
| 06 | Translation supply chain and glossary | Licensed source, translator context, independent proficient review, source-change invalidation |
|
||||
| 07 | Launch Site localisation/SEO contract | Approved visual design; published-only alternates/sitemaps; truthful feature/provider claims |
|
||||
| 08 | Cross-surface/native/device/security acceptance | Locale × surface × market × profession × device matrix; exact commit and disjoint counts |
|
||||
|
||||
Phase 10 completion/appropriate accepted handoff, PRODUCT-REVIEW-01, accepted I18N-00 and explicit stage authority precede I18N-01. Sequential accepted stage integration is mandatory. Separate development commits, no main merge/deploy.
|
||||
|
||||
GJ owns source fetch, rights, stable geography/occupation IDs and search mechanics; I18N owns display labels, ad-language semantics and translated-summary labels. ESCO concept identity cannot be replaced by translated free text. Original advertisement always remains distinguishable. Provider rights are checked before requests, not inferred from locale availability. Launch Site owns visual design/routing architecture; I18N supplies market+content-locale+publication schema and claims binding to deployed capability. Future fixtures may be designed now but no dependent runtime is invented.
|
||||
|
||||
Terminology queue: Career Profile (canonical facts), CV (document variant), cover letter, application (pursuit), job (opportunity), apprenticeship, shift, seasonal work, salary, qualification, nursing/teaching licence. Define each English concept before translation; profession label never establishes accreditation. Planned fixtures include teacher, cook, nurse, electrician, construction worker, driver, cleaner, retail, office administrator and developer.
|
||||
@@ -1,846 +0,0 @@
|
||||
{
|
||||
"baseline": "5cb903b989742b7a96cb22ddf4c0e24993b18980",
|
||||
"status": "research-draft",
|
||||
"locales": [
|
||||
{
|
||||
"tag": "en",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "en-GB",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "nb-NO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "nn-NO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sv-SE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "da-DK",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "fi-FI",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "is-IS",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "bg-BG",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "hr-HR",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "cs-CZ",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "nl-NL",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "et-EE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "fr-FR",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "de-DE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "el-GR",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "hu-HU",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "ga-IE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "it-IT",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "lv-LV",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "lt-LT",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "mt-MT",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "pl-PL",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "pt-PT",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "ro-RO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sk-SK",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sl-SI",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "es-ES",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "uk-UA",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sq-AL",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sr-Latn-RS",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sr-Cyrl-RS",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "bs-BA",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "cnr-ME",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "mk-MK",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "tr-TR",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "lb-LU",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "cy-GB",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "rm-CH",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "fo-FO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "be-BY",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "ka-GE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "hy-AM",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "az-Latn-AZ",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "ru-RU",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "fr-CH",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "de-CH",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "it-CH",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "nl-BE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "fr-BE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "de-BE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "en-IE",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "ca-ES",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "eu-ES",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "gl-ES",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "gd-GB",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "se-NO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "smj-NO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sma-NO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "fkv-NO",
|
||||
"ownerRole": "localisation-product-owner",
|
||||
"reviewer": null,
|
||||
"status": "planned",
|
||||
"surfaces": {
|
||||
"ui": "planned",
|
||||
"backend": "planned",
|
||||
"communications": "planned",
|
||||
"documents": "planned",
|
||||
"jobDiscovery": "planned",
|
||||
"marketing": "planned"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Research-only locale catalogue; no release authority",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"baseline",
|
||||
"status",
|
||||
"locales"
|
||||
],
|
||||
"properties": {
|
||||
"baseline": {
|
||||
"const": "5cb903b989742b7a96cb22ddf4c0e24993b18980"
|
||||
},
|
||||
"status": {
|
||||
"const": "research-draft"
|
||||
},
|
||||
"locales": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"tag",
|
||||
"ownerRole",
|
||||
"reviewer",
|
||||
"status",
|
||||
"surfaces"
|
||||
],
|
||||
"properties": {
|
||||
"tag": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$"
|
||||
},
|
||||
"ownerRole": {
|
||||
"const": "localisation-product-owner"
|
||||
},
|
||||
"reviewer": {
|
||||
"type": "null"
|
||||
},
|
||||
"status": {
|
||||
"const": "planned"
|
||||
},
|
||||
"surfaces": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"ui",
|
||||
"backend",
|
||||
"communications",
|
||||
"documents",
|
||||
"jobDiscovery",
|
||||
"marketing"
|
||||
],
|
||||
"properties": {
|
||||
"ui": {
|
||||
"const": "planned"
|
||||
},
|
||||
"backend": {
|
||||
"const": "planned"
|
||||
},
|
||||
"communications": {
|
||||
"const": "planned"
|
||||
},
|
||||
"documents": {
|
||||
"const": "planned"
|
||||
},
|
||||
"jobDiscovery": {
|
||||
"const": "planned"
|
||||
},
|
||||
"marketing": {
|
||||
"const": "planned"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
# Risks, blockers and independent approval
|
||||
|
||||
| ID | Risk / unresolved item | Owner and closure evidence |
|
||||
|---|---|---|
|
||||
| I00-01 | Catalogue scan is not every-string contextual inventory | UI/backend owners triage literals, all callers, runtime/ARIA/export states; no unknown required surface |
|
||||
| I00-02 | CLDR is not complete national/regional legal authority | Product research owner checks official country records, political/territory scope and versioned licence before activating suggestions |
|
||||
| I00-03 | No allocated translators/native reviewers | Product owner assigns named reviewers per locale/surface; critical legal/billing/security needs qualified review |
|
||||
| I00-04 | Implementation predecessor gates unresolved | Owner records Phase10/product review and explicit I18N entry against accepted baseline; this document cannot approve them |
|
||||
| I00-05 | Plurals, gender, inflection, word order | ICU whole-sentence contexts, Slavic/Irish/Welsh fixtures, native review; no fragment concatenation |
|
||||
| I00-06 | Turkish casing, Greek accents, Serbian script, names | Locale-aware search/display separate from invariant IDs; preserve original names and qualification titles |
|
||||
| I00-07 | Dates/timezones/DST, salary/currency | UTC storage, partial-date precision, explicit timezone; formatting never FX conversion |
|
||||
| I00-08 | Fonts/glyphs, RTL readiness, long labels | Licensed extended Latin/Greek/Cyrillic font tests, logical layout and focus; RTL activation only when approved |
|
||||
| I00-09 | Career fact loss, frozen PDF drift, stale writes | UI switch never mutates facts/history/undo; ApplicationAssetsService and revision contracts retained |
|
||||
| I00-10 | Private content external translation | No PII export; separately approved consent/contracts/data controls before external translation; no live-model calls |
|
||||
| I00-11 | Draft locale exposed as supported | Per-surface publication gate, English fallback; no selector/SEO claims from catalogue presence |
|
||||
| I00-12 | Backend literal errors and queue drift | Stable error codes, typed escaped params, deterministic event-time locale and retry tests |
|
||||
|
||||
Public release requires required-key completeness, syntax/placeholders/plurals and escaping checks, whole critical journeys, native/proficient review, accessibility/device/PDF tests, country/provider truthfulness, owner release decision and actual deployed identity. Status advances separately per surface: planned → draft/machine_draft → review_required → reviewed → qa_passed → release_approved → released. No generated JSON grants review or approval. Approval evidence must be externally controlled and source-bound. All catalogue entries here are `planned`; existing en/nb code presence is independently recorded, not relabelled as newly qualified release.
|
||||
|
||||
Human/native/legal/device/physical-print review: pending, not executed. Provider and live-model tests: not run. Implementation/release: not authorised. Independent planning can continue on I00-01/02 without waiting for runtime gates.
|
||||
@@ -1,22 +0,0 @@
|
||||
# Surface inventory and message accounting
|
||||
|
||||
All rows need a source-bound contextual census before I18N-00 acceptance. Existing-catalogue inventory is in `MESSAGE_INVENTORY.json`; partial JSX/accessibility literals are now recorded in `FRONTEND_LITERAL_CANDIDATES.json`, with direct reads and dynamic calls in separate inventories. This is not a 100% coverage claim. Namespace assignments remain provisional until caller review; translator context cannot be inferred safely from key names alone. The AST inventory identifies syntactically named `t` calls, not symbol-resolved calls. See CONTEXT_TRIAGE.md for reviewed literal context and the 108 resolved conditional calls; 80 table/template/wrapper calls remain.
|
||||
|
||||
| Surface / proposed namespace | Source owner / inspection target | Content boundary and required evidence |
|
||||
|---|---|---|
|
||||
| Account, onboarding, recovery / auth | views LoginPage, ForgotPasswordPage, ResetPasswordPage, VerifyEmailPage; AuthController | Forms, ARIA, errors, consent, email templates, multi-device hydration; preserve token URLs |
|
||||
| Dashboard, navigation, mobile / app | App routing, dashboard components | Hidden/empty/loading/error states, keyboard labels, tooltips and layout expansion |
|
||||
| Jobs, discovery, applications / jobs | JobDiscoveryPage, ApplicationWorkspacePage; JobPipeline | Translate controlled status labels, never stored identity/status codes or original advertisements |
|
||||
| Career facts, imports / career | CareerProfilePage, career/CvImportReview, CvImportMappingEditor; CareerProfileService; Python app.py | Original facts and uncertainty remain; parser/script quality separate from UI coverage |
|
||||
| CV editor, templates, letters / documents | CvBuilderEditor, DocumentsPage; ThemedCvRenderer, CoverLetterDocumentRenderer, ApplicationAssetsService | Output locale independent; headings, dates, filename labels; preserve null-as-inherit and JobApplication.Version |
|
||||
| PDF, public CV / exports | PublicCvPage, PlaywrightCvPdfExporter, CvDocumentFonts | Font licence/glyph matrix, selectable text, physical print, frozen snapshots and public access |
|
||||
| Email, inbox, reminders / communications | CorrespondenceInboxPage, GmailReviewPage, SmtpEmailSender, FollowUpReminderHostedService | User correspondence is private content; subject/preheader/plain/HTML copy and queued locale policy |
|
||||
| Settings, linked accounts / settings | ConnectedAccountsPage, EmailProviderConnections | Provider names stay proper nouns; OAuth errors and cancellation need usable fallback |
|
||||
| Billing, subscriptions / billing | StripeBillingGateway, entitlement UI | Amount and currency invariant; legal/tax wording needs qualified approval |
|
||||
| Admin and operations / admin | AdminUsersPage, AdminSystemPage, AdminProcessingPage, AdminAuditPage, OperationsPage; OperationEventLog | Stable diagnostic codes; localized presentation without multilingual log parsing or PII leaks |
|
||||
| Analytics, comparisons / analytics | AnalyticsPage, OfferComparisonPage | Plurals, dates, currency and accessible chart/table labels |
|
||||
| Marketing, SEO, legal / public | LandingPage, RouteErrorPage, NotFoundPage; future Launch Site | No locale claims, hreflang or indexing for draft pages; owner mockup gate untouched |
|
||||
| Backend/API/queues / errors | Controllers, UserNotificationStore, AiOperationQueue, CvProcessingQueue | Stable code plus typed parameters; UTC storage; deterministic queue-recipient locale |
|
||||
| Python/AI / processing | tools/summarizer/app.py | Machine codes vs user text, validation and document-language metadata; no live-model qualification |
|
||||
|
||||
For each required message record: stable ID, namespace, exact source, source hash/line, all callers, English text, context/screenshot, typed placeholders, plural/select variants, sensitivity, owner, translator and independent review state. Sensitive values are runtime parameters, never translation exports. Static public UI text is eligible; names, CV facts, messages, tokens, job ads and employer claims are not automatically translated. Existing flat keys remain stable through migration; do not bulk rename for aesthetics.
|
||||
@@ -1,18 +0,0 @@
|
||||
# Application asset label domains — 2 November 2026
|
||||
|
||||
Nine historical dynamic sites resolved by source review; no source/runtime behavior changed.
|
||||
|
||||
| Historical line(s) | Finite domain / fallback |
|
||||
| --- | --- |
|
||||
| 389 | Package labels iterate only TailoredCvText and RecruiterMessageDraft; the assetsPackage prefix therefore yields two keys. Material body remains user/application data. |
|
||||
| 456/458 | tailoringLabels is a Map of six fixed title/detail tuples; unknown kinds preserve server-supplied title/detail as data. |
|
||||
| 687/688 | historySources and historyAiActions are Maps with five and ten fixed values. Guarded get calls preserve unknown historical source/action labels verbatim. |
|
||||
| 830 | Toolbar iterates four literal key/label pairs. |
|
||||
| 857/895 | COVER_LETTER_ACTIONS is a nine-entry literal array; selection uses find with a fixed coverActionGenerate fallback. |
|
||||
| 866 | Tone options iterate six literal key pairs. |
|
||||
|
||||
All relevant components obtain t from useI18n. The 39 distinct keys across these domains are defined in both catalogues; local assertion verified all 78 definitions. Map lookups have no inherited Object-property ambiguity. UI language and selected document-generation language remain separate. This does not activate AI, re-run PDF metrics or change canonical ownership, revision/history, entitlements, package snapshots or stored text.
|
||||
|
||||
The two error.messageKey sites remain pending until all error constructors/callers are traced. Key-domain review is not complete translator context, professional/native translation review or production capability acceptance. Existing unchanged contract tests were not rerun solely to record these static facts.
|
||||
|
||||
Machine register binds exact expressions and reviewed source hash. Reconciliation: 108 original + 37 supplemental = 145 resolved / 43 pending of 188. Do not count earlier 136/52 as additional work to add to this total.
|
||||
@@ -1,20 +0,0 @@
|
||||
# Attachment preview accessible label — 2026-11-02
|
||||
|
||||
Status: implemented and locally verified; publication recorded in Git history.
|
||||
|
||||
The shared Attachments PDF iframe used the generic English title `pdf`. It now reuses `attachmentsPreviewTitle` with the displayed filename, matching the existing dialog title in English and Norwegian Bokmål. This addresses the generic PDF-title item from the literal review (I00-15).
|
||||
|
||||
Scope: `Attachments.tsx`, its attachment regression tests, and this evidence. ApplicationWorkspacePage remains the caller. No route, API, file-content, upload/download, object-URL lifecycle, persistence, dependency or generated-content language behavior changed.
|
||||
|
||||
Verification:
|
||||
|
||||
- RED: two new language cases failed against the previous generic title; three existing attachment cases passed.
|
||||
- PASSED: attachment and file-picker suites, 13 tests across two suites, zero failures, native exit 0. The language cases open the PDF preview through its translated button and verify the named iframe and blob URL.
|
||||
- PASSED: `npm run typecheck`, exit 0.
|
||||
- PASSED: ESLint for both changed source/test files with zero warnings, exit 0.
|
||||
- An earlier combined test execution passed all 13 assertions but exited 1 because the JSON report directory did not exist. Creating the local artifact directory and rerunning produced the successful execution above. These are overlapping runs, not 26 distinct tests.
|
||||
- Raw successful Jest evidence: local ignored `job-tracker-ui/.artifacts/attachment-label-results.json`.
|
||||
|
||||
Rollback: revert this package; no data conversion is involved. No new translation key was needed. The 80 unresolved dynamic translation calls remain open; this fix does not establish complete i18n or accessibility acceptance. Browser/native assistive-technology checks and a full production build were not rerun for this label-only change.
|
||||
|
||||
Next: continue the unresolved dynamic-call inventory and remaining literal triage; retain all independent workstream and release gates.
|
||||
@@ -1,17 +0,0 @@
|
||||
# Attachment size localisation
|
||||
|
||||
3 November 2026. Isolated `codex/i18n-attachment-sizes` from published `ca519cacbec6ee8e385927ad31356dacc18b2f2d`. Ordinary localisation work is authorised independently of the pending A3 increment gate. This branch does not replace the newer A3 application tree.
|
||||
|
||||
`Attachments` and the frozen submitted-package attachment list displayed decimal points through `toFixed`, even with Norwegian UI text. They now use `Intl.NumberFormat` with the existing UI language. The attachment table keeps its existing 1024-based KB/MB threshold, zero KB decimals and one MB decimal. Frozen package labels keep one KB decimal. No stored file size, filename, snapshot, route, API, revision, download or generation language changes.
|
||||
|
||||
Verification:
|
||||
|
||||
- Red regression: two Norwegian-format cases failed, one English case passed; 58 cases were filtered, not executed. Native `attachment-size-red.json`.
|
||||
- Full affected suites: **61 passed**, zero failed/skipped, two suites; `attachment-size-tests.json`. Includes EN/NB MB labels and changing the UI locale on a retained frozen package without a write.
|
||||
- Typecheck, scoped ESLint for the four affected files, static-export build and `git diff --check`: PASSED.
|
||||
- AST-only graph refresh PASSED:18,702 nodes/46,195 edges/1,119 communities. Optional SQL parser is absent and143 files yielded no symbols; these are graph coverage limits. Generated graph stays local.
|
||||
- Independent static review found no actionable issues; verification reruns were not added to the61 cases.
|
||||
|
||||
Rollback reverts these four source/test changes; no database rollback is required. The published branch remains separate until its narrow delta is reconciled against the newer A3 baseline. Existing physical PDF metrics and visual acceptance are unaffected; no renderer source changed.
|
||||
|
||||
NOT RUN: new browser/device or physical PDF checks, complete European localisation, native-language review, backend/provider/live-model or release qualification. Existing tests and code remain responsible for file permissions and downloads; this display-only change adds no new access path. The 188 historical dynamic-call reviews remain accounted for and are not expanded by these three numeric-format regressions.
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"base": "ca519cacbec6ee8e385927ad31356dacc18b2f2d",
|
||||
"policy": "LF-normalised text SHA256",
|
||||
"files": {
|
||||
"job-tracker-ui/src/components/Attachments.tsx": "02081be8282cb3d1a525b336bededb8aabe561cc3b73e1b98e924f9ef945add1",
|
||||
"job-tracker-ui/src/components/ApplicationAssets.tsx": "effcee6cfa0a43ebe0d73a0da625410dc98a6580fddda225b843e5e00d4e45f6",
|
||||
"job-tracker-ui/src/attachments.test.tsx": "89bb3e277ae7be652073eec6d3b6188bcbeaea8b29b07478ff5b21654be8e7c1",
|
||||
"job-tracker-ui/src/application-assets.test.tsx": "980a346cb4452ac4b7e6b689a963e5a23fc6d77410e47e66a422f9cd9c704e7b",
|
||||
"docs/i18n/ATTACHMENT_SIZE_FORMATTING.md": "4576ccfc3de3b72cd3e5591c40f697b827d724b8f4fe588b54567dbe75252332",
|
||||
"docs/i18n/attachment-size-red.json": "872882cb7d2937bf1df7f7a89810158c5de831381f56c6ae8bb0263d26b84d8e",
|
||||
"docs/i18n/attachment-size-tests.json": "8b8188d432b7788f951cf2c67f790c6cd4d24553ed9accbeb702645b3d4b2c6a"
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
# Checklist dynamic translation review — 2026-11-02
|
||||
|
||||
Supplement to the historical dynamic inventory; no application behavior changed.
|
||||
|
||||
- RESOLVED: `ApplicationChecklist.tsx:207`, `t(keys[category])`. The local map at lines 200–206 contains five literal keys: checklistCategoryPreparation, checklistCategorySubmission, checklistCategoryFollowUp, checklistCategoryInterview, checklistCategoryCustom. Both English (translations.ts:3042–3046) and Bokmål (6163–6167) define all five. The component obtains `t` from useI18n at line 25 and passes it to the category helper. Unknown categories remain user/domain data displayed verbatim; they never become translation keys.
|
||||
- OPEN: the two checklist-item template calls at lines 214–215 and the two next-step calls in ApplicationWorkspacePage at lines 392/395. `checklistSystemTranslationToken` (applicationWorkspace.ts:94) excludes empty and learning-prefixed keys but otherwise converts arbitrary kebab-case strings. It does not restrict the input to the known translated system items. Catalogue entries alone cannot prove all provider/backend inputs are covered. Inspect the backend system-key producer and compatibility contract before declaring these four calls resolved or changing the fallback.
|
||||
|
||||
Reconciled progress: historical inventory has 188 dynamic calls, 108 previously resolved and 80 pending. This supplemental review resolves one additional call: 109 resolved, 79 pending. The original inventory remains a historical source-bound snapshot; do not add this result to a rerun total or label all translation contexts accepted.
|
||||
|
||||
Evidence: graph query located ApplicationChecklist, useI18n, applicationWorkspace and ApplicationWorkspacePage; direct source review confirmed the map, translator ownership, token behavior and ten catalogue definitions. Static review only; no runtime coverage claim.
|
||||
|
||||
Backend follow-through: ApplicationChecklistService.cs:105–132 defines 14 default system keys. A local assertion converted each through the frontend's kebab-to-camel rule and verified all 28 title/description keys occur in both catalogues (56 definitions). SeedMissingAsync:353–405 adds absent defaults and retains existing persisted rows; Project:482 passes through SystemKey. Learning keys use a separate prefix and remain excluded by the helper. Current defaults are covered; legacy/unrecognised persisted keys still prevent resolving the four calls without a compatibility/fallback decision. No database was accessed.
|
||||
@@ -1,13 +0,0 @@
|
||||
# Historical checklist text fallback
|
||||
|
||||
2 November 2026. CONFIRMED functional compatibility defect: an unknown/retired persisted system key was converted into nonexistent catalogue keys, hiding the supplied historical task text. Diagnostic RED: three unknown-token cases and EN/NB UI cases failed; nine unselected cases were not run in that diagnostic execution.
|
||||
|
||||
Minimal shared fix in checklistSystemTranslationToken: retain kebab-to-camel conversion, but return a token only when the English fallback catalogue owns both title and description keys. Otherwise return null, activating the existing original-text fallback in ApplicationChecklist and workspace next-step presentation. Learning/custom boundaries remain intact. This does not delete tasks, rewrite stored keys/text, change backend generation, enable AI, or change revision/ownership/API contracts. English is the existing reliable translation fallback; current 14 system title/description pairs also exist in Bokmål.
|
||||
|
||||
PASSED: 37 tests in checklist-translation-token, application-checklist and application-workspace-overlay, zero failures/pending, exit 0. New tests prove unknown/inherited-name keys do not manufacture labels, historical text survives EN/NB, and known/learning/null behavior remains. Full typecheck and scoped three-file ESLint passed. Native local report: job-tracker-ui/.artifacts/checklist-unknown-system-keys.json. Full build/browser and integrated security acceptance are not claimed here. Rollback: revert the helper/import and new tests; no database rollback.
|
||||
|
||||
Four dynamic checklist/next-step sites are now bounded by actual catalogue membership, not merely a presumed backend key list. The machine register binds applicationWorkspace.ts as their owner dependency.
|
||||
|
||||
Two further unchanged sites reviewed: ApplicationWorkspacePage.tsx:505 receives only WORKSPACE_SECTIONS.map(s.key), a fixed seven-key label domain; CareerEvidenceBank.tsx:83 first checks a six-value literal category array before constructing the prefixed key, leaving unknown category text untouched. All 41 distinct system/workspace/evidence keys are defined in both catalogues. This is key-domain evidence, not native language quality or complete every-string context.
|
||||
|
||||
Reconciliation: 108 original + 62 supplemental sites = 170 resolved / 18 pending of 188. This supersedes the earlier open checklist gap without reclassifying broader i18n/security acceptance.
|
||||
@@ -1,17 +0,0 @@
|
||||
# Current localisation continuation
|
||||
|
||||
Mobile application cards now use the selected EN/NB locale and existing salary-period labels on the isolated mobile-salary branch. See [the bounded implementation and validation](MOBILE_SALARY_FORMATTING.md). Full I18N-02 surface coverage and European locale acceptance remain open.
|
||||
|
||||
3 November 2026 — independent document-date fix: invalid uploaded wall-clock dates/times/trailing junk now show the existing EN/NB unknown-date message instead of JavaScript rollover.40 tests/3 suites, typecheck, scoped lint and build pass; see DOCUMENT_DATE_VALIDATION.md. All four historical direct-catalogue accesses have contextual dispositions in DIRECT_CATALOGUE_REVIEW.md; current full extraction/backend literals/every-string triage remain open. No new locales or release approval. This branch is not yet integrated into A3 dashboard/application work.
|
||||
|
||||
Register portability correction: schema 3 explicitly normalises CRLF to LF when hashing reviewed TS/TSX/JSON text and the original inventory; historicalSourceSha256 retains the original inventory's raw-hash meaning. This avoids treating Git checkout line-ending conversion as a source edit. Integration initially detected the raw inventory mismatch; original snapshot contents and historical source hashes were preserved, and both worktrees are revalidated with the declared encoding. This is evidence portability, not renewed runtime execution.
|
||||
|
||||
2 November 2026. Historical 188 dynamic-call census finite key-domain review COMPLETE; full I18N-00 / European locale release acceptance remains INCOMPLETE. Original source-bound snapshots are retained under 00/. Machine register schema 2 binds inventory indices, source hashes and selected owner dependencies; 108 original plus 80 supplemental calls cover all 188 indices without overlap. Static review does not establish all translator sensitivity/context, every visible/backend string, grammar/plural quality, runtime coverage or native review.
|
||||
|
||||
Independent fixes now include descriptive attachment preview labels; session-change feedback outside private providers; safe inherited-name handling for completeness/timeline/pipeline/processing/interview/purpose labels; and original historical checklist-text fallback for unrecognised system keys. No user data, canonical Career Profile ownership, CV/letter revision or final design contract was rewritten. No dependencies or migrations added.
|
||||
|
||||
Latest implementation qualification: processing monitor 17 tests; checklist/workspace 37 tests; interview/document index 41 tests. Each selected execution passed with zero failures/pending, scoped lint and full typecheck. They are disjoint selected suites, not complete application acceptance. Earlier diagnostic failures and overlapping executions remain separately recorded in their reports. A fresh combined Next 16.4.1 static build after the final fixes passed, exit 0, including TypeScript and all three generated pages. No deployment, live API/provider/model or final integrated security test implied.
|
||||
|
||||
Sanitized native reports: evidence/processing-label-fallbacks.json.gz, evidence/checklist-unknown-system-keys.json.gz, evidence/interview-document-fallbacks.json.gz. Earlier scope reports and prior evidence remain intact. Generated AST graph stays untracked; optional SQL/PDF extractor gaps do not change application acceptance.
|
||||
|
||||
Next independent work: complete direct-access and literal review, every-string context/sensitivity triage, European catalogue/territory/source qualification and approved glossary/translation QA preparation. Full registry/persistence/plural engine architecture still needs prerequisite acceptance and the documented decisions; no proposed locale is published. Native translators/market priorities, Montenegrin tag identity, final design, provider rights, staging/paid scans, hosted CI and production/recovery decisions remain distinct gates. Final integrated security testing follows the relevant application changes.
|
||||
@@ -1,13 +0,0 @@
|
||||
# CV, board and field-review translation domains
|
||||
|
||||
2 November 2026. Eight more historical sites resolved by source/control-flow review; no implementation change or repeated PDF qualification.
|
||||
|
||||
- KanbanBoard.tsx:194/446 iterate the three literal PIPELINE_GROUPS labels. Custom statuses use their separately handled Other column; they do not create group translation keys. The pipeline owner dependency is hash-bound in the register.
|
||||
- CvBuilderEditor.tsx:669 iterates the literal indices 1/0/2/3/4 over five literal studio-tab keys. This lookup is independent of arbitrary tab state.
|
||||
- CvBuilderEditor.tsx:1490 maps four historical sources with an existing Object.hasOwn guard and returns unknown source text as data.
|
||||
- CvBuilderEditor.tsx:486 uses getCvExportFailureKey, which returns only cvEmptyContent/cvPdfBusy/cvPdfTimedOut/undefined after explicit status/code checks. Unrecognised errors use existing error handling. CvBuilderPage.tsx:178 has only four literal action-error constructors plus that same export helper. cvBuilder.ts is recorded as an owner dependency. No server/PDF renderer contract was changed.
|
||||
- CareerProfileSections.tsx:45/46 uses confidenceTone, whose four branches return fixed confidence labels. Confidence is interpolated as data; no confidence value becomes a key. Missing metadata is not presented as an accepted profile fact.
|
||||
|
||||
All components obtain t from useI18n. Assertion verified all 23 distinct keys in both catalogues. This is finite key/control-flow coverage, not native terminology, all placeholders/plurals, semantic CV quality or complete accessibility. Canonical profile ownership, revision-safe document history, source provenance and PDF metric/visual acceptance remain untouched.
|
||||
|
||||
Register reconciliation: 108 original + 56 supplemental sites = 164 resolved / 24 pending of 188. Existing earlier tests are historical evidence for unchanged implementations, not fresh executions by this review.
|
||||
@@ -1,14 +0,0 @@
|
||||
# Historical direct catalogue access review
|
||||
|
||||
3 November 2026. All four entries in the frozen 00/DIRECT_CATALOGUE_ACCESS.json are in I18nProvider.tsx. Reviewed actual current callers and source, not re-extracted as a claim of complete current coverage.
|
||||
|
||||
| Historical expression | Context and disposition |
|
||||
|---|---|
|
||||
| translations[l].settingsLanguageSaveFailed | Public static account-preference error copy, no runtime private value. Uses requested language, guarded by save sequence/current language before showing feedback. Deliberate provider-internal access; calling the context hook inside its owner is inappropriate. Retain. |
|
||||
| translations[l].retry | Static retry action label in the same guarded feedback; no interpolation/private data. Retain. |
|
||||
| translations[language][key] | Central typed message lookup inside t, passed to interpolation; all callers use this message owner. React callers render text; this review does not certify every sink. Retain. |
|
||||
| translations.en[key] | Deterministic English fallback for the central lookup. No country/document-language coupling. Retain. |
|
||||
|
||||
The provider's TranslationKey/UiLanguage contracts and catalogue completeness tests constrain these accesses; sequence guards prevent obsolete-save feedback/retries. No new catalogue bypass or runtime change was required. Existing provider/catalogue tests pass within the40-case document-date qualification; this is not native linguistic or full security acceptance.
|
||||
|
||||
Original inventory/hash/line records are immutable historical evidence. Current source identity is bound in document-date SOURCE_MANIFEST.json. This closes contextual classification of the four historical direct accesses only. Current full re-extraction, non-catalogue/backend literal inventory and every-string sensitivity/caller review remain incomplete. No runtime user content was exported or translated externally.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Document upload wall-clock date correction
|
||||
|
||||
3 November 2026. Independent ordinary application fix, branch `codex/i18n-document-dates` from published d4b938fa. Not integrated into A3 yet; no wholesale merge of this older integration-derived tree.
|
||||
|
||||
Reproduced: the document index accepted an ISO prefix and let JavaScript normalise invalid wall-clock components. `2026-02-30T09:15:00`, hour24, minute61 and trailing junk displayed plausible timestamps. Eight EN/NB regression cases failed before the fix; two valid fractional-second cases passed. These failures are retained in evidence/document-dates-red.json;21 unrelated cases were skipped in that focused red execution.
|
||||
|
||||
The existing uploaded-local branch now accepts the complete unzoned .NET-style timestamp (optional1–7 fractional digits) and round-trips all calendar/time fields before formatting. Invalid input uses the existing localised Date not recorded message and emits no fabricated time element. Valid wall-clock components remain unchanged across time zones using the existing UTC formatting carrier. The raw datetime attribute remains unchanged. No API date-kind semantics, server data, UTC-history formatting, document content, download behavior, revisions or navigation changes. No new locale key/dependency/schema.
|
||||
|
||||
Final validation: **40 tests /3 suites PASSED**, documents31 + provider6 + catalogue3. Tests include metadata filters/paging/history, source links, all seven resource kinds, download/focus/cancellation, ownership-safe read behavior, both languages, invalid dates and valid .NET fractional seconds. All document tests assert no POST/PUT/PATCH/DELETE. Typecheck, scoped zero-warning lint, production build and diff whitespace check PASSED. An intermediate command used a nonexistent catalogue-test filename:37 cases passed but that execution failed one suite; it is not counted as passing. Corrected final run uses translation-catalogue.test.ts. No fresh browser/backend/native/provider qualification.
|
||||
|
||||
Rollback: revert this bounded view/parser and test commit; no data rollback. Broader document UTC date validation, partial-date semantics outside this surface, DST/native reviews and full European locale architecture remain open. No release or production qualification inferred.
|
||||
@@ -1,917 +0,0 @@
|
||||
{
|
||||
"schemaVersion": 3,
|
||||
"inventorySha256": "79928688a7b1a4961286aaaf48c028eb13ae8286d72d132561d6b5fdd192e323",
|
||||
"historicalCalls": 188,
|
||||
"previouslyResolved": 108,
|
||||
"additionalResolved": 80,
|
||||
"resolved": 188,
|
||||
"pending": 0,
|
||||
"evidence": [
|
||||
"CHECKLIST_DYNAMIC_REVIEW.md",
|
||||
"FINITE_OWNER_MAP_REVIEW.md",
|
||||
"UNKNOWN_LABEL_FALLBACKS.md",
|
||||
"PIPELINE_ALIAS_FALLBACK.md",
|
||||
"PROCESSING_LABEL_FALLBACKS.md",
|
||||
"REMINDER_INTERVIEW_KEY_REVIEW.md",
|
||||
"ASSET_KEY_REVIEW.md",
|
||||
"LANDING_DOCUMENT_KEY_REVIEW.md",
|
||||
"CV_BOARD_KEY_REVIEW.md",
|
||||
"CHECKLIST_UNKNOWN_SYSTEM_KEYS.md",
|
||||
"ERROR_STATE_KEY_REVIEW.md",
|
||||
"IMPORT_OPERATION_KEY_REVIEW.md",
|
||||
"INTERVIEW_DOCUMENT_FALLBACKS.md"
|
||||
],
|
||||
"entries": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationChecklist.tsx",
|
||||
"historicalLine": 207,
|
||||
"expression": "t(keys[category])",
|
||||
"historicalSourceSha256": "88fdcd24914cf074aedee72a94b0c420c96a16dfe7194142daf22ec0ad8370ff",
|
||||
"reviewedSourceSha256": "0f198e90559b30952cbf7d0f4973211e3fbffcbb183e9e4b4f2ee2e2a9d02f56",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 14
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationIntelligence.tsx",
|
||||
"historicalLine": 367,
|
||||
"expression": "t(keys[category])",
|
||||
"historicalSourceSha256": "89addd1e262ac9c5e37a718acb31d270a132269fe3518d6711e91f3da76ae1a4",
|
||||
"reviewedSourceSha256": "90540576dba4d705ed9234df7091f2b725500d4301287ba151a520956c03f073",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 18
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationIntelligence.tsx",
|
||||
"historicalLine": 373,
|
||||
"expression": "t(`matchScoreBand_${band}`)",
|
||||
"historicalSourceSha256": "89addd1e262ac9c5e37a718acb31d270a132269fe3518d6711e91f3da76ae1a4",
|
||||
"reviewedSourceSha256": "90540576dba4d705ed9234df7091f2b725500d4301287ba151a520956c03f073",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 19
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"historicalLine": 36,
|
||||
"expression": "t(fieldLabels[key])",
|
||||
"historicalSourceSha256": "17ea0c608db7bc05171fb3c44f378c1acaa78fbdd337f9330002ef6346b92546",
|
||||
"reviewedSourceSha256": "d76d0cc3a21230043e91a0d28d03953c236b731c5fecd48e2ba11fd610281053",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 30
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"historicalLine": 153,
|
||||
"expression": "t(fieldLabels[key])",
|
||||
"historicalSourceSha256": "17ea0c608db7bc05171fb3c44f378c1acaa78fbdd337f9330002ef6346b92546",
|
||||
"reviewedSourceSha256": "d76d0cc3a21230043e91a0d28d03953c236b731c5fecd48e2ba11fd610281053",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 33
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CvTemplateGallery.tsx",
|
||||
"historicalLine": 33,
|
||||
"expression": "t(labels[0])",
|
||||
"historicalSourceSha256": "dda733af709e419b17fb254d65fbb27c8dbba01d032a1c0266517fc27d134eb7",
|
||||
"reviewedSourceSha256": "d7f28fd9479dabd5a988b6a8b656c36c6c9b6622beb13530b7011590edb7965e",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 35
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CvTemplateGallery.tsx",
|
||||
"historicalLine": 33,
|
||||
"expression": "t(labels[1])",
|
||||
"historicalSourceSha256": "dda733af709e419b17fb254d65fbb27c8dbba01d032a1c0266517fc27d134eb7",
|
||||
"reviewedSourceSha256": "d7f28fd9479dabd5a988b6a8b656c36c6c9b6622beb13530b7011590edb7965e",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 36
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CvTemplateGallery.tsx",
|
||||
"historicalLine": 33,
|
||||
"expression": "t(labels[2])",
|
||||
"historicalSourceSha256": "dda733af709e419b17fb254d65fbb27c8dbba01d032a1c0266517fc27d134eb7",
|
||||
"reviewedSourceSha256": "d7f28fd9479dabd5a988b6a8b656c36c6c9b6622beb13530b7011590edb7965e",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 37
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/DashboardGrid.tsx",
|
||||
"historicalLine": 47,
|
||||
"expression": "t(WIDGETS.find(widget => widget.id === id)!.titleKey)",
|
||||
"historicalSourceSha256": "201f6d7580af81e92e1fe9c759972a4d2bc1f865cbbe651dd7977e10a130062e",
|
||||
"reviewedSourceSha256": "1f9dfb5dc17b7804c00cca823e7045ec1804d3bcf162bb56590bcd3cf85358d8",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 38
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/DashboardGrid.tsx",
|
||||
"historicalLine": 63,
|
||||
"expression": "t(WIDGETS.find(item => item.id === widget.id)!.titleKey)",
|
||||
"historicalSourceSha256": "201f6d7580af81e92e1fe9c759972a4d2bc1f865cbbe651dd7977e10a130062e",
|
||||
"reviewedSourceSha256": "1f9dfb5dc17b7804c00cca823e7045ec1804d3bcf162bb56590bcd3cf85358d8",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 39
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/DashboardLayoutEditor.tsx",
|
||||
"historicalLine": 77,
|
||||
"expression": "t(entry.titleKey)",
|
||||
"historicalSourceSha256": "faab5c4d63d650c02f4fa0a6f0e2880b1b21535b444a143e1989d9e378f0e16f",
|
||||
"reviewedSourceSha256": "86714ee75bfeddfe62e4c4c9d535c4e641d1213422615fab76838d6aa401984a",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 45
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/DashboardView.tsx",
|
||||
"historicalLine": 259,
|
||||
"expression": "t(key)",
|
||||
"historicalSourceSha256": "37952276ba7d3d0c65df734c816e317b54d50034838dc91f56e3de6f1eb17879",
|
||||
"reviewedSourceSha256": "65113412e4a21e23d093d4af52affab7d24997a3912e7dada9e3e276954d77e0",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 48
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/DashboardView.tsx",
|
||||
"historicalLine": 372,
|
||||
"expression": "t(WIDGETS.find(item => item.id === widget.id)!.titleKey)",
|
||||
"historicalSourceSha256": "37952276ba7d3d0c65df734c816e317b54d50034838dc91f56e3de6f1eb17879",
|
||||
"reviewedSourceSha256": "65113412e4a21e23d093d4af52affab7d24997a3912e7dada9e3e276954d77e0",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 57
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/pipeline.ts",
|
||||
"historicalLine": 149,
|
||||
"expression": "t(LABEL_KEYS[normalized])",
|
||||
"historicalSourceSha256": "fa755ced07a90cef79ceff1622049adc7ed7df3794c942512d9675ef04af8843",
|
||||
"reviewedSourceSha256": "f5cb6d36e81268b2533c4f5ba4e53781007f166c217a4d805c9a8f9f66c2b9ca",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 79
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 153,
|
||||
"expression": "t(tasks[value])",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 87
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 173,
|
||||
"expression": "t(key as TranslationKey)",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 88
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 205,
|
||||
"expression": "t(key)",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 94
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/careerCompletenessLabels.ts",
|
||||
"historicalLine": 15,
|
||||
"expression": "t(key)",
|
||||
"historicalSourceSha256": "b841cc4af73307fa33e772b8a10ddfe9620a7566f2b30ef34eb2b832da02d41e",
|
||||
"reviewedSourceSha256": "9e53eab4592a341b6b369b3408843b21b2c9233e9b765115367bb3586a1b8401",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "see named focused regression reports; static review alone is not runtime coverage",
|
||||
"inventoryEntryIndex": 187
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 130,
|
||||
"expression": "t(statuses[value] ?? 'processingUnknown')",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "PROCESSING_LABEL_FALLBACKS.md; six inherited-key/language regressions plus eleven existing cases",
|
||||
"inventoryEntryIndex": 80
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 131,
|
||||
"expression": "t(stages[value])",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "PROCESSING_LABEL_FALLBACKS.md; six inherited-key/language regressions plus eleven existing cases",
|
||||
"inventoryEntryIndex": 81
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 175,
|
||||
"expression": "t(tasks[item.taskType] ?? 'processingOther')",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "PROCESSING_LABEL_FALLBACKS.md; six inherited-key/language regressions plus eleven existing cases",
|
||||
"inventoryEntryIndex": 89
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 191,
|
||||
"expression": "t(workers[item.name] ?? 'processingWorkerUntracked')",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "PROCESSING_LABEL_FALLBACKS.md; six inherited-key/language regressions plus eleven existing cases",
|
||||
"inventoryEntryIndex": 91
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminProcessingPage.tsx",
|
||||
"historicalLine": 212,
|
||||
"expression": "t(kinds[item.kind] ?? 'processingUnknown')",
|
||||
"historicalSourceSha256": "13973a963ec247c2b61230f5b96ebe1e5feb73ccc9374f15c9bd05f2b3699d1c",
|
||||
"reviewedSourceSha256": "514cbf45298e165334ab502b3833e08fc7a145c5790a80979dc4b0485857316b",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "PROCESSING_LABEL_FALLBACKS.md; six inherited-key/language regressions plus eleven existing cases",
|
||||
"inventoryEntryIndex": 96
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/InterviewPrep.tsx",
|
||||
"historicalLine": 236,
|
||||
"expression": "t(selected.labelKey)",
|
||||
"historicalSourceSha256": "eadf345d3613ad867788f6a74a8fd1fbba508bb81ec7bc87fe54e4f66dadc69b",
|
||||
"reviewedSourceSha256": "ef8161cc982c9068d3c7eec80f7dd6ef565f05ba0b36bcf58e3b643285b22f0f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review only; no inference or provider calls",
|
||||
"inventoryEntryIndex": 63
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/InterviewPrep.tsx",
|
||||
"historicalLine": 261,
|
||||
"expression": "t(selected.labelKey)",
|
||||
"historicalSourceSha256": "eadf345d3613ad867788f6a74a8fd1fbba508bb81ec7bc87fe54e4f66dadc69b",
|
||||
"reviewedSourceSha256": "ef8161cc982c9068d3c7eec80f7dd6ef565f05ba0b36bcf58e3b643285b22f0f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review only; no inference or provider calls",
|
||||
"inventoryEntryIndex": 64
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/InterviewPrep.tsx",
|
||||
"historicalLine": 285,
|
||||
"expression": "t(item.labelKey)",
|
||||
"historicalSourceSha256": "eadf345d3613ad867788f6a74a8fd1fbba508bb81ec7bc87fe54e4f66dadc69b",
|
||||
"reviewedSourceSha256": "ef8161cc982c9068d3c7eec80f7dd6ef565f05ba0b36bcf58e3b643285b22f0f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review only; no inference or provider calls",
|
||||
"inventoryEntryIndex": 65
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/RemindersView.tsx",
|
||||
"historicalLine": 35,
|
||||
"expression": "t(key)",
|
||||
"historicalSourceSha256": "1eedbc443761001e86be1f322691ab4058553033e764b0c6cf9c93ce4fab05c0",
|
||||
"reviewedSourceSha256": "e550e76cb28cb4236100bb1a35158a329e4ecd3a12be56f6cdaf28fb75fa0091",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review only; no inference or provider calls",
|
||||
"inventoryEntryIndex": 76
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/RemindersView.tsx",
|
||||
"historicalLine": 38,
|
||||
"expression": "t(dayKey, { days: match[1] })",
|
||||
"historicalSourceSha256": "1eedbc443761001e86be1f322691ab4058553033e764b0c6cf9c93ce4fab05c0",
|
||||
"reviewedSourceSha256": "e550e76cb28cb4236100bb1a35158a329e4ecd3a12be56f6cdaf28fb75fa0091",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review only; no inference or provider calls",
|
||||
"inventoryEntryIndex": 77
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 389,
|
||||
"expression": "t(`assetsPackage${key}` as \"assetsPackageTailoredCvText\")",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 4
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 456,
|
||||
"expression": "t(labels[0])",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 5
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 458,
|
||||
"expression": "t(labels[1])",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 6
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 687,
|
||||
"expression": "t(sourceKey)",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 7
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 688,
|
||||
"expression": "t(actionKey)",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 8
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 830,
|
||||
"expression": "t(label)",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 9
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 857,
|
||||
"expression": "t(item.labelKey)",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 10
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 866,
|
||||
"expression": "t(key as any)",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 11
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 895,
|
||||
"expression": "t(COVER_LETTER_ACTIONS.find((item) => item.key === action)?.labelKey ?? \"coverActionGenerate\")",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static owner-map review; no AI inference or provider calls",
|
||||
"inventoryEntryIndex": 13
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/DocumentsPage.tsx",
|
||||
"historicalLine": 222,
|
||||
"expression": "t(label)",
|
||||
"historicalSourceSha256": "fa53a826ebbdbc868c8b21a0387138c12611d3e2867de0fa0e5f6d8483471eb9",
|
||||
"reviewedSourceSha256": "0b9aaba2c102b4346b10386107b3822016b4f680bb9ab6b58c24ef80b74080fc",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"inventoryEntryIndex": 134
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/DocumentsPage.tsx",
|
||||
"historicalLine": 225,
|
||||
"expression": "t(states.find(([value]) => value === item.state)?.[1] ?? \"documentsCurrent\")",
|
||||
"historicalSourceSha256": "fa53a826ebbdbc868c8b21a0387138c12611d3e2867de0fa0e5f6d8483471eb9",
|
||||
"reviewedSourceSha256": "0b9aaba2c102b4346b10386107b3822016b4f680bb9ab6b58c24ef80b74080fc",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"inventoryEntryIndex": 135
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/DocumentsPage.tsx",
|
||||
"historicalLine": 231,
|
||||
"expression": "t(types.find(([value]) => value === item.type)?.[1] ?? \"documentsTypeAttachment\")",
|
||||
"historicalSourceSha256": "fa53a826ebbdbc868c8b21a0387138c12611d3e2867de0fa0e5f6d8483471eb9",
|
||||
"reviewedSourceSha256": "0b9aaba2c102b4346b10386107b3822016b4f680bb9ab6b58c24ef80b74080fc",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"inventoryEntryIndex": 137
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/DocumentsPage.tsx",
|
||||
"historicalLine": 264,
|
||||
"expression": "t(title)",
|
||||
"historicalSourceSha256": "fa53a826ebbdbc868c8b21a0387138c12611d3e2867de0fa0e5f6d8483471eb9",
|
||||
"reviewedSourceSha256": "0b9aaba2c102b4346b10386107b3822016b4f680bb9ab6b58c24ef80b74080fc",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"inventoryEntryIndex": 144
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/DocumentsPage.tsx",
|
||||
"historicalLine": 265,
|
||||
"expression": "t(title)",
|
||||
"historicalSourceSha256": "fa53a826ebbdbc868c8b21a0387138c12611d3e2867de0fa0e5f6d8483471eb9",
|
||||
"reviewedSourceSha256": "0b9aaba2c102b4346b10386107b3822016b4f680bb9ab6b58c24ef80b74080fc",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"inventoryEntryIndex": 145
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/DocumentsPage.tsx",
|
||||
"historicalLine": 265,
|
||||
"expression": "t(label)",
|
||||
"historicalSourceSha256": "fa53a826ebbdbc868c8b21a0387138c12611d3e2867de0fa0e5f6d8483471eb9",
|
||||
"reviewedSourceSha256": "0b9aaba2c102b4346b10386107b3822016b4f680bb9ab6b58c24ef80b74080fc",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"inventoryEntryIndex": 146
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"historicalLine": 87,
|
||||
"expression": "t(`landingPlan${plan.id === \"free\" ? \"Free\" : \"Pro\"}Feature${index + 1}` as TranslationKey)",
|
||||
"historicalSourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"reviewedSourceSha256": "aedcdbc8bfc22f7cd4bc9737a06b07f318ca7b4970836bd6c20e805ebfa36c74",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/planCatalog.ts",
|
||||
"sha256": "068871cc43669d6f8a0581fbaefe8e6d0d2ab7f1c47e0b31cb131e767c2d13b2"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 160
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"historicalLine": 172,
|
||||
"expression": "t(f.title)",
|
||||
"historicalSourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"reviewedSourceSha256": "aedcdbc8bfc22f7cd4bc9737a06b07f318ca7b4970836bd6c20e805ebfa36c74",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/planCatalog.ts",
|
||||
"sha256": "068871cc43669d6f8a0581fbaefe8e6d0d2ab7f1c47e0b31cb131e767c2d13b2"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 162
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"historicalLine": 173,
|
||||
"expression": "t(f.body)",
|
||||
"historicalSourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"reviewedSourceSha256": "aedcdbc8bfc22f7cd4bc9737a06b07f318ca7b4970836bd6c20e805ebfa36c74",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/planCatalog.ts",
|
||||
"sha256": "068871cc43669d6f8a0581fbaefe8e6d0d2ab7f1c47e0b31cb131e767c2d13b2"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 163
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"historicalLine": 190,
|
||||
"expression": "t(s.title)",
|
||||
"historicalSourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"reviewedSourceSha256": "aedcdbc8bfc22f7cd4bc9737a06b07f318ca7b4970836bd6c20e805ebfa36c74",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/planCatalog.ts",
|
||||
"sha256": "068871cc43669d6f8a0581fbaefe8e6d0d2ab7f1c47e0b31cb131e767c2d13b2"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 164
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"historicalLine": 191,
|
||||
"expression": "t(s.body)",
|
||||
"historicalSourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"reviewedSourceSha256": "aedcdbc8bfc22f7cd4bc9737a06b07f318ca7b4970836bd6c20e805ebfa36c74",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static source review; no marketing or accessibility acceptance",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/planCatalog.ts",
|
||||
"sha256": "068871cc43669d6f8a0581fbaefe8e6d0d2ab7f1c47e0b31cb131e767c2d13b2"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 165
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/KanbanBoard.tsx",
|
||||
"historicalLine": 194,
|
||||
"expression": "t(g.labelKey as any)",
|
||||
"historicalSourceSha256": "f9e7491cd3bd82214fb081571b46b55b31fb8e135fa5050e76896759c2e79a92",
|
||||
"reviewedSourceSha256": "e83ea475bbf1f33fd262bff154d3cbe8a4b20815beaa00b48312377663f4e48e",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/pipeline.ts",
|
||||
"sha256": "f5cb6d36e81268b2533c4f5ba4e53781007f166c217a4d805c9a8f9f66c2b9ca"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 71
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/KanbanBoard.tsx",
|
||||
"historicalLine": 446,
|
||||
"expression": "t(g.labelKey as any)",
|
||||
"historicalSourceSha256": "f9e7491cd3bd82214fb081571b46b55b31fb8e135fa5050e76896759c2e79a92",
|
||||
"reviewedSourceSha256": "e83ea475bbf1f33fd262bff154d3cbe8a4b20815beaa00b48312377663f4e48e",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/pipeline.ts",
|
||||
"sha256": "f5cb6d36e81268b2533c4f5ba4e53781007f166c217a4d805c9a8f9f66c2b9ca"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 74
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/CvBuilderEditor.tsx",
|
||||
"historicalLine": 486,
|
||||
"expression": "t(key)",
|
||||
"historicalSourceSha256": "b163cbe792e98cc1afdd775ffb595c1abb8b58c5fdd9a79bbd6fa6b552f868ae",
|
||||
"reviewedSourceSha256": "67d091b653ca151be853746eaaca1fd5d159a5670924705e228d8e2e9327ad0f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/cvBuilder.ts",
|
||||
"sha256": "c021bafeabbc8ad3526d1b10b90ad8f7f0958ded8ed26eac8c1d28b53098b64d"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 116
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/CvBuilderEditor.tsx",
|
||||
"historicalLine": 669,
|
||||
"expression": "t(([\"cvEditorTemplate\", \"cvEditorContent\", \"cvEditorCustomize\", \"cvEditorAiTools\", \"cvEditorHistory\"] as const)[value])",
|
||||
"historicalSourceSha256": "b163cbe792e98cc1afdd775ffb595c1abb8b58c5fdd9a79bbd6fa6b552f868ae",
|
||||
"reviewedSourceSha256": "67d091b653ca151be853746eaaca1fd5d159a5670924705e228d8e2e9327ad0f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"inventoryEntryIndex": 117
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/CvBuilderEditor.tsx",
|
||||
"historicalLine": 1490,
|
||||
"expression": "t(source)",
|
||||
"historicalSourceSha256": "b163cbe792e98cc1afdd775ffb595c1abb8b58c5fdd9a79bbd6fa6b552f868ae",
|
||||
"reviewedSourceSha256": "67d091b653ca151be853746eaaca1fd5d159a5670924705e228d8e2e9327ad0f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"inventoryEntryIndex": 131
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/CvBuilderPage.tsx",
|
||||
"historicalLine": 178,
|
||||
"expression": "t(actionError.key)",
|
||||
"historicalSourceSha256": "b4cc784cadb3b820b78b7b688e3c9961ed724230de4fc5fffae166d29620f361",
|
||||
"reviewedSourceSha256": "d9b7ece2ff25d082bdd8d109f52bb2342d9071b8cc465ca5a2b15ac20aeac6c6",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/cvBuilder.ts",
|
||||
"sha256": "c021bafeabbc8ad3526d1b10b90ad8f7f0958ded8ed26eac8c1d28b53098b64d"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 132
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
|
||||
"historicalLine": 45,
|
||||
"expression": "t(tone.key, { percent: Math.round(metadata.confidence * 100) })",
|
||||
"historicalSourceSha256": "0c772feb6bde8324676b0884aaf343283465c5cd3b3318128363063df4ea22ab",
|
||||
"reviewedSourceSha256": "aa3acbe472d34074a517a566c77983e7d95f8ec1df9ee37e47537ad96beffd0e",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"inventoryEntryIndex": 176
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
|
||||
"historicalLine": 46,
|
||||
"expression": "t(tone.key)",
|
||||
"historicalSourceSha256": "0c772feb6bde8324676b0884aaf343283465c5cd3b3318128363063df4ea22ab",
|
||||
"reviewedSourceSha256": "aa3acbe472d34074a517a566c77983e7d95f8ec1df9ee37e47537ad96beffd0e",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static control-flow review; no PDF metric or model rerun",
|
||||
"inventoryEntryIndex": 177
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationChecklist.tsx",
|
||||
"historicalLine": 214,
|
||||
"expression": "t(`checklistItem_${token}`)",
|
||||
"historicalSourceSha256": "88fdcd24914cf074aedee72a94b0c420c96a16dfe7194142daf22ec0ad8370ff",
|
||||
"reviewedSourceSha256": "0f198e90559b30952cbf7d0f4973211e3fbffcbb183e9e4b4f2ee2e2a9d02f56",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "CHECKLIST_UNKNOWN_SYSTEM_KEYS.md; 37 focused cases; other finite labels statically reviewed",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/applicationWorkspace.ts",
|
||||
"sha256": "3b00a4fe16159bdb9603eeb37bfdf5e5eb9a87d7815227fa3aa2f0da6e4f232c"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 15
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationChecklist.tsx",
|
||||
"historicalLine": 215,
|
||||
"expression": "t(`checklistItem_${token}Description`)",
|
||||
"historicalSourceSha256": "88fdcd24914cf074aedee72a94b0c420c96a16dfe7194142daf22ec0ad8370ff",
|
||||
"reviewedSourceSha256": "0f198e90559b30952cbf7d0f4973211e3fbffcbb183e9e4b4f2ee2e2a9d02f56",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "CHECKLIST_UNKNOWN_SYSTEM_KEYS.md; 37 focused cases; other finite labels statically reviewed",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/applicationWorkspace.ts",
|
||||
"sha256": "3b00a4fe16159bdb9603eeb37bfdf5e5eb9a87d7815227fa3aa2f0da6e4f232c"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 16
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/ApplicationWorkspacePage.tsx",
|
||||
"historicalLine": 392,
|
||||
"expression": "t(`checklistItem_${nextStepToken}` as any)",
|
||||
"historicalSourceSha256": "107b4db54ef15d88254e01bc404136b987755588c1d171b800c2a47f93488b50",
|
||||
"reviewedSourceSha256": "62c79d59ce31dccddefd70991db5fc26fcc84f0c58ca6219d0d36980db2050d7",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "CHECKLIST_UNKNOWN_SYSTEM_KEYS.md; 37 focused cases; other finite labels statically reviewed",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/applicationWorkspace.ts",
|
||||
"sha256": "3b00a4fe16159bdb9603eeb37bfdf5e5eb9a87d7815227fa3aa2f0da6e4f232c"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 101
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/ApplicationWorkspacePage.tsx",
|
||||
"historicalLine": 395,
|
||||
"expression": "t(`checklistItem_${nextStepToken}Description` as any)",
|
||||
"historicalSourceSha256": "107b4db54ef15d88254e01bc404136b987755588c1d171b800c2a47f93488b50",
|
||||
"reviewedSourceSha256": "62c79d59ce31dccddefd70991db5fc26fcc84f0c58ca6219d0d36980db2050d7",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "CHECKLIST_UNKNOWN_SYSTEM_KEYS.md; 37 focused cases; other finite labels statically reviewed",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/applicationWorkspace.ts",
|
||||
"sha256": "3b00a4fe16159bdb9603eeb37bfdf5e5eb9a87d7815227fa3aa2f0da6e4f232c"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 102
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/ApplicationWorkspacePage.tsx",
|
||||
"historicalLine": 505,
|
||||
"expression": "t(keys[section])",
|
||||
"historicalSourceSha256": "107b4db54ef15d88254e01bc404136b987755588c1d171b800c2a47f93488b50",
|
||||
"reviewedSourceSha256": "62c79d59ce31dccddefd70991db5fc26fcc84f0c58ca6219d0d36980db2050d7",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "CHECKLIST_UNKNOWN_SYSTEM_KEYS.md; 37 focused cases; other finite labels statically reviewed",
|
||||
"ownerDependencies": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/applicationWorkspace.ts",
|
||||
"sha256": "3b00a4fe16159bdb9603eeb37bfdf5e5eb9a87d7815227fa3aa2f0da6e4f232c"
|
||||
}
|
||||
],
|
||||
"inventoryEntryIndex": 103
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/CareerEvidenceBank.tsx",
|
||||
"historicalLine": 83,
|
||||
"expression": "t(`careerEvidenceCategory_${value}` as \"careerEvidenceCategory_achievement\")",
|
||||
"historicalSourceSha256": "fc85ccfc1addd48af3a29bc263b089858765b2ac3ec7db3b66dedc55ddfab625",
|
||||
"reviewedSourceSha256": "51cab7289717c9f26006a9d34ac1f8aac9e09d19e549a3666a15adc41d5d4724",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "CHECKLIST_UNKNOWN_SYSTEM_KEYS.md; 37 focused cases; other finite labels statically reviewed",
|
||||
"inventoryEntryIndex": 175
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 2,
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 104,
|
||||
"expression": "t(error.messageKey)",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 12,
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"historicalLine": 887,
|
||||
"expression": "t(error.messageKey)",
|
||||
"historicalSourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"reviewedSourceSha256": "b5f14b41de10474e2bcd709b91b1becb7b7db4aba021fba29e4e9e44a7a2947f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 97,
|
||||
"file": "job-tracker-ui/src/views/AdminSystemPage.tsx",
|
||||
"historicalLine": 333,
|
||||
"expression": "t(kind === \"status\" && status ? \"adminSystemRefreshFailed\" : readErrorKeys[kind])",
|
||||
"historicalSourceSha256": "1e76931739d779d9edb17e22846d16fffef7ebd1a0c27aebf740c2c46c79b3de",
|
||||
"reviewedSourceSha256": "64e85d9b13088b5229b6635674e9e6ff9ee6c4a62db7f66accb1dcddcedd16c0",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 98,
|
||||
"file": "job-tracker-ui/src/views/AdminSystemPage.tsx",
|
||||
"historicalLine": 448,
|
||||
"expression": "t(actionErrorKeys[actionError.kind])",
|
||||
"historicalSourceSha256": "1e76931739d779d9edb17e22846d16fffef7ebd1a0c27aebf740c2c46c79b3de",
|
||||
"reviewedSourceSha256": "64e85d9b13088b5229b6635674e9e6ff9ee6c4a62db7f66accb1dcddcedd16c0",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 99,
|
||||
"file": "job-tracker-ui/src/views/AdminSystemPage.tsx",
|
||||
"historicalLine": 449,
|
||||
"expression": "t(message)",
|
||||
"historicalSourceSha256": "1e76931739d779d9edb17e22846d16fffef7ebd1a0c27aebf740c2c46c79b3de",
|
||||
"reviewedSourceSha256": "64e85d9b13088b5229b6635674e9e6ff9ee6c4a62db7f66accb1dcddcedd16c0",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 104,
|
||||
"file": "job-tracker-ui/src/views/CareerProfilePage.tsx",
|
||||
"historicalLine": 508,
|
||||
"expression": "t(stageKeys[stage])",
|
||||
"historicalSourceSha256": "d8f302c2bd8b09544a41735b4d63818c2843ca5193f7b733a3e8447c828f181a",
|
||||
"reviewedSourceSha256": "190b8b0840fb57480985a1688160001a1e5e828639e5b632351740b6352da0b7",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 105,
|
||||
"file": "job-tracker-ui/src/views/CareerProfilePage.tsx",
|
||||
"historicalLine": 509,
|
||||
"expression": "t(importLabelKeys[value])",
|
||||
"historicalSourceSha256": "d8f302c2bd8b09544a41735b4d63818c2843ca5193f7b733a3e8447c828f181a",
|
||||
"reviewedSourceSha256": "190b8b0840fb57480985a1688160001a1e5e828639e5b632351740b6352da0b7",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 106,
|
||||
"file": "job-tracker-ui/src/views/CareerProfilePage.tsx",
|
||||
"historicalLine": 865,
|
||||
"expression": "t(runActionErrors[run.id].key)",
|
||||
"historicalSourceSha256": "d8f302c2bd8b09544a41735b4d63818c2843ca5193f7b733a3e8447c828f181a",
|
||||
"reviewedSourceSha256": "190b8b0840fb57480985a1688160001a1e5e828639e5b632351740b6352da0b7",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 153,
|
||||
"file": "job-tracker-ui/src/views/GmailReviewPage.tsx",
|
||||
"historicalLine": 231,
|
||||
"expression": "t(writeError.key)",
|
||||
"historicalSourceSha256": "3609ec12dd9619f7cbbd3541dcf2563a33e4ef3cb7cf9eab0cfc4a17a43d22d8",
|
||||
"reviewedSourceSha256": "5e87cad1c5f5118fdd6d62d3aae35b83b3ab10d8d60722ed18c1dbb4487f9890",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 154,
|
||||
"file": "job-tracker-ui/src/views/GmailReviewPage.tsx",
|
||||
"historicalLine": 231,
|
||||
"expression": "t(writeError.key)",
|
||||
"historicalSourceSha256": "3609ec12dd9619f7cbbd3541dcf2563a33e4ef3cb7cf9eab0cfc4a17a43d22d8",
|
||||
"reviewedSourceSha256": "5e87cad1c5f5118fdd6d62d3aae35b83b3ab10d8d60722ed18c1dbb4487f9890",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 155,
|
||||
"file": "job-tracker-ui/src/views/JobDiscoveryPage.tsx",
|
||||
"historicalLine": 229,
|
||||
"expression": "t(error ?? \"jobDiscoveryUnavailable\")",
|
||||
"historicalSourceSha256": "e15f5183fe6d41ecb7a53ec9806872a67f0d6ce683354d0abef53527bd397b94",
|
||||
"reviewedSourceSha256": "8055c95959b662b69f04f780993d4668e3907c53b445451c0981fa3a1436756f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 156,
|
||||
"file": "job-tracker-ui/src/views/JobDiscoveryPage.tsx",
|
||||
"historicalLine": 230,
|
||||
"expression": "t(error)",
|
||||
"historicalSourceSha256": "e15f5183fe6d41ecb7a53ec9806872a67f0d6ce683354d0abef53527bd397b94",
|
||||
"reviewedSourceSha256": "8055c95959b662b69f04f780993d4668e3907c53b445451c0981fa3a1436756f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "static state-constructor and own-property review; no admin actions, external mail or AI executed"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 166,
|
||||
"file": "job-tracker-ui/src/views/OperationsPage.tsx",
|
||||
"historicalLine": 127,
|
||||
"expression": "t(taskKeys[task])",
|
||||
"historicalSourceSha256": "8cff1e08b2009ff683957849af71d6e76916a28ae218e647d9e3c04a12ad5f9b",
|
||||
"reviewedSourceSha256": "b35c793fd33dcd0638d47df2aa3bfb2926879a8fa709880983b64c1a1309bb98",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "existing Object.hasOwn guards statically reviewed; no service execution"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 168,
|
||||
"file": "job-tracker-ui/src/views/OperationsPage.tsx",
|
||||
"historicalLine": 158,
|
||||
"expression": "t(statusKeys[operation.status])",
|
||||
"historicalSourceSha256": "8cff1e08b2009ff683957849af71d6e76916a28ae218e647d9e3c04a12ad5f9b",
|
||||
"reviewedSourceSha256": "b35c793fd33dcd0638d47df2aa3bfb2926879a8fa709880983b64c1a1309bb98",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "existing Object.hasOwn guards statically reviewed; no service execution"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 183,
|
||||
"file": "job-tracker-ui/src/views/career/CvImportReview.tsx",
|
||||
"historicalLine": 114,
|
||||
"expression": "t(labelKeys[value])",
|
||||
"historicalSourceSha256": "bdecd17437d919a33d9deaa855262b1f1baf78b4a22eef0e88ac1fdbb5ebeda4",
|
||||
"reviewedSourceSha256": "dbbf0bcebd4fc46f55deaa6bb70a0abd37ecb0f01608335bcaf4de46e05f4a48",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "existing Object.hasOwn guards statically reviewed; no service execution"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 184,
|
||||
"file": "job-tracker-ui/src/views/career/CvImportReview.tsx",
|
||||
"historicalLine": 165,
|
||||
"expression": "t(warningKeys[warning])",
|
||||
"historicalSourceSha256": "bdecd17437d919a33d9deaa855262b1f1baf78b4a22eef0e88ac1fdbb5ebeda4",
|
||||
"reviewedSourceSha256": "dbbf0bcebd4fc46f55deaa6bb70a0abd37ecb0f01608335bcaf4de46e05f4a48",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "existing Object.hasOwn guards statically reviewed; no service execution"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 67,
|
||||
"file": "job-tracker-ui/src/components/InterviewPrep.tsx",
|
||||
"historicalLine": 505,
|
||||
"expression": "t(keys[category])",
|
||||
"historicalSourceSha256": "eadf345d3613ad867788f6a74a8fd1fbba508bb81ec7bc87fe54e4f66dadc69b",
|
||||
"reviewedSourceSha256": "ef8161cc982c9068d3c7eec80f7dd6ef565f05ba0b36bcf58e3b643285b22f0f",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "INTERVIEW_DOCUMENT_FALLBACKS.md; 41 full selected-suite tests, including 12 inherited-name/language cases"
|
||||
},
|
||||
{
|
||||
"inventoryEntryIndex": 138,
|
||||
"file": "job-tracker-ui/src/views/DocumentsPage.tsx",
|
||||
"historicalLine": 243,
|
||||
"expression": "t(({ resume: \"attachmentsPurposeResume\", \"cover-letter\": \"attachmentsPurposeCoverLetter\", portfolio: \"attachmentsPurposePortfolio\", \"case-study\": \"attachmentsPurposeCaseStudy\", certificate: \"attachmentsPurposeCertificate\" } as Record<string, TranslationKey>)[item.purpose.toLowerCase()] ?? \"attachmentsPurposeOther\")",
|
||||
"historicalSourceSha256": "fa53a826ebbdbc868c8b21a0387138c12611d3e2867de0fa0e5f6d8483471eb9",
|
||||
"reviewedSourceSha256": "0b9aaba2c102b4346b10386107b3822016b4f680bb9ab6b58c24ef80b74080fc",
|
||||
"status": "finite-key-domain-reviewed",
|
||||
"runtimeCoverage": "INTERVIEW_DOCUMENT_FALLBACKS.md; 41 full selected-suite tests, including 12 inherited-name/language cases"
|
||||
}
|
||||
],
|
||||
"limitations": [
|
||||
"key-domain review is not full translator context or native-language acceptance",
|
||||
"original inventory is retained as historical evidence",
|
||||
"reviewed hashes must be refreshed after relevant source changes"
|
||||
],
|
||||
"catalogueSha256": "ed99d129f8702181429e10ec02f65f734220409fcba4de51d0d77a0d60871ea4",
|
||||
"hashEncoding": "Reviewed text and inventory hashes use UTF-8 file bytes with CRLF normalized to LF; historicalSourceSha256 retains the original inventory encoding"
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
# Automated EN/Bokmål catalogue QA
|
||||
|
||||
2 November 2026. Added translation-catalogue.test.ts to the existing Jest suite. Reuses the current interpolation contract and the checks demonstrated by the historical Phase 9 localisation helper; that helper/report was not modified or overwritten.
|
||||
|
||||
Three automated invariants: equal English/Bokmål key sets; equal sets of current `{word}` substitution variables per message; no blank message values. Current resources contain 3,119 English and 3,119 Bokmål keys. These are resource counts, not thousands of test cases. Identical proper names/technical labels are allowed; machine equality does not determine whether natural-language copy is translated well.
|
||||
|
||||
PASSED: 10 tests across translation-catalogue, i18n-provider and locale-fetch-stability, zero failures/pending, native exit 0. This includes the three new global invariants and existing persistence/legacy alias/fetch-stability coverage. Scoped lint passed and full typechecking completed without errors. [Native report](../direct-roadmap/integration-evidence/locale-catalogue-native.json.gz). These three suites are separate from the 16-suite/195-test integration execution; do not represent them as a single fresh full-suite run. Runtime application source is unchanged from the passing integration production build; no build was repeated for a test-only addition.
|
||||
|
||||
Limits: current simple interpolation only, not a future ICU/plural engine; no every-string/frontend/backend completeness, native translation quality, human/device or European locale release acceptance. The 60 research locale candidates remain unshipped. Native terminology, market priorities, Montenegrin identity/canonicalisation and registry/migration decisions retain their documented gates.
|
||||
@@ -1,13 +0,0 @@
|
||||
# Error-state translation inputs
|
||||
|
||||
2 November 2026. Twelve historical call sites reviewed through local state constructors; no runtime implementation changed or privileged action executed.
|
||||
|
||||
- ApplicationAssets.tsx:104/887: AssetError.messageKey originates in the private assetError helper with literal/finite conditional arguments, or three explicit cover-AI source error constructors. Conflict status selects revisionConflict; API error text stays display data rather than a catalogue key. Shell is private to this module with AssetError props from these owners.
|
||||
- AdminSystemPage.tsx:333/448/449: ReadKind/ActionKind are bounded by four local read/action entry points; readNotice is called only with status/benchmark/maintenance/email. Error-key maps have fixed entries; success state is supplied only by four local literal runAction calls. API response bodies never supply kind/success keys. No maintenance/probe/email request was run by this review.
|
||||
- CareerProfilePage.tsx:508/509/865: stage/import-label maps already use Object.hasOwn with explicit generic or raw-text fallback. Run action errors are constructed from cancel/retry/accept/discard and conflict status, with fixed key literals; server error message remains data. No import processing or canonical profile mutation was executed.
|
||||
- GmailReviewPage.tsx:231 has two distinct translator calls, both fed by only three literal write-error constructors (save/sync/create). No real mail operation or provider access.
|
||||
- JobDiscoveryPage.tsx:229/230: error state receives only five literal keys from local catches, or null; the first call has a fixed unavailable fallback and the second is guarded by non-null state. No provider request or source grant implied.
|
||||
|
||||
All components obtain t from useI18n. Assertion verified 87 distinct relevant keys, including the import label/stage maps, in both catalogues. This is finite key/owner/control-flow review, not native translation quality, all message formatting or a security/operational pass.
|
||||
|
||||
Register schema 2 now uses immutable inventoryEntryIndex (bound to the original inventory hash) to distinguish the two identical Gmail expressions on the same line. All 74 supplemental indices are unique. Earlier file/line/expression fields remain for readability; they alone cannot identify same-line repeated calls. Reconciliation: 108 original + 74 supplemental = 182 resolved / 6 pending of 188.
|
||||
@@ -1,29 +0,0 @@
|
||||
# Finite owner-map review — 2 November 2026
|
||||
|
||||
Static source review resolves three further historical dynamic call sites; no application code changed.
|
||||
|
||||
| Call | Owner and key bounds | Result |
|
||||
| --- | --- | --- |
|
||||
| CoverLetterDocument.tsx:36, `t(fieldLabels[key])` | `detailFields` is a literal tuple of eight fields; typed fieldLabels maps to letterSenderName/Title/Email/Phone/Location, letterRecipient/Subject/Date; component obtains t from useI18n. | RESOLVED |
|
||||
| CoverLetterDocument.tsx:153, `t(fieldLabels[key])` | `contactFields` is the five-field literal subset; CopyLetterSnapshot obtains t from useI18n. User snapshot values remain interpolated data, never keys. | RESOLVED |
|
||||
| careerCompletenessLabels.ts:15, `t(key)` | Seven literal mapped TranslationKeys: profileCvCompletenessPersonal/Summary/Experience/Education/Skills/Projects/Languages. Unknown labels return verbatim. Both callers, ProfileCompleteness and CareerWorkspaceOverview, pass the useI18n translator. | RESOLVED |
|
||||
|
||||
Graph queries preceded source inspection. A local assertion verified all 15 distinct keys have definitions in both catalogues. This proves finite key coverage and translator ownership, not native translation quality or runtime acceptance. Historical call lines and reviewed source are unchanged by the attachment-title package.
|
||||
|
||||
Reconciliation: 188 historical dynamic calls; 108 previously resolved + 1 checklist category map + 3 here = 112 resolved / 76 pending. The four checklist system-key template calls remain pending. Do not rewrite user-provided contact fields or backend completeness labels merely to translate them.
|
||||
|
||||
Further review resolves CvTemplateGallery.tsx:33's three indexed calls (`labels[0]`, `[1]`, `[2]`). `templateLabels` is a nine-entry Map of typed, fixed three-key tuples; its 27 references contain 24 distinct keys, all asserted present in both catalogues. Calls occur only after a matching tuple was found for Bokmål. Unknown themes and English retain the backend theme metadata as their existing fallback. Gallery and preview-dialog callers obtain language/t from useI18n. Preserve historical theme identities and renderer versions; this review changes neither metadata policy nor rendering. No additional runtime test was required for this source-only review.
|
||||
|
||||
Latest reconciliation: 115 resolved / 73 pending (188 total). The earlier 112/76 count describes the preceding review checkpoint.
|
||||
|
||||
Dashboard follow-through resolves five additional sites: DashboardGrid.tsx:47/63, DashboardLayoutEditor.tsx:77, DashboardView.tsx:372 use the nine literal WIDGETS titleKeys; DashboardView.tsx:259 iterates the three literal table-heading keys. All 12 keys were asserted present in both catalogues; the components use useI18n. WidgetId is derived from WIDGETS; normalizeDashboardLayout discards unknown persisted identifiers and constructs widgets from the matching definition. This establishes the finite translation domain, not arbitrary forged prop safety or layout/device acceptance. Geometry, hidden positions, schema-2 persistence and revisions were not modified.
|
||||
|
||||
Current reconciled total: 120 resolved / 68 pending, still 188 historical dynamic calls. These static reviews do not close the broader every-string context, backend-message or native-language review requirements.
|
||||
|
||||
ApplicationIntelligence.tsx:367/373 review resolves two further sites. timelineCategoryLabel maps five fixed labels, with unknown categories returned as data; matchBandLabel admits only Strong/Partial/Low/Unknown before forming a key and returns unknown bands verbatim. All nine distinct catalogue keys were asserted present in both languages; caller components obtain t from useI18n. Current reconciliation: 122 resolved / 66 pending. This key-domain review does not assert native translation quality or live matching accuracy.
|
||||
|
||||
Follow-up runtime corrections are recorded in UNKNOWN_LABEL_FALLBACKS.md and PIPELINE_ALIAS_FALLBACK.md: inherited property names required own-property guards in the completeness/timeline helpers and pipeline alias normaliser. Their regression evidence supersedes the earlier unconditional static fallback claims. Pipeline's one historical call is now resolved, bringing the intermediate count to 123/65.
|
||||
|
||||
AdminProcessingPage.tsx:153/173/205 adds three source-resolved calls: task filter labels iterate Object.keys(tasks), excluding inherited properties; table headings use six literal keys; detail date labels use four literal tuple keys. useI18n supplies t. Eleven distinct catalogue keys for these domains, plus the ten pipeline label keys, were asserted present in both languages. Backend-derived status/stage/task/event/worker strings remain pending because their dictionary accesses need separate own-property and unknown-value review. Do not count those as covered by the safe literal/own-key iterators.
|
||||
|
||||
Latest reconciliation: 126 resolved / 62 pending, of 188 historical dynamic calls. The chronological counts above are historical checkpoints, not overlapping work to add again.
|
||||
@@ -1,7 +0,0 @@
|
||||
# Import-review and operation label guards
|
||||
|
||||
2 November 2026. Four unchanged sites reviewed: OperationsPage.tsx:127/158 and career/CvImportReview.tsx:114/165. The existing task/status and field/warning dictionaries are all guarded with Object.hasOwn before translation. Unknown task/field/warning text remains data; unknown operation status uses the existing underscore-to-space display fallback. Components obtain t from useI18n. No operation, import, provider, model or profile mutation was executed.
|
||||
|
||||
Every literal dictionary value was checked for definitions in both catalogues. These existing guards prevent inherited-property names from entering the translator; no new implementation was necessary. Source/control-flow review is not native-language, full import accuracy, notification delivery or integrated security acceptance.
|
||||
|
||||
Machine register: 108 original + 78 supplemental = 186 resolved / 2 pending of 188. Remaining sites are interview category and document attachment-purpose lookups; synthetic regressions are in progress, and neither is claimed fixed by this review.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Interview category and document-purpose fallbacks
|
||||
|
||||
2 November 2026. Two confirmed functional defects: inherited Object-property names bypassed interview category raw-text fallback and document-purpose localized Other fallback. Synthetic EN/NB diagnostic run: ten failures, two passing lowercase-purpose controls, 29 unselected cases. This is not a prototype mutation or account-access finding.
|
||||
|
||||
Minimal fixes: Object.hasOwn in the existing interview category helper; a null-prototype object for the existing inline document-purpose map. Exact known labels, purpose lowercasing, existing unknown-value choices and all surrounding workflows remain intact. No role, API, CV/import acceptance, revision, model, provider, storage, database or final UI design changes.
|
||||
|
||||
GREEN: 41 tests across full interview-prep and documents-page suites, zero failures/pending, exit 0. Twelve new cases cover constructor/toString/__proto__ in EN/Bokmål, checking unknown category text and localized Other purpose. Existing cases protect normal interview/follow-up, document filtering/date/link/download and account-safety behavior. Full typecheck and four-file scoped lint passed, zero warnings. Native report: job-tracker-ui/.artifacts/interview-document-fallbacks.json. All 13 dictionary/fallback keys verified in both catalogues. No real model, mail or provider operation.
|
||||
|
||||
Rollback: revert the two lookup changes and twelve test cases; no data conversion or recovery action. Existing labels/history/content are not rewritten. Final integrated security/browser/build qualification remains separately recorded; this test report is not a full application pass.
|
||||
|
||||
The historical 188-call census is now completely accounted for: 108 prior finite-branch sites plus 80 individually reviewed supplemental sites, no overlapping inventory indices, zero pending finite key domains. Register schema 2 distinguishes same-line repeated calls. This does NOT mean complete I18N-00, every-string sensitivity/context, backend-message extraction, plural/select architecture, European locale publication, native translation, accessibility or full runtime coverage is accepted. New code and changed owner dependencies require renewed review. Preserve the original inventory as immutable historical evidence.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Landing and document-index key domains — 2 November 2026
|
||||
|
||||
Eleven additional sites reviewed without source changes. Both pages obtain t from useI18n; no UI/market/document preference or route behavior changed.
|
||||
|
||||
LandingPage.tsx:87/172/173/190/191: FEATURES and STEPS are six-entry literal arrays with fixed title/body keys (24 distinct keys). PUBLIC_PLANS contains Free with five features and Pro with six; the indexed key expression therefore currently yields 11 existing keys. All 35 are defined in both languages. The machine register binds planCatalog.ts as an owner dependency, since adding/reordering features requires renewed key/copy review even if LandingPage itself is unchanged. This resolves key existence, not the accuracy, entitlement, deployment or marketing approval of existing public claims. New public-site content remains separately gated and unpublished.
|
||||
|
||||
DocumentsPage.tsx:222/225/231/264/265 (two expressions at 265): date label is a four-value literal conditional; state/type lookups use finite arrays with explicit fixed-key fallbacks; filter title/option parameters have only three local callers using the literal types/states/visibility arrays. All 22 distinct keys are defined in both catalogues. Unknown state/type objects cannot introduce a catalogue key through array find. Date values, application names and document content remain data. The attachment-purpose inline object lookup at line 243 remains pending; do not assume it has safe arbitrary-key behavior.
|
||||
|
||||
Local assertion checked all 57 distinct keys have definitions in both catalogues, and confirmed actual 5/6 plan feature lengths. No browser or production build rerun for unchanged source-only review. Full native language, plural/formatting, accessibility and feature availability remain separate qualifications.
|
||||
|
||||
Register: 108 originally resolved + 48 individually matched supplemental sites = 156 resolved / 32 pending of 188. Catalogue/source/dependency hashes bind this checkpoint. No call is counted twice.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Supported-language control naming
|
||||
|
||||
2 November 2026. Existing compact AppShell control now displays NB for Bokmål, accessible native name Norsk bokmål, and lang=nb. English retains EN/English with lang=en. This distinguishes written-language identity from Norway's NO country code. Native self-names are intentional invariant labels, not ordinary untranslated interface prose.
|
||||
|
||||
The persisted UI value remains nb; I18nProvider still handles legacy aliases and server nb-NO. No document/ad-language preference, route, country support, new locale, navigation layout or final design implementation changed. Both buttons retain their existing handlers, aria-pressed state and two-character badge width.
|
||||
|
||||
RED: new shell test failed against the old Norsk/NO label. GREEN: 17 tests in app-shell-navigation, app-shell-notifications and i18n-provider, zero failures/pending, native exit 0. New case checks both language attributes, native name, badge, pressed state and persisted nb selection. Scoped lint and full typecheck passed. Existing language-persistence cases overlap the preceding catalogue QA run; do not add the totals as disjoint tests. Native local report: job-tracker-ui/.artifacts/language-control-qa.json. Native-device/AT/browser qualification remains distinct.
|
||||
|
||||
Literal review also checked JobFlowBar's Flow label. Bounded src search found only its declaration; it has a separate local status normaliser rather than importing the shared pipeline helper. No deletion candidate is established and no inactive/compatibility component was changed solely to reduce an inventory count. Other formatting, admin labels and backend literals remain open.
|
||||
|
||||
Fresh production static build after the language-control patch PASSED, native exit 0, including TypeScript and all three generated pages. This is development build evidence, not browser/native AT or production qualification. Native test evidence is archived at ../direct-roadmap/integration-evidence/language-control-native.json.gz.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Mobile build metadata localisation
|
||||
|
||||
3 November 2026. Independent bounded UI-language fix on `codex/i18n-build-metadata`, based on accepted integration `d3d338376444b8abdcaf7200f682faa3daf1ad10`. The existing i18n worktree was reused; original codex/i18n-accessible-labels ref remains4172c23d. This branch does not include the newer A3 foundation/navigation increments and must not replace their tree wholesale.
|
||||
|
||||
Defect reproduced: in the Bokmål mobile account menu, the version was translated but the revision line remained literal `commit abc1234`, while the existing catalogue already provides `applicationVersionCommit` with `revisjon`. The new regression passed for English and failed for Bokmål before the fix.
|
||||
|
||||
The existing AppShell now uses the existing combined localised version/revision message in that menu, retaining the version-only fallback when no commit was supplied. Caller-controlled admin metadata visibility is unchanged. No new keys, enabled locales, provider/model operation, API, data model or physical document changes. Historical188 dynamic-call reviews are not reopened or recounted; AppShell is absent from that resolution register. This is a static literal correction, not complete European localisation.
|
||||
|
||||
Validation: 24 targeted tests in five suites PASSED (new EN/NB commit and version-only menu checks plus existing metadata/visibility, mobile readiness, catalogue and language-provider checks). Typecheck, scoped zero-warning ESLint and a fresh static production build PASSED. An initial test used an unsupported Testing Library `exact` role option; removed it, retaining exact string-name matching. The failed intermediate typecheck/build were superseded by the final successful run. Native Jest report: evidence/mobile-build-metadata/TESTS.json. No fresh browser/native-device, provider, backend or integrated security qualification is claimed for this separate branch.
|
||||
|
||||
Integration requirement: preserve pending navigation review artifact992608c7. When the next relevant implementation entry is authorised, port only this small AppShell hunk and its regression test onto the reconciled A3 branch, then run combined navigation/metadata/language checks and build as appropriate. Do not cherry-pick older branch application/theme files or alter the original frozen translation register. No main merge or deployment.
|
||||
@@ -1,9 +0,0 @@
|
||||
# Mobile application salary formatting
|
||||
|
||||
Scope: bounded I18N-02 display fix on `codex/i18n-mobile-salary` from `1ce93ca0e3a906673e636e56f1b910756ca78bb2`. The same unlocalised formatter and mobile caller were also present at A3 `49e79875`. The 188 historical dynamic-call reviews remain accounted for.
|
||||
|
||||
The mobile Jobs and Trash cards use the selected EN/NB UI locale for numeric salary formatting and the existing Year, Month and Hour labels. Recognised period codes match case-insensitively. Other imported period text stays literal, including values that would otherwise collide with inherited JavaScript properties. Currency, saved amounts and the existing free-text fallback are retained. Offer Comparison keeps its own existing formatting contract.
|
||||
|
||||
The new mounted-card test failed on the previous English `yr` suffix. It then verified English and Bokmål grouping and decimals after a live UI-language change, preservation of zero, an unknown imported period and free text, unchanged application query parameters and no preference write from the synthetic storage event. The page's existing language-change refresh can repeat the same read. This checkpoint did not change that behaviour.
|
||||
|
||||
Validation from `job-tracker-ui`: `npm test -- --runInBand --runTestsByPath src/job-table-density.test.tsx src/offer-comparison.test.tsx` passed 20 tests across two suites. `npm run typecheck`, targeted ESLint with zero warnings and `npm run build` passed. The build generated three static pages. Browser/device and native-language reviews remain open. No new locale or release qualification is claimed.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Pipeline alias fallback — 2 November 2026
|
||||
|
||||
CONFIRMED functional defect: normalizeStatus('constructor') returned the inherited Object function and '__proto__' returned an object instead of the declared pipeline status or Other. statusLabel could consequently lose a custom status. No prototype mutation, account access or persisted-data corruption is asserted.
|
||||
|
||||
Minimal fix: only accept own properties of the existing ALIASES map. Existing trimming, case-insensitive canonical stages, known aliases, empty-as-Applied and custom-as-Other behavior are retained. Imported shared-helper callers reviewed here are KanbanBoard and ApplicationWorkspacePage. Correction: JobFlowBar has a separate local normaliser; the earlier name-based caller search incorrectly included it. That component was not changed. No statuses or stored records were renamed; no routes, migrations or dependencies changed.
|
||||
|
||||
RED diagnostic: constructor and __proto__ cases failed; toString control passed because the input is lowercased. Eleven unrelated cases were not selected in that diagnostic run. GREEN final: pipeline and grouped-board suites, 29 tests, zero failures/pending, native exit 0. New cases verify raw custom labels bypass translation; existing cases cover aliases, group membership/order, valid stage labels and board interactions. Scoped lint and full typecheck passed. Native ignored report: job-tracker-ui/.artifacts/pipeline-alias-fallback.json.
|
||||
|
||||
This resolves historical pipeline.ts:149 `t(LABEL_KEYS[normalized])`: the canonical result is one of the ten explicit LABEL_KEYS or Other, which returns raw status. The original implementation's assumed finite return domain was not true for inherited names. Latest dynamic review count: 123 resolved / 65 pending of 188. Full catalogue/native-language context acceptance is separate.
|
||||
|
||||
Rollback: revert the one-line guard and regression additions. Production build from the preceding label/session package predates this patch and is not claimed as a fresh pipeline build. Final integrated browser/security qualification remains open.
|
||||
@@ -1,13 +0,0 @@
|
||||
# Processing-monitor translation fallbacks — 2 November 2026
|
||||
|
||||
CONFIRMED functional defect: runtime status/stage/task/event/worker names matching inherited Object properties bypassed existing unknown-value fallbacks. Six EN/Bokmål cases using constructor, toString and __proto__ failed before the fix. No prototype mutation, privilege escalation or backend validation bypass is asserted.
|
||||
|
||||
Minimal shared fix: the five existing label dictionaries now use null-prototype objects, retaining their exact entries and Record typing. All callers, Object.keys filter controls and existing fallback expressions remain intact. No auth/role, API, polling, account-isolation, queue, model or production behavior changed. Known fields translate normally; unknown names reach the existing localized Unknown/Other operation/Unregistered worker/Not recorded labels.
|
||||
|
||||
PASSED: all 17 admin-processing-page tests, zero failures/pending, native exit 0. Six new cases exercise all five map domains, open the collapsed worker-details section, then check timeline event/status/stage fallbacks; eleven existing cases cover normal monitor workflows and safety. An intermediate rerun failed only because the new worker-label visibility assertion inspected a closed details element; the test now opens its summary through the normal UI. That run is not counted as passing or added to the final total.
|
||||
|
||||
PASSED: full typecheck and scoped two-file ESLint, native exits 0. Thirty-eight distinct map/fallback keys asserted present in both catalogues. Local native report: job-tracker-ui/.artifacts/processing-label-fallbacks.json. AST-only graph update required after code edits; keep generated graph separate from the implementation commit. Full build/browser and final integrated security acceptance are not claimed for this patch.
|
||||
|
||||
Five historical call sites resolved: AdminProcessingPage.tsx:130/131/175/191/212. Machine register binds each expression and reviewed source hash: 131 resolved / 57 pending of 188. The earlier safe map iterators retain their coverage with updated source hashes. This is key-domain/fallback evidence, not complete locale or native-language acceptance.
|
||||
|
||||
Rollback: revert the five dictionary constructions and six regression cases; no data migration or restoration needed. Continue remaining owner-map review; preserve unapproved final design and live/security/release gates.
|
||||
@@ -1,10 +0,0 @@
|
||||
# Reminder and interview key review — 2 November 2026
|
||||
|
||||
Five additional historical dynamic call sites resolved by source review; no implementation or runtime inference changed.
|
||||
|
||||
- InterviewPrep.tsx:236/261/285: INTERVIEW_AI_FOCUS is a literal five-entry array. The selected value uses find plus a guaranteed first-entry fallback; menu labels iterate the same array. All five labelKeys are fixed catalogue keys. InterviewAiAssistant obtains t from useI18n. UI language and selected generated-content language remain separate; resolving these labels does not enable AI or prove semantic output quality.
|
||||
- RemindersView.tsx:35/38: generatedReasons is a Map with seven fixed catalogue values; generatedDayReasons has four literal key/regex pairs. Map.get guards the direct lookup; only anchored numeric-day matches interpolate the days placeholder. Unknown reason text returns unchanged as data. The supplied translator is the useI18n translator. Map semantics do not admit inherited Object-property keys.
|
||||
|
||||
All 16 distinct keys were asserted present in both catalogues. This proves finite key coverage and translator ownership, not grammar/native review, all every-string context, plural quality or notification delivery. European plural/formatting architecture remains separately gated; no existing working translation was rewritten. No source edit, live model/provider call, paid scan or duplicate regression rerun was needed for this static review.
|
||||
|
||||
Machine register: 108 original resolved sites + 28 individually recorded supplemental sites = 136 resolved / 52 pending of 188. Source hashes and exact historical expressions are bound in DYNAMIC_RESOLUTION_REGISTER.json. Continue unresolved category/asset/import maps and backend-owned keys; never treat this count as complete i18n acceptance.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Session-change message localisation — 2 November 2026
|
||||
|
||||
Implemented in the existing App invalidation branch. Reuses the existing `sessionChangedCleared` English/Bokmål catalogue message. The canonical document language (`nb-NO`, set by I18nProvider) selects Bokmål; other values safely select English. Reading it occurs only in the invalidated client branch. No provider, hook, storage access, request, dialog or private callback is retained to obtain the message.
|
||||
|
||||
Callers: root App renders Application only while valid; invalidation replaces it with a main alert and preserves the existing passive redirect to /login?sessionChanged=1. I18nProvider already publishes the current UI language to the document; generated-content language is unrelated. All routes, auth/CSRF/context tokens, abort logic and provider teardown remain unchanged. No new translation key or dependency.
|
||||
|
||||
RED: two new root-render tests failed against the previous literal English alert. PASSED after patch: 17 tests in session-boundary-message.test.tsx and session-boundary.test.ts, zero failures/pending, exit 0. New cases verify EN/NB feedback outside the private provider tree and zero API requests. Existing cases exercise cross-tab/cookie invalidation, abort/stale callbacks and session-context handling. These are local Jest/DOM tests; jsdom navigation is not browser redirect qualification.
|
||||
|
||||
PASSED: full TypeScript typecheck; scoped ESLint of App.tsx and the new test, zero warnings. Local ignored native Jest result: job-tracker-ui/.artifacts/session-boundary-message.json. No fresh full build/browser or complete security acceptance claimed. Rollback: revert the two source/test files in this package; no data changes. The attachment-label fix remains independently preserved.
|
||||
|
||||
The original literal-inventory App.tsx entry is now implemented; the inventory remains a historical snapshot. Final integrated security regression must run after relevant application changes are complete.
|
||||
@@ -1,15 +0,0 @@
|
||||
# Unknown translation-map labels — 2 November 2026
|
||||
|
||||
CONFIRMED functional defects, repaired locally with synthetic regressions: Career Profile completeness and application timeline category helpers used ordinary object property lookup. Unknown labels matching inherited Object properties (`constructor`, `toString`, `__proto__`) were incorrectly sent to the translator, losing the original text and producing missing visible/accessible labels. This is not a prototype-pollution or account-access finding; no such impact is claimed.
|
||||
|
||||
Minimal fix: Object.hasOwn guards in the two existing helpers. Known keys still translate normally, other strings remain data. Callers: ProfileCompleteness and CareerWorkspaceOverview; ApplicationTimeline. No API, persisted profile/category, UI language preference, generated-content language or revision behavior changes; no dependencies added.
|
||||
|
||||
RED: three inherited-name Career Profile cases failed (two known/custom control cases passed); three timeline-category cases failed before the patch (11 unselected cases were skipped in that diagnostic run). GREEN final combined execution: 41 tests across four suites, zero failures/pending, native exit 0: career-completeness-labels, career-history-view, career-workspace-page and application-intelligence. Do not add the overlapping earlier 27-case run to this total. Full typecheck and scoped four-file ESLint passed, zero warnings.
|
||||
|
||||
Native ignored JSON: job-tracker-ui/.artifacts/translation-map-fallbacks.json. Known-key test checks the translated catalogue key; timeline tests verify accessible button names for all three inherited-name canaries. No production or live provider/model used. Full integrated security testing remains deferred until relevant application changes are complete.
|
||||
|
||||
Correction to earlier static review: finite literal-key coverage alone did not prove the stated unknown-label fallback for these ordinary object maps. These regressions now verify it. The checklist category helper's current caller iterates CHECKLIST_CATEGORIES, so arbitrary unknown categories never reach its lookup; no speculative checklist change was made. Other maps with external keys, including processing-monitor maps, still need equivalent reachability/fallback review. Dynamic-call total remains 122 resolved / 66 pending; this remediation is not another resolved call count.
|
||||
|
||||
Rollback: revert the two helper lines and associated tests only; no data rollback needed. Remaining limits: no claim of native-language quality, full WCAG, all map coverage or final integrated security acceptance.
|
||||
|
||||
Final build: Next.js 16.4.1 static production build PASSED, exit 0, including TypeScript and all three generated pages. This also builds the session-message and preceding attachment-label fixes on this branch. API build-time base was local; no deployment or live service validation. Sanitized native reports are retained in evidence/translation-map-fallbacks.json.gz and evidence/session-boundary-message.json.gz (41 and 17 disjoint selected tests respectively).
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"base": "d4b938fafbf10541b62134293cea8299f25c4031",
|
||||
"recordedAtUtc": "2026-11-03T08:50:34.776817+00:00",
|
||||
"policy": "LF-normalised SHA256 text",
|
||||
"files": {
|
||||
"job-tracker-ui/src/views/DocumentsPage.tsx": "2a3187938d7f61cc1d723bae5b784f09707713606b523db176d6df6d05a91c3d",
|
||||
"job-tracker-ui/src/documents-page.test.tsx": "abfa8c4bef73499c0546f7e9b8a091793b8c273f829b51159ae115fc54aa4ed3",
|
||||
"job-tracker-ui/src/i18n/I18nProvider.tsx": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113",
|
||||
"docs/i18n/00/DIRECT_CATALOGUE_ACCESS.json": "c470c52c500d79f51c4cedd073c2a8474ae73b832e531df3c0c38369993cae3f",
|
||||
"docs/i18n/DOCUMENT_DATE_VALIDATION.md": "602cd31d84eed1e59ed000159bdc8b998b0dbdc5b7c965ad51831d26a16b31d6",
|
||||
"docs/i18n/DIRECT_CATALOGUE_REVIEW.md": "4eb88d2d1da2ed0cd52d49fc8dc7f11d1943d169c240e56ae3562d298bc6eb6a",
|
||||
"docs/i18n/evidence/document-dates-tests.json": "227187b5a02473f442c8600b434e5f0922fa63ba13bfb9355254b9a19b7d4e81",
|
||||
"docs/i18n/evidence/document-dates-red.json": "430ec89f685c2558d443677c596a12b587829a9a45e3f29dc03e042d3685a074"
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"recordedAtUtc": "2026-11-03T07:52:44.745521+00:00",
|
||||
"base": "d3d338376444b8abdcaf7200f682faa3daf1ad10",
|
||||
"policy": "UTF8 text/JSON SHA-256 after LF normalisation",
|
||||
"sources": {
|
||||
"job-tracker-ui/src/layout/AppShell.tsx": "603afbe21d854ec4af7b17ec75a58cfdd65cc053e72d63769d20df7a81c7acc3",
|
||||
"job-tracker-ui/src/build-metadata-localisation.test.tsx": "065c5550a18f7b3c7dca9bbb26c5564a53a53eaf389e7c9695596fcbb2c06f6e",
|
||||
"job-tracker-ui/src/i18n/translations.ts": "ed99d129f8702181429e10ec02f65f734220409fcba4de51d0d77a0d60871ea4",
|
||||
"job-tracker-ui/package.json": "3745394e406cefa40d30a87e840bccb359be147bac6ffba736e2ae90898a8626",
|
||||
"job-tracker-ui/package-lock.json": "bf31e90d7af03e8af059db2aaf893925b9e8881a30a1688034ed88ef45d4fcab"
|
||||
},
|
||||
"testReport": "1c7fb362460f2475fb4a782e26b56d1ee112595c3883cd6294a5b7ac6d72dd15",
|
||||
"validation": {
|
||||
"tests": "24 passed,5 suites",
|
||||
"typecheck": "exit0",
|
||||
"scopedLint": "exit0",
|
||||
"productionBuild": "exit0"
|
||||
},
|
||||
"limits": [
|
||||
"no fresh browser/native acceptance",
|
||||
"not combined with pending A3 navigation review992608c7",
|
||||
"188 historical dynamic-call review remains unchanged"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
# Public content architecture — proposed, not implemented
|
||||
|
||||
2 November 2026. Independent preparation under the owner's current direct-roadmap instruction. No visual concept selected, public route added, marketing claim published or application source changed. Final layout/section order remains an owner decision.
|
||||
|
||||
Reuse the current Next static-export build, React Router private shell, MUI design tokens, shared plan ownership and en/nb translation contracts. Avoid a CMS or second application shell. Public descriptive content should be emitted as crawlable static HTML from repository-managed, locale-aware content; authenticated routes retain their current client-only providers. Do not turn private account data, feature flags or arbitrary query strings into build-time content.
|
||||
|
||||
Separate content domains:
|
||||
|
||||
- Feature catalogue: stable feature ID and links to implementation, scoped acceptance, deployed identity, entitlement, market, locale, approved screenshot and marketing approval. Missing evidence withholds a current-availability claim. Existing MARKETING_CLAIM_VALIDATION.md remains the authority; do not duplicate it into a competing status list.
|
||||
- Page copy: complete title, description, headings, feature narratives, links, FAQ and accessible text in approved locale resources. Whole sentences and explicit placeholders; reuse terminology and distinguish canonical Career Profile from a CV variant.
|
||||
- Market: available product/provider capabilities, actual billing/currency, legal links and applicable languages. A market is not a language, nationality or automatic grant to fetch jobs.
|
||||
- Assets: genuine synthetic product captures with source commit/date/surface/theme/viewport, rights and alt-text context. The five application design concepts are conceptual prototypes, not screenshots of a released product. No unlicensed images or invented customer testimonials.
|
||||
|
||||
Draft profession-neutral content options for later copy review: “Your job search, organised.” / “Jobbsøkingen din, organisert.” Supporting proposition: “Keep applications, career information and documents together.” / “Samle søknader, karriereinformasjon og dokumenter på ett sted.” These are unpublished candidate copy, not released-capability approval or native-language acceptance. Avoid promising universal import accuracy, live international sources, automatic employer actions, AI availability or privacy certifications.
|
||||
|
||||
Candidate narrative modules (not an approved order): clear outcome and product preview; tracking and next steps; Career Profile/document workflow; optional import review; how it works; verified plan information; factual FAQ; supported registration path; legal/support footer. Where registration is disabled, the CTA must use the existing truthful sign-in/access path rather than promise account creation. Legal destinations and final FAQ answers require verified content; never invent links or policies.
|
||||
|
||||
Implementation gate: after final visual approval, use the approved composition with static public copy and a small client interaction boundary for preference/navigation. Preserve signed-in redirect, protected-route return state and the existing dashboard-first optional onboarding. No second onboarding flow. Reverting future content is an ordinary version-controlled content rollback; no database migration is proposed by this architecture.
|
||||
|
||||
Open: final visual choice, actual released feature/plan/provider evidence, production origin/deployed identity, public asset provenance and native copy review. Full European catalogue work does not automatically publish locale pages.
|
||||
@@ -0,0 +1,22 @@
|
||||
# LAUNCH-01 homepage concepts
|
||||
|
||||
Open the [comparison gallery](concepts/index.html) from this checkout, or open any full-page desktop and phone image below. These are standalone English design previews. The registration and sign-in treatments scroll to an explanation in the prototype. Plans show layout and the existing catalogue labels only. Public copy, pricing, legal destinations, localisation and feature availability need release validation.
|
||||
|
||||
| Concept | View | Strength | Tradeoff and accessibility focus |
|
||||
| --- | --- | --- | --- |
|
||||
| A · Modern Minimalist | [Responsive](concepts/minimal.html) · [Desktop](concepts/renders/minimal-desktop.png) · [Phone](concepts/renders/minimal-phone.png) | A direct split hero leads with the application tracker. Violet accents connect it to the application. | The restrained treatment puts more weight on the headline. On phones, the screenshot is a cropped preview with a full-capture link. |
|
||||
| B · Premium SaaS | [Responsive](concepts/premium.html) · [Desktop](concepts/renders/premium-desktop.png) · [Phone](concepts/renders/premium-phone.png) | A large dashboard stage explains the organisation workflow through the product itself. | The desktop composition uses more vertical space. The phone layout puts a left-aligned headline and actions before the capture. Recheck text contrast if the background treatment changes. |
|
||||
| C · Friendly and Human | [Responsive](concepts/human.html) · [Desktop](concepts/renders/human-desktop.png) · [Phone](concepts/renders/human-phone.png) | Sage and Georgia display type support an original illustration spanning education, care and trades. A separate teacher CV capture shows the actual product. | Product evidence follows the introduction. The illustration has an alternative description and is separate from the development capture. |
|
||||
| D · Modern Editorial | [Responsive](concepts/editorial.html) · [Desktop](concepts/renders/editorial-desktop.png) · [Phone](concepts/renders/editorial-phone.png) | A navy masthead and asymmetric Career Workspace frame emphasise the experience applicants bring to the search. | Display typography needs locale expansion checks. On phones, the masthead and application preview stack in reading order. |
|
||||
|
||||
Each page has the same navigation destinations, basic feature and workflow copy, provisional Free/Pro slots and footer. This keeps the comparison focused on hierarchy, imagery and type. Review the hero, navigation, typography, colour, illustration balance, feature presentation, calls to action and phone layout. The owner can combine parts across concepts and identify missing sections.
|
||||
|
||||
## Verification
|
||||
|
||||
Chromium passed 20 local browser cases across the four prototypes and the gallery at 1440, 768, 390 and 320 px. Checked image loading, no horizontal page overflow, local link destinations, keyboard skip navigation, inactive signup flow, minimum visible link size and axe WCAG A/AA tags. No page errors, external requests or tagged violations occurred. The first run exposed a small review link. Its hit area was enlarged and the full matrix reran. The eight full-page desktop and phone renders were visually inspected. [Browser receipts](concepts/renders/checks.json)
|
||||
|
||||
See [screenshot and asset provenance](SCREENSHOT_AND_ASSET_MANIFEST.md). No production feature, provider, pricing, signup or availability claim was verified. Native accessibility, translated copy and production performance remain open.
|
||||
|
||||
## Owner selection gate
|
||||
|
||||
LAUNCH-01 is ready for owner review. LAUNCH-02 starts when the owner selects one or more directions. Final implementation requires separate explicit approval of the refined design.
|
||||
@@ -0,0 +1,39 @@
|
||||
# LAUNCH-00 source audit - partial checkpoint
|
||||
|
||||
## Design pattern and asset inputs
|
||||
|
||||
- Linear shows the workspace near the top and lets specific workflow examples explain the product. The Premium concept explores a genuine Jobjakt dashboard in a similar position using its own visual treatment. [Linear homepage](https://linear.app/)
|
||||
- Notion groups its feature presentation around recognizable actions. All four Jobjakt concepts use three short outcomes tied to tracking, Career Profile and CV preparation. [Notion product overview](https://www.notion.com/product)
|
||||
- Basecamp combines a direct product explanation with a distinct tour action. The Jobjakt hero prototypes separate a proposed registration action from the feature walkthrough. [Basecamp homepage](https://basecamp.com/)
|
||||
|
||||
The [four rendered concepts](DESIGN_CONCEPTS.md) use verified synthetic product captures and one original illustration. Signup submission, degraded auth, baseline performance and native accessibility remain open in LAUNCH-00. A live commercial claim or current price still needs independent evidence and approval.
|
||||
|
||||
## Rendered baseline reconciliation, 10 November 2026
|
||||
|
||||
The separately published A3 evidence at `bd34a3504f7e849c41b48db444f0e1f16324a16f` includes `docs/ui-modernisation/visual-correction/LANDING_BASELINE_REVIEW.md` and `evidence/landing-baseline/BROWSER.json` under the same directory. The runtime was `e8e7d83958587e8b5a4b93d03d3e736896df5a48`. This closes the rendered anonymous navigation and raw export observations at that baseline.
|
||||
|
||||
12 fixture journeys covered 320, 768 and 1440 px in EN/NB and both themes. Keyboard feature navigation, local language selection and entry into existing sign-in and registration routes passed. No registration was submitted. All three preview SVGs loaded. All 12 states reported missing landmark best practices, and the raw static response lacked a hero heading, canonical and locale alternates. The anonymous language switch attempted 24 authenticated preference writes that the fixture rejected. Public language changes should use the existing local choice until the user has a session. The dashboard SVG email was anonymised in the capture fixture only.
|
||||
|
||||
The captured images are browser evidence of the existing homepage. The preview SVGs inside it are still illustrations. For LAUNCH-01, source potential real product captures from the published A3 evidence viewer, including `dashboard`, `applications-selection`, `career` and the existing CV editor captures. Before using an image, inspect the pixels and bind it to its actual route, source commit, language, viewport, fixture and asset rights. The A3 development branch has outstanding visual acceptance. Its captures are candidates for review mockups. Market, provider and pricing claims require the separate claim review.
|
||||
|
||||
Open audit inputs include contemporary design pattern research, asset rights, realistic registration and degraded-auth behaviour, measured performance and native review. The four LAUNCH-01 concepts remain to be rendered.
|
||||
|
||||
2026-11-02. `feature/launch-site-redesign`, accepted conditional baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`. Full authoritative homepage prompt read. LAUNCH-00 IN_PROGRESS; LAUNCH-01 concepts NOT YET PRODUCED. No final design selected or implemented.
|
||||
|
||||
| Finding | Source evidence | User implication / proposed direction |
|
||||
| --- | --- | --- |
|
||||
| Main Get started opens sign-in | `LandingPage.tsx` passes `goToLogin` to hero CTA; Free-plan CTA separately goes to `/register` | Registration intent has an extra mode-selection step. Propose direct registration while preserving sign-in return state |
|
||||
| Existing signup owner should be reused | `App.tsx:522` maps `/register` to `LoginPage initialMode=register`; LoginPage respects auth config and registration availability | No second onboarding implementation; final CTA must reflect actual enabled registration |
|
||||
| Product previews are conceptual assets | `LandingPage.tsx` uses `/mockups/dashboard.svg`, `pipeline.svg`, `workspace.svg` | Replace with provenance-bound synthetic captures in approved design; never label current artwork a genuine screenshot |
|
||||
| Implementation details occupy hero copy | LandingPage renders React/TypeScript/ASP.NET/EF/FastAPI/Gmail text | Replace with plain user outcomes across professions; framework names do not explain job-search value |
|
||||
| Marketing content depends on client execution and auth probe | `app/page.tsx` loads ClientShell; `ClientShell.tsx` uses `ssr:false`; LandingPage shows loading until `/auth/me` resolves/rejects | Crawlable HTML and loading/failure behavior need measured review; cannot assume static export includes full marketing copy |
|
||||
| Metadata is generic | `app/layout.tsx` has global title/description and initial `lang=en` | Design market/content-locale metadata and canonical/alternate rules without disturbing authenticated routing; no SEO score claimed |
|
||||
| Brand continuity exists | Indigo/cyan hero, shared MUI/theme, custom en/nb translations | Explore distinct compositions while preserving identity; avoid rebuilding app shell |
|
||||
| Product presentation is limited | Six feature cards, six steps and three conceptual images; no actual redesigned CV/import/gallery imagery | Prioritise actual accepted tracking, canonical Career Profile and reviewed document workflow; do not imply new Global Jobs is shipped |
|
||||
| Pricing shows capabilities, not amounts | `planCatalog.ts` defines Free/Pro, explicitly delegates commercial terms to configured checkout | Do not invent amounts/currencies/trials or promise active Pro AI; release and entitlement validation required |
|
||||
| Footer lacks privacy/legal links in this component | LandingPage footer contains copyright text and sign-in button | Verify existing legal destinations and approved copy before adding links; no invented compliance claims |
|
||||
| Responsive layouts are declared | MUI breakpoints change hero controls, feature grids, plan columns and footer | Source intent only; mobile/tablet/keyboard/reflow/contrast require actual rendered checks |
|
||||
|
||||
Preserve signed-in redirect to `/dashboard`, interrupted protected-route return state, shared language behavior, plan policy ownership and existing registration constraints. New public market language must not overwrite job-ad or document output language. Existing custom en/nb implementation is not full European locale support.
|
||||
|
||||
Not yet checked: current rendered desktop/mobile site, external design-pattern research, runtime signup, slow/offline auth probe, keyboard/AT/contrast, image loading/performance, crawled output, real deployment availability and final asset rights. These omissions keep LAUNCH-00 open. No product tests were rerun for this Markdown-only source checkpoint.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Marketing locale integration — proposed contract
|
||||
|
||||
2 November 2026. EN/Bokmål source support is existing; no additional locale is released by this report. Reuse I18N-00 registry/catalogue proposals and their review gates instead of a second country-language mapping. Full European locale identities, script distinctions and native review remain the localisation workstream's responsibility.
|
||||
|
||||
Keep marketing content locale, selected market, application UI language, ad-language preferences and document language distinct. A marketing selector may offer a deliberate explicit application-language action after sign-in; it must not silently write ad/document preferences. Current shared UI preference behavior must be inspected and migrated compatibly before introducing a separate persisted marketing choice. No persistence change is made here.
|
||||
|
||||
Supported choices show native and English names, retain English access, and allow another supported language independent of market. Bokmål/nb/nb-NO/no legacy compatibility does not grant Nynorsk support. Unreleased languages may be described truthfully as forthcoming only with approved copy; they do not receive public routes, hreflang or sitemap entries. User-generated CV/job text is not translated by changing chrome language.
|
||||
|
||||
Complete each published variant's visible, form, error, accessibility, metadata, social and legal text. Validate keys/placeholders, fallback behavior, interpolation escaping, long labels, plural/number/date/currency rules and dirty-form switching. Native terminology review is separate from syntactic coverage. Currency display follows real billing capability, not a selected country. Preserve provider names, original job language, rights/attribution and the distinction between source descriptions and any reviewed translation.
|
||||
|
||||
Acceptance remains BLOCKED for additional released locales until architecture entry, coverage, translation rights/proficient review, actual market capabilities, approved content and integrated QA are satisfied. This does not prevent independent catalogue, fixture, content and SEO planning. See SEO_STRATEGY.md for published-only URL constraints and CONTENT_ARCHITECTURE.md for content ownership.
|
||||
@@ -0,0 +1,20 @@
|
||||
# Preliminary claims and content boundaries
|
||||
|
||||
All claims below are **WITHHELD from public release approval**. Source implementation and conditional development acceptance do not establish production availability. No production inspection was authorised or performed.
|
||||
|
||||
| Proposed subject | Implementation/development evidence | Missing marketing proof |
|
||||
| --- | --- | --- |
|
||||
| Track applications in table/Kanban | Existing LandingPage/plan catalogue and conditional pre-P10 handoff | Deployed version, applicable account entitlement, genuine synthetic capture and approved copy |
|
||||
| Career Profile and CV variants | Canonical profile/document contracts in architecture and CV handoff | Current deployed behavior and accurate plan/theme availability |
|
||||
| Import, review and correct CV facts | Pre-P10 accepted deterministic supported-fixture workflow | No universal parsing or AI-accuracy claim; actual released formats/languages and limitations |
|
||||
| CV templates and PDF | Scoped development appearance/metric approval retained | Physical-print limits, deployed design/version and screenshots |
|
||||
| Reminders/mail/integrations | Existing source owners; provider qualification separate | Actual enabled countries/providers/consent/delivery; avoid blanket automation promises |
|
||||
| International job search | GJ-00 planning separately published; later implementation blocked | Accepted implementation, provider rights and per-country deployed capabilities |
|
||||
| AI assistance | Some contracts implemented; real CV model quality/activation blocked | Accepted model compatibility/accuracy, privacy/consent and enabled deployment |
|
||||
| Free/Pro | Shared public catalogue exists; no price encoded here | Server policy/checkout consistency, active billing, tax/currency wording and approved current prices |
|
||||
| Languages | Existing en/nb source catalogues; I18N audit separate | Native review and per-surface release state; additional locale candidates are not supported language packs |
|
||||
| Privacy/security | Existing controls and conditional security evidence | Approved truthful wording; no certification/compliance guarantee |
|
||||
|
||||
Each final catalogue entry needs feature ID, implementation commit, acceptance artifact, deployed version, entitlement, market, locale, screenshot provenance and owner marketing approval. Missing fields deny availability claims. This is a documentation contract, not a new executable publishing system.
|
||||
|
||||
Proposed section sequence for concept exploration: outcome-led hero; genuine tracking preview; career/document journey; broad-profession story; how it works; verified plans; FAQ; registration CTA; legal/support footer. Final order remains a design choice. No fabricated customer quotes, statistics, discounts or job-provider coverage.
|
||||
@@ -0,0 +1,20 @@
|
||||
# Partial homepage planning handoff
|
||||
|
||||
10 November concept successor. [LAUNCH-01 comparison](DESIGN_CONCEPTS.md) contains four responsive prototypes and eight full-page renders with synthetic development captures and a source manifest. Twenty local browser cases passed. The owner can select or combine directions before LAUNCH-02. Final visual approval, public copy, production rendering and launch acceptance remain separate. Earlier pending statements below describe the previous checkpoint.
|
||||
|
||||
10 November: the published A3 landing baseline now supplies 12 rendered navigation states, raw HTML findings and screenshot provenance candidates. See [homepage audit](HOMEPAGE_AUDIT.md). Next, complete the outstanding audit inputs and render the four concept pairs. Final homepage selection, application implementation and launch acceptance retain their separate gates.
|
||||
|
||||
Continuation 2 November: CONTENT_ARCHITECTURE.md, INTERNATIONALISATION.md and SEO_STRATEGY.md add independent design-neutral content/routing/publication proposals. Byte-matched existing build-shell evidence confirms raw export lacks descriptive marketing HTML, canonical and hreflang. No public UI/routes/metadata implementation or final visual choice made. These source/build checks are not live SEO, performance or release qualification. The five application UI concepts remain separate from LAUNCH-01's required homepage exploration; no sixth application concept created.
|
||||
|
||||
Branch `feature/launch-site-redesign`, baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`. Documentation-only source audit. LAUNCH-00 remains IN_PROGRESS. LAUNCH-01 four actual desktop/mobile concepts are PENDING, not replaced by written descriptions. No owner design decision requested until reviewable concepts exist.
|
||||
|
||||
Next authorised work:
|
||||
|
||||
1. Inspect rendered homepage/signup and research contemporary patterns using credible public sources. Preserve existing routing and privacy boundaries.
|
||||
2. Obtain provenance-bound synthetic screenshots from accepted evidence or an isolated test environment. The committed pre-P10 visual manifest contains real PDF previews/contact sheets, not a complete set of dashboard/CV editor/mobile product captures. Inspect any image before reuse; do not touch the separate pre-p10-ux worktree.
|
||||
3. Produce four distinct, viewable desktop/mobile concepts and an asset/licence manifest. No external image/font acquisition without appropriate rights. Concept placeholders cannot be represented as real application screenshots.
|
||||
4. Present concrete concepts for mix-and-match owner feedback, then stop final implementation until explicit final-design approval. Design approval does not authorise publication.
|
||||
|
||||
No assets, app code, tests, routes, packages, production services or authenticated dashboard were changed. Rendered/browser/performance/accessibility/SEO checks NOT RUN. No production feature/pricing/language availability was asserted.
|
||||
|
||||
The delegated design task stopped at a service usage limit before saving deliverables. Parent continued the source audit and preserved this checkpoint. No design agent is running in the background.
|
||||
@@ -0,0 +1,14 @@
|
||||
# Launch screenshot and asset manifest
|
||||
|
||||
The eight product images in `concepts/assets/` are unchanged copies of real browser captures of the exported A3 React application using intercepted synthetic API fixtures. Every image was inspected and its SHA-256 matched the published evidence manifest at `49e79875d9681efab0880d7e812bb0e536b7d30c`. The prototypes show the top of each capture and link to the full source image. The fixture CV preview uses controlled HTML. These captures establish visual provenance for design review. Public reuse requires confirmation on the accepted release and separate marketing approval.
|
||||
|
||||
| Asset | Route and fixture | Runtime |
|
||||
| --- | --- | --- |
|
||||
| Applications | `/jobs`, saved community nurse role | `1246994cca9a3ba7cb89eb4605b3dc77b5d7c322` |
|
||||
| Dashboard | `/dashboard`, synthetic nurse, teacher and engineer opportunities | `a7d726738b74d13fb805f7bd4f5780bdf19110d0` |
|
||||
| CV editor | `/career/builder/3`, synthetic teacher CV and fixture preview | `b31ce6176bcb8f6a70d3e29ad4057b7cb74a1f53` |
|
||||
| Career Workspace | `/career`, synthetic profile and import review | `b31ce6176bcb8f6a70d3e29ad4057b7cb74a1f53` |
|
||||
|
||||
[Exact source paths, widths and hashes](concepts/assets/provenance.json)
|
||||
|
||||
`concepts/professions.svg` is original vector artwork for this design review. It depicts fictional people and uses no external images, marks or fonts. Prototype type uses local platform fonts and no bundled font files. No photography was sourced or licensed in this checkpoint. Any later photography, generated artwork and public screenshot variants need their own approval and asset record.
|
||||
@@ -0,0 +1,22 @@
|
||||
# SEO baseline and design-neutral proposal
|
||||
|
||||
2 November 2026. Source/available-build review only; no deployment, crawl, search-engine ranking, Lighthouse or performance score claimed.
|
||||
|
||||
## Measured raw-export baseline
|
||||
|
||||
Reused the successful local I18N static build, checking byte identity of launch-branch `app/layout.tsx`, `app/page.tsx` and `app/[[...slug]]/ClientShell.tsx` first. Their SHA256 values respectively: `8e4f0cd2776d821c958480aec5c93943674acb0fe28cd60d0822df40009cb262`, `bf661f17c1c7c06ff8fda41b1afa44144bce694c815d52c3d5a927e32063b1b1`, `0afd4379fbfaeb2059cfa860b10523b212a20dc19c64f961de77bb8572ee6791`. ClientShell disables SSR for the application. This is reused build evidence for unchanged shell sources, not a fresh launch-branch build or proof of every bundle.
|
||||
|
||||
A standard-library HTML parser excluding script/style text found only `Jobbjakt` and `You need to enable JavaScript to run this app.` in out/index.html; canonical link count 0, hreflang count 0. This confirms missing descriptive raw HTML, not an assertion that JavaScript-capable crawlers cannot index the client UI. Root metadata is generic and document language initially en. Record post-implementation comparisons against this narrow baseline.
|
||||
|
||||
## Proposed contract after design/routing approval
|
||||
|
||||
- Emit approved public headings, descriptions, feature text and FAQs in static HTML. Keep private routes and provider/account content outside the prerendered marketing boundary.
|
||||
- Give each published page a descriptive locale-specific title/description, semantic heading hierarchy, Open Graph metadata and approved social asset. Use factual SoftwareApplication/Organization structured data only when supported by the actual page; no fabricated ratings, offers or testimonials.
|
||||
- Obtain the production public origin from release-approved configuration. Do not guess a hostname or use localhost as a public canonical. Canonicals must refer to the intended published page, with query/tracking variants normalised.
|
||||
- Derive canonical/reciprocal alternate/sitemap entries from the same approved published market/content-locale inventory. Include only fully supported published variants; self and reciprocal links must agree. An unreviewed locale is absent, not an empty indexable page. Use valid language/script/region tags; country NO must not be treated as Bokmål nb.
|
||||
- Decide URL shape separately from visuals: proposed explicit `/market/{market}/{contentLocale}/...` or another approved unambiguous scheme. This is a proposal, not an added route. Preserve existing auth and application links and static-host fallback behavior; do not implement speculative duplicate country pages.
|
||||
- Keep incomplete/pre-release previews outside production index publication. Robots directives are not an authorisation boundary or protection for private content. Do not expose private or admin routes through sitemap generation.
|
||||
|
||||
## Required verification before acceptance
|
||||
|
||||
Parse exported HTML per approved locale/market; assert meaningful non-JS content, title/description/lang, one intended h1, canonical origin, reciprocal published-only alternates and sitemap membership. Check no unpublished variants, private URLs or unsupported prices/providers. Follow links in an isolated browser; test auth redirect/registration configuration, language persistence and separation from ad/document preferences. Then measure responsive/accessibility/performance budgets on realistic test conditions, preserving manual/device/native-language and deployed-origin gates. No executable SEO publishing infrastructure is introduced by this report.
|
||||
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 156 KiB |
@@ -0,0 +1,101 @@
|
||||
{
|
||||
"evidenceCommit": "49e79875d9681efab0880d7e812bb0e536b7d30c",
|
||||
"images": [
|
||||
{
|
||||
"target": "assets/applications-1440.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/applications-selection/ordinary-en-light-1440.png",
|
||||
"runtime": "1246994cca9a3ba7cb89eb4605b3dc77b5d7c322",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/APPLICATION_SELECTION_SOURCE_MANIFEST.json",
|
||||
"route": "/jobs",
|
||||
"width": 1440,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "98898ed330f5bb08946477367e1c95e448ee1bfea26c978c13792985de1febda"
|
||||
},
|
||||
{
|
||||
"target": "assets/applications-390.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/applications-selection/ordinary-en-light-390.png",
|
||||
"runtime": "1246994cca9a3ba7cb89eb4605b3dc77b5d7c322",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/APPLICATION_SELECTION_SOURCE_MANIFEST.json",
|
||||
"route": "/jobs",
|
||||
"width": 390,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "9937bb7f328b1c0b719f46b54bf73f1cd0694c348ffe4899449d0ffcf5124d7f"
|
||||
},
|
||||
{
|
||||
"target": "assets/dashboard-1440.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/dashboard/dashboard-en-light-1440.png",
|
||||
"runtime": "a7d726738b74d13fb805f7bd4f5780bdf19110d0",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/DASHBOARD_DISCOVERY_SOURCE_MANIFEST.json",
|
||||
"route": "/dashboard",
|
||||
"width": 1440,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "c19a6b87686d32102db22fe61e4ed7b697f674774f45872d0bf2f2ac64066d80"
|
||||
},
|
||||
{
|
||||
"target": "assets/dashboard-390.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/dashboard/dashboard-en-light-390.png",
|
||||
"runtime": "a7d726738b74d13fb805f7bd4f5780bdf19110d0",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/DASHBOARD_DISCOVERY_SOURCE_MANIFEST.json",
|
||||
"route": "/dashboard",
|
||||
"width": 390,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "a6ae5fdaa0815e3785234ed3db9237cb3cd8418f5dbd5853b4cfc15de1442256"
|
||||
},
|
||||
{
|
||||
"target": "assets/cv-editor-1440.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/career/cv-editor-en-light-1440.png",
|
||||
"runtime": "b31ce6176bcb8f6a70d3e29ad4057b7cb74a1f53",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/CAREER_DOCUMENT_SOURCE_MANIFEST.json",
|
||||
"route": "/career/builder/3",
|
||||
"width": 1440,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "e90a1c32709d376417d9af8b00d8007d53aed102f5d017a4c55cdc7371e402bc"
|
||||
},
|
||||
{
|
||||
"target": "assets/cv-editor-390.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/career/cv-editor-en-light-390.png",
|
||||
"runtime": "b31ce6176bcb8f6a70d3e29ad4057b7cb74a1f53",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/CAREER_DOCUMENT_SOURCE_MANIFEST.json",
|
||||
"route": "/career/builder/3",
|
||||
"width": 390,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "b26258fe02e24f34b107739f0139391d766b3bf8a3e63a5864063e06f40a68e8"
|
||||
},
|
||||
{
|
||||
"target": "assets/career-1440.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/career/overview-en-light-1440.png",
|
||||
"runtime": "b31ce6176bcb8f6a70d3e29ad4057b7cb74a1f53",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/CAREER_DOCUMENT_SOURCE_MANIFEST.json",
|
||||
"route": "/career",
|
||||
"width": 1440,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "637f8dbc0cd01d4382dd409fc0b3870c40e69bbbcb2d6efbbb3e3c6c3b8a46d2"
|
||||
},
|
||||
{
|
||||
"target": "assets/career-390.png",
|
||||
"source": "docs/ui-modernisation/visual-correction/evidence/career/overview-en-light-390.png",
|
||||
"runtime": "b31ce6176bcb8f6a70d3e29ad4057b7cb74a1f53",
|
||||
"manifest": "docs/ui-modernisation/visual-correction/CAREER_DOCUMENT_SOURCE_MANIFEST.json",
|
||||
"route": "/career",
|
||||
"width": 390,
|
||||
"locale": "en",
|
||||
"theme": "light",
|
||||
"fixture": "synthetic",
|
||||
"sha256": "21f367b3848fae24dfe4abf4271c5c9c73fbf4c2a8f1aba5dd6faff61ed6cee9"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,558 @@
|
||||
:root {
|
||||
font-family: "Segoe UI",Arial,sans-serif;
|
||||
line-height: 1.5;
|
||||
color: #241b35;
|
||||
background: #f7f6fa;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-underline-offset: .22em;
|
||||
}
|
||||
|
||||
a:focus-visible {
|
||||
outline: 3px solid currentColor;
|
||||
outline-offset: 4px;
|
||||
}
|
||||
|
||||
h1,h2,h3,p,figure {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
p {
|
||||
max-width: 62ch;
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: clamp(2.8rem,6.6vw,7rem);
|
||||
line-height: .99;
|
||||
letter-spacing: -.065em;
|
||||
font-weight: 760;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: clamp(1.85rem,3.4vw,3.3rem);
|
||||
letter-spacing: -.04em;
|
||||
line-height: 1.05;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.18rem;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.wrap {
|
||||
width: min(100% - 72px,1240px);
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
.review {
|
||||
background: #241b35;
|
||||
color: #fff;
|
||||
font-size: .85rem;
|
||||
}
|
||||
|
||||
.review .wrap {
|
||||
min-height: 44px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: .7rem;
|
||||
flex-wrap: wrap;
|
||||
padding-block: .35rem;
|
||||
}
|
||||
|
||||
.top,.nav,.actions,.bottom {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1.25rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.top,.bottom {
|
||||
justify-content: space-between;
|
||||
padding-block: 1.1rem;
|
||||
}
|
||||
|
||||
.brand {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: .55rem;
|
||||
text-decoration: none;
|
||||
font-size: 1.2rem;
|
||||
font-weight: 770;
|
||||
}
|
||||
|
||||
.mark {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 1.8rem;
|
||||
height: 1.8rem;
|
||||
border-radius: .5rem;
|
||||
background: #704fa6;
|
||||
color: #fff;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.nav {
|
||||
font-size: .9rem;
|
||||
}
|
||||
|
||||
.nav a {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 44px;
|
||||
}
|
||||
|
||||
.hero,.section {
|
||||
padding-block: clamp(2.7rem,6vw,6rem);
|
||||
}
|
||||
|
||||
.hero-copy {
|
||||
display: grid;
|
||||
gap: 1.35rem;
|
||||
justify-items: start;
|
||||
align-content: center;
|
||||
}
|
||||
|
||||
.lede {
|
||||
font-size: clamp(1.07rem,1.7vw,1.34rem);
|
||||
max-width: 38ch;
|
||||
}
|
||||
|
||||
.button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 44px;
|
||||
border: 1px solid transparent;
|
||||
padding: .55rem 1rem;
|
||||
border-radius: .45rem;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
background: var(--accent,#563282);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.button.secondary {
|
||||
background: none;
|
||||
border-color: currentColor;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.product {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.product a {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
border: 1px solid #aaa0b9;
|
||||
border-radius: .65rem;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.product img {
|
||||
aspect-ratio: 1.7;
|
||||
object-fit: cover;
|
||||
object-position: top;
|
||||
}
|
||||
|
||||
.product figcaption,.fine {
|
||||
font-size: .88rem;
|
||||
margin-top: .55rem;
|
||||
}
|
||||
|
||||
.product .phone {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.eyebrow {
|
||||
font-size: .9rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.stack {
|
||||
display: grid;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.section h2 {
|
||||
max-width: 20ch;
|
||||
}
|
||||
|
||||
.grid,.steps,.plans {
|
||||
display: grid;
|
||||
gap: 1rem;
|
||||
grid-template-columns: repeat(3,minmax(0,1fr));
|
||||
margin-top: 1.75rem;
|
||||
}
|
||||
|
||||
.steps {
|
||||
padding-left: 1.6rem;
|
||||
}
|
||||
|
||||
.steps li,.feature,.plan {
|
||||
padding: 1rem;
|
||||
border-top: 1px solid currentColor;
|
||||
}
|
||||
|
||||
.steps li::marker {
|
||||
font-weight: 750;
|
||||
}
|
||||
|
||||
.feature p,.plan p,.steps p {
|
||||
margin-top: .45rem;
|
||||
}
|
||||
|
||||
.plans {
|
||||
grid-template-columns: repeat(2,minmax(0,1fr));
|
||||
}
|
||||
|
||||
.plan {
|
||||
border: 1px solid currentColor;
|
||||
border-radius: .55rem;
|
||||
}
|
||||
|
||||
.section-alt {
|
||||
background: var(--soft,#eee8f6);
|
||||
}
|
||||
|
||||
.foot {
|
||||
border-top: 1px solid #aaa0b9;
|
||||
}
|
||||
|
||||
.bottom a {
|
||||
display: inline-flex;
|
||||
min-height: 44px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.skip {
|
||||
position: absolute;
|
||||
left: 1rem;
|
||||
top: -5rem;
|
||||
z-index: 10;
|
||||
background: white;
|
||||
color: #241b35;
|
||||
padding: .7rem;
|
||||
}
|
||||
|
||||
.skip:focus {
|
||||
top: .5rem;
|
||||
}
|
||||
|
||||
.minimal {
|
||||
--accent: #543586;
|
||||
--soft: #edf0f8;
|
||||
background: #fcfcfe;
|
||||
color: #25213b;
|
||||
}
|
||||
|
||||
.minimal .hero-inner {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0,.86fr) minmax(0,1.14fr);
|
||||
gap: clamp(2rem,5vw,5rem);
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.minimal h1 {
|
||||
max-width: 10ch;
|
||||
}
|
||||
|
||||
.minimal .hero {
|
||||
border-top: 1px solid #dad6e7;
|
||||
}
|
||||
|
||||
.minimal .product {
|
||||
box-shadow: 0 28px 70px -50px #352450;
|
||||
}
|
||||
|
||||
.premium {
|
||||
--accent: #6c3da1;
|
||||
--soft: #ece5f8;
|
||||
color: #26163c;
|
||||
background: #fbf9ff;
|
||||
}
|
||||
|
||||
.premium .hero {
|
||||
background: radial-gradient(ellipse at 50% 100%,#61428c 0,#32214d 47%,#241733 78%);
|
||||
color: #fff;
|
||||
padding-bottom: 3.5rem;
|
||||
}
|
||||
|
||||
.premium .hero-copy {
|
||||
text-align: center;
|
||||
justify-items: center;
|
||||
}
|
||||
|
||||
.premium h1 {
|
||||
max-width: 13ch;
|
||||
}
|
||||
|
||||
.premium .hero .button {
|
||||
background: #f4ebff;
|
||||
color: #301b48;
|
||||
}
|
||||
|
||||
.premium .hero .secondary {
|
||||
color: white;
|
||||
background: none;
|
||||
}
|
||||
|
||||
.premium .product {
|
||||
max-width: 930px;
|
||||
margin: 2rem auto 0;
|
||||
}
|
||||
|
||||
.premium .product a {
|
||||
border: 9px solid #9073ba;
|
||||
border-radius: 1.25rem;
|
||||
}
|
||||
|
||||
.premium .feature {
|
||||
border: 1px solid #c4addd;
|
||||
border-radius: .8rem;
|
||||
padding: 1.35rem;
|
||||
}
|
||||
|
||||
.human {
|
||||
--accent: #285247;
|
||||
--soft: #e4eee6;
|
||||
color: #183a31;
|
||||
background: #fbfaf4;
|
||||
}
|
||||
|
||||
.human .mark {
|
||||
background: #285247;
|
||||
}
|
||||
|
||||
.human .hero {
|
||||
background: #e4eee6;
|
||||
}
|
||||
|
||||
.human .hero-inner {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0,.95fr) minmax(0,1.05fr);
|
||||
gap: clamp(2rem,4vw,4rem);
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.human h1 {
|
||||
font-family: Georgia,serif;
|
||||
font-weight: 700;
|
||||
letter-spacing: -.055em;
|
||||
max-width: 12ch;
|
||||
}
|
||||
|
||||
.human .art {
|
||||
border-radius: 3rem .4rem 3rem .4rem;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.human .showcase {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0,.75fr) minmax(0,1.25fr);
|
||||
gap: 2rem;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.human .feature {
|
||||
padding-inline: 0;
|
||||
}
|
||||
|
||||
.editorial {
|
||||
--accent: #183761;
|
||||
--soft: #e9eff8;
|
||||
background: #f8fafc;
|
||||
color: #183761;
|
||||
}
|
||||
|
||||
.editorial .mark {
|
||||
background: #183761;
|
||||
}
|
||||
|
||||
.editorial .hero {
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.editorial .hero-inner {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0,1.1fr) minmax(0,.9fr);
|
||||
gap: 2rem;
|
||||
border-top: 3px solid currentColor;
|
||||
padding-top: 1.5rem;
|
||||
align-items: end;
|
||||
}
|
||||
|
||||
.editorial h1 {
|
||||
font-family: Georgia,serif;
|
||||
font-size: clamp(3rem,8.2vw,9.2rem);
|
||||
font-weight: 600;
|
||||
max-width: 10ch;
|
||||
}
|
||||
|
||||
.editorial .product {
|
||||
padding-top: 1.5rem;
|
||||
border-top: 1px solid currentColor;
|
||||
}
|
||||
|
||||
.editorial .product a {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.editorial .section .wrap {
|
||||
border-top: 2px solid currentColor;
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
.editorial .grid {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
|
||||
.editorial .feature:first-child {
|
||||
grid-column: 1/-1;
|
||||
}
|
||||
|
||||
.gallery {
|
||||
padding-block: 3rem;
|
||||
}
|
||||
|
||||
.gallery h1 {
|
||||
font-size: clamp(2.5rem,5vw,5rem);
|
||||
}
|
||||
|
||||
.gallery-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2,minmax(0,1fr));
|
||||
gap: 1.5rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
.gallery-card {
|
||||
background: #fff;
|
||||
padding: 1rem;
|
||||
border: 1px solid #aaa0b9;
|
||||
border-radius: .6rem;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.gallery-card img {
|
||||
aspect-ratio: 1.6;
|
||||
object-fit: cover;
|
||||
object-position: top;
|
||||
border: 1px solid #ddd4ea;
|
||||
}
|
||||
|
||||
.gallery-card h2 {
|
||||
font-size: 1.6rem;
|
||||
margin-block: .8rem .4rem;
|
||||
}
|
||||
|
||||
.gallery-card .nav {
|
||||
gap: .9rem;
|
||||
margin-top: .5rem;
|
||||
}
|
||||
|
||||
@media(max-width:780px) {
|
||||
.wrap {
|
||||
width: calc(100% - 36px);
|
||||
}
|
||||
.minimal .hero-inner,.human .hero-inner,.human .showcase,.editorial .hero-inner {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1.6rem;
|
||||
}
|
||||
.top {
|
||||
gap: .45rem;
|
||||
padding-block: .55rem;
|
||||
}
|
||||
.nav {
|
||||
gap: .8rem;
|
||||
}
|
||||
.top .nav {
|
||||
width: 100%;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.product a {
|
||||
max-width: 380px;
|
||||
}
|
||||
.product img {
|
||||
aspect-ratio: 4/5;
|
||||
}
|
||||
.product .desktop {
|
||||
display: none;
|
||||
}
|
||||
.product .phone {
|
||||
display: block;
|
||||
}
|
||||
.premium .product a {
|
||||
margin-inline: auto;
|
||||
}
|
||||
.premium .product figcaption {
|
||||
text-align: center;
|
||||
margin-inline: auto;
|
||||
}
|
||||
.premium .hero-copy {
|
||||
text-align: left;
|
||||
justify-items: start;
|
||||
}
|
||||
.human .art {
|
||||
max-width: 580px;
|
||||
}
|
||||
.editorial .hero-inner {
|
||||
align-items: start;
|
||||
}
|
||||
.editorial .product {
|
||||
padding-top: 1rem;
|
||||
}
|
||||
.gallery-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width:520px) {
|
||||
.grid,.steps,.plans,.editorial .grid {
|
||||
grid-template-columns: 1fr;
|
||||
gap: .55rem;
|
||||
}
|
||||
.editorial .feature:first-child {
|
||||
grid-column: auto;
|
||||
}
|
||||
.top .nav {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
.review .wrap {
|
||||
padding-block: .45rem;
|
||||
}
|
||||
.actions {
|
||||
gap: .65rem;
|
||||
}
|
||||
.bottom {
|
||||
align-items: flex-start;
|
||||
}
|
||||
.gallery {
|
||||
padding-block: 2rem;
|
||||
}
|
||||
.premium .hero .product a {
|
||||
border-width: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
.review a {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 32px;
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex,nofollow">
|
||||
<title>D · Modern Editorial | Jobjakt design review</title>
|
||||
<link rel="stylesheet" href="concepts.css">
|
||||
</head>
|
||||
<body class="editorial">
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<div class="review"><div class="wrap"><span>Concept D · Modern Editorial · Design review</span><a href="index.html">Compare concepts</a></div></div>
|
||||
<header class="top wrap">
|
||||
<a class="brand" href="#main"><span class="mark" aria-hidden="true">✓</span>Jobjakt</a>
|
||||
<nav class="nav" aria-label="Main"><a href="#features">Features</a><a href="#steps">How it works</a><a href="#plans">Plans</a><a href="#registration">Sign in</a></nav>
|
||||
</header>
|
||||
<main id="main">
|
||||
<section class="hero">
|
||||
<div class="hero-inner wrap">
|
||||
<div class="hero-copy">
|
||||
<h1>Put your experience to work.</h1>
|
||||
<p class="lede">A practical workspace for the applications, CVs and career details behind your next role.</p>
|
||||
<div class="actions"><a class="button" href="#registration">Create an account</a><a class="button secondary" href="#features">Explore Jobjakt</a></div>
|
||||
</div>
|
||||
<figure class="product">
|
||||
<a class="desktop" href="assets/career-1440.png" aria-label="Open full desktop product screenshot"><img src="assets/career-1440.png" alt="Jobjakt Career Workspace with sections and an import awaiting review"></a>
|
||||
<a class="phone" href="assets/career-390.png" aria-label="Open full phone product screenshot"><img src="assets/career-390.png" alt="Jobjakt Career Workspace with sections and an import awaiting review"></a>
|
||||
<figcaption>Development screenshot with synthetic records. Select it for the full capture.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="features">
|
||||
<div class="wrap">
|
||||
<div class="stack">
|
||||
<div class="stack"><p class="eyebrow">The Jobjakt guide</p><h2>The work behind a job search.</h2></div>
|
||||
|
||||
</div>
|
||||
<div class="grid">
|
||||
<article class="feature"><h3>Track applications</h3><p>Save opportunities, review your progress and keep a record of what comes next.</p></article>
|
||||
<article class="feature"><h3>Keep career details together</h3><p>Build a Career Profile with experience you can refer to when preparing a CV.</p></article>
|
||||
<article class="feature"><h3>Prepare a CV</h3><p>Review a document in the editor before deciding what to send.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="steps">
|
||||
<div class="wrap"><h2>How it works</h2>
|
||||
<ol class="steps">
|
||||
<li><h3>Add your experience</h3><p>Start with your Career Profile and record the details you want to reuse.</p></li>
|
||||
<li><h3>Prepare your CV</h3><p>Put a document together and review it before exporting.</p></li>
|
||||
<li><h3>Keep track of applications</h3><p>Record the roles you are pursuing, the status and your next step.</p></li>
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="plans">
|
||||
<div class="wrap"><h2>Plans and pricing</h2>
|
||||
<div class="plans">
|
||||
<article class="plan"><h3>Free</h3><p>Plan layout preview. Entitlements and availability require release verification.</p></article>
|
||||
<article class="plan"><h3>Pro</h3><p>Plan layout preview. Price, billing terms and eligibility require approval.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="registration">
|
||||
<div class="wrap stack"><h2>Ready to start your next search?</h2><p>Design preview. Registration and sign-in are inactive in this mockup.</p></div>
|
||||
</section>
|
||||
</main>
|
||||
<footer class="foot"><div class="bottom wrap"><span class="brand"><span class="mark" aria-hidden="true">✓</span>Jobjakt</span><span>Privacy and terms links pending approval</span><a href="index.html">Compare concepts</a></div></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,68 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex,nofollow">
|
||||
<title>C · Friendly and Human | Jobjakt design review</title>
|
||||
<link rel="stylesheet" href="concepts.css">
|
||||
</head>
|
||||
<body class="human">
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<div class="review"><div class="wrap"><span>Concept C · Friendly and Human · Design review</span><a href="index.html">Compare concepts</a></div></div>
|
||||
<header class="top wrap">
|
||||
<a class="brand" href="#main"><span class="mark" aria-hidden="true">✓</span>Jobjakt</a>
|
||||
<nav class="nav" aria-label="Main"><a href="#features">Features</a><a href="#steps">How it works</a><a href="#plans">Plans</a><a href="#registration">Sign in</a></nav>
|
||||
</header>
|
||||
<main id="main">
|
||||
<section class="hero">
|
||||
<div class="hero-inner wrap">
|
||||
<div class="hero-copy">
|
||||
<h1>A little more room for your next chapter.</h1>
|
||||
<p class="lede">Applying to a school, clinic, workshop or somewhere entirely new? Put your experience to work with a space to organise the search.</p>
|
||||
<div class="actions"><a class="button" href="#registration">Create an account</a><a class="button secondary" href="#features">Explore Jobjakt</a></div>
|
||||
</div>
|
||||
<figure class="art"><img src="professions.svg" alt="Illustration of three people working in teaching, healthcare and electrical trades" width="720" height="525"></figure>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="features">
|
||||
<div class="wrap">
|
||||
<div class="showcase">
|
||||
<div class="stack"><p class="eyebrow">From experience to application</p><h2>Bring your experience with you.</h2></div>
|
||||
<figure class="product">
|
||||
<a class="desktop" href="assets/cv-editor-1440.png" aria-label="Open full desktop product screenshot"><img src="assets/cv-editor-1440.png" alt="Jobjakt CV Builder open on a synthetic teacher CV"></a>
|
||||
<a class="phone" href="assets/cv-editor-390.png" aria-label="Open full phone product screenshot"><img src="assets/cv-editor-390.png" alt="Jobjakt CV Builder open on a synthetic teacher CV"></a>
|
||||
<figcaption>Development screenshot with synthetic records. Select it for the full capture.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
<div class="grid">
|
||||
<article class="feature"><h3>Track applications</h3><p>Save opportunities, review your progress and keep a record of what comes next.</p></article>
|
||||
<article class="feature"><h3>Keep career details together</h3><p>Build a Career Profile with experience you can refer to when preparing a CV.</p></article>
|
||||
<article class="feature"><h3>Prepare a CV</h3><p>Review a document in the editor before deciding what to send.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="steps">
|
||||
<div class="wrap"><h2>How it works</h2>
|
||||
<ol class="steps">
|
||||
<li><h3>Add your experience</h3><p>Start with your Career Profile and record the details you want to reuse.</p></li>
|
||||
<li><h3>Prepare your CV</h3><p>Put a document together and review it before exporting.</p></li>
|
||||
<li><h3>Keep track of applications</h3><p>Record the roles you are pursuing, the status and your next step.</p></li>
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="plans">
|
||||
<div class="wrap"><h2>Plans and pricing</h2>
|
||||
<div class="plans">
|
||||
<article class="plan"><h3>Free</h3><p>Plan layout preview. Entitlements and availability require release verification.</p></article>
|
||||
<article class="plan"><h3>Pro</h3><p>Plan layout preview. Price, billing terms and eligibility require approval.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="registration">
|
||||
<div class="wrap stack"><h2>Ready to start your next search?</h2><p>Design preview. Registration and sign-in are inactive in this mockup.</p></div>
|
||||
</section>
|
||||
</main>
|
||||
<footer class="foot"><div class="bottom wrap"><span class="brand"><span class="mark" aria-hidden="true">✓</span>Jobjakt</span><span>Privacy and terms links pending approval</span><a href="index.html">Compare concepts</a></div></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,44 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex,nofollow">
|
||||
<title>Homepage concepts | Jobjakt design review</title>
|
||||
<link rel="stylesheet" href="concepts.css">
|
||||
</head>
|
||||
<body class="">
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<main id="main" class="gallery wrap">
|
||||
<h1>Homepage concepts</h1>
|
||||
<p class="lede">Compare four approaches and choose any combination of hero, navigation, typography, imagery and layout.</p>
|
||||
<p class="fine">Static design review. The product captures show synthetic development fixtures.</p>
|
||||
<div class="gallery-grid">
|
||||
<article class="gallery-card">
|
||||
<a href="minimal.html" aria-label="Open concept A: Modern Minimalist"><img src="renders/minimal-desktop.png" alt="Desktop mockup of Modern Minimalist"></a>
|
||||
<h2>A · Modern Minimalist</h2>
|
||||
<p>A split hero with clear registration and a genuine application preview.</p>
|
||||
<div class="nav"><a href="minimal.html">Responsive page</a><a href="renders/minimal-desktop.png">Full desktop</a><a href="renders/minimal-phone.png">Full phone</a></div>
|
||||
</article>
|
||||
<article class="gallery-card">
|
||||
<a href="premium.html" aria-label="Open concept B: Premium SaaS"><img src="renders/premium-desktop.png" alt="Desktop mockup of Premium SaaS"></a>
|
||||
<h2>B · Premium SaaS</h2>
|
||||
<p>A theatre-style dashboard preview below a centred violet hero.</p>
|
||||
<div class="nav"><a href="premium.html">Responsive page</a><a href="renders/premium-desktop.png">Full desktop</a><a href="renders/premium-phone.png">Full phone</a></div>
|
||||
</article>
|
||||
<article class="gallery-card">
|
||||
<a href="human.html" aria-label="Open concept C: Friendly and Human"><img src="renders/human-desktop.png" alt="Desktop mockup of Friendly and Human"></a>
|
||||
<h2>C · Friendly and Human</h2>
|
||||
<p>Illustrated professions lead into a genuine teacher CV editing example.</p>
|
||||
<div class="nav"><a href="human.html">Responsive page</a><a href="renders/human-desktop.png">Full desktop</a><a href="renders/human-phone.png">Full phone</a></div>
|
||||
</article>
|
||||
<article class="gallery-card">
|
||||
<a href="editorial.html" aria-label="Open concept D: Modern Editorial"><img src="renders/editorial-desktop.png" alt="Desktop mockup of Modern Editorial"></a>
|
||||
<h2>D · Modern Editorial</h2>
|
||||
<p>A typographic masthead and an asymmetric Career Workspace showcase.</p>
|
||||
<div class="nav"><a href="editorial.html">Responsive page</a><a href="renders/editorial-desktop.png">Full desktop</a><a href="renders/editorial-phone.png">Full phone</a></div>
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,68 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex,nofollow">
|
||||
<title>A · Modern Minimalist | Jobjakt design review</title>
|
||||
<link rel="stylesheet" href="concepts.css">
|
||||
</head>
|
||||
<body class="minimal">
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<div class="review"><div class="wrap"><span>Concept A · Modern Minimalist · Design review</span><a href="index.html">Compare concepts</a></div></div>
|
||||
<header class="top wrap">
|
||||
<a class="brand" href="#main"><span class="mark" aria-hidden="true">✓</span>Jobjakt</a>
|
||||
<nav class="nav" aria-label="Main"><a href="#features">Features</a><a href="#steps">How it works</a><a href="#plans">Plans</a><a href="#registration">Sign in</a></nav>
|
||||
</header>
|
||||
<main id="main">
|
||||
<section class="hero">
|
||||
<div class="hero-inner wrap">
|
||||
<div class="hero-copy">
|
||||
<h1>Your job search, organised.</h1>
|
||||
<p class="lede">Keep applications, career details and CVs together, so you can see what needs your attention next.</p>
|
||||
<div class="actions"><a class="button" href="#registration">Create an account</a><a class="button secondary" href="#features">Explore Jobjakt</a></div>
|
||||
</div>
|
||||
<figure class="product">
|
||||
<a class="desktop" href="assets/applications-1440.png" aria-label="Open full desktop product screenshot"><img src="assets/applications-1440.png" alt="Jobjakt application table with a saved community nurse role"></a>
|
||||
<a class="phone" href="assets/applications-390.png" aria-label="Open full phone product screenshot"><img src="assets/applications-390.png" alt="Jobjakt application table with a saved community nurse role"></a>
|
||||
<figcaption>Development screenshot with synthetic records. Select it for the full capture.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="features">
|
||||
<div class="wrap">
|
||||
<div class="stack">
|
||||
<div class="stack"><p class="eyebrow">A workspace for the whole job search</p><h2>Keep the next step in view.</h2></div>
|
||||
|
||||
</div>
|
||||
<div class="grid">
|
||||
<article class="feature"><h3>Track applications</h3><p>Save opportunities, review your progress and keep a record of what comes next.</p></article>
|
||||
<article class="feature"><h3>Keep career details together</h3><p>Build a Career Profile with experience you can refer to when preparing a CV.</p></article>
|
||||
<article class="feature"><h3>Prepare a CV</h3><p>Review a document in the editor before deciding what to send.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="steps">
|
||||
<div class="wrap"><h2>How it works</h2>
|
||||
<ol class="steps">
|
||||
<li><h3>Add your experience</h3><p>Start with your Career Profile and record the details you want to reuse.</p></li>
|
||||
<li><h3>Prepare your CV</h3><p>Put a document together and review it before exporting.</p></li>
|
||||
<li><h3>Keep track of applications</h3><p>Record the roles you are pursuing, the status and your next step.</p></li>
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="plans">
|
||||
<div class="wrap"><h2>Plans and pricing</h2>
|
||||
<div class="plans">
|
||||
<article class="plan"><h3>Free</h3><p>Plan layout preview. Entitlements and availability require release verification.</p></article>
|
||||
<article class="plan"><h3>Pro</h3><p>Plan layout preview. Price, billing terms and eligibility require approval.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="registration">
|
||||
<div class="wrap stack"><h2>Ready to start your next search?</h2><p>Design preview. Registration and sign-in are inactive in this mockup.</p></div>
|
||||
</section>
|
||||
</main>
|
||||
<footer class="foot"><div class="bottom wrap"><span class="brand"><span class="mark" aria-hidden="true">✓</span>Jobjakt</span><span>Privacy and terms links pending approval</span><a href="index.html">Compare concepts</a></div></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,68 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex,nofollow">
|
||||
<title>B · Premium SaaS | Jobjakt design review</title>
|
||||
<link rel="stylesheet" href="concepts.css">
|
||||
</head>
|
||||
<body class="premium">
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<div class="review"><div class="wrap"><span>Concept B · Premium SaaS · Design review</span><a href="index.html">Compare concepts</a></div></div>
|
||||
<header class="top wrap">
|
||||
<a class="brand" href="#main"><span class="mark" aria-hidden="true">✓</span>Jobjakt</a>
|
||||
<nav class="nav" aria-label="Main"><a href="#features">Features</a><a href="#steps">How it works</a><a href="#plans">Plans</a><a href="#registration">Sign in</a></nav>
|
||||
</header>
|
||||
<main id="main">
|
||||
<section class="hero">
|
||||
<div class="hero-inner wrap">
|
||||
<div class="hero-copy">
|
||||
<h1>Make the next move with a plan.</h1>
|
||||
<p class="lede">Save the roles you want to pursue, prepare documents and see your applications move forward.</p>
|
||||
<div class="actions"><a class="button" href="#registration">Create an account</a><a class="button secondary" href="#features">Explore Jobjakt</a></div>
|
||||
</div>
|
||||
<figure class="product">
|
||||
<a class="desktop" href="assets/dashboard-1440.png" aria-label="Open full desktop product screenshot"><img src="assets/dashboard-1440.png" alt="Jobjakt dashboard showing synthetic nursing, teaching and engineering applications"></a>
|
||||
<a class="phone" href="assets/dashboard-390.png" aria-label="Open full phone product screenshot"><img src="assets/dashboard-390.png" alt="Jobjakt dashboard showing synthetic nursing, teaching and engineering applications"></a>
|
||||
<figcaption>Development screenshot with synthetic records. Select it for the full capture.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="features">
|
||||
<div class="wrap">
|
||||
<div class="stack">
|
||||
<div class="stack"><p class="eyebrow">The workspace</p><h2>See what needs your attention.</h2></div>
|
||||
|
||||
</div>
|
||||
<div class="grid">
|
||||
<article class="feature"><h3>Track applications</h3><p>Save opportunities, review your progress and keep a record of what comes next.</p></article>
|
||||
<article class="feature"><h3>Keep career details together</h3><p>Build a Career Profile with experience you can refer to when preparing a CV.</p></article>
|
||||
<article class="feature"><h3>Prepare a CV</h3><p>Review a document in the editor before deciding what to send.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="steps">
|
||||
<div class="wrap"><h2>How it works</h2>
|
||||
<ol class="steps">
|
||||
<li><h3>Add your experience</h3><p>Start with your Career Profile and record the details you want to reuse.</p></li>
|
||||
<li><h3>Prepare your CV</h3><p>Put a document together and review it before exporting.</p></li>
|
||||
<li><h3>Keep track of applications</h3><p>Record the roles you are pursuing, the status and your next step.</p></li>
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section" id="plans">
|
||||
<div class="wrap"><h2>Plans and pricing</h2>
|
||||
<div class="plans">
|
||||
<article class="plan"><h3>Free</h3><p>Plan layout preview. Entitlements and availability require release verification.</p></article>
|
||||
<article class="plan"><h3>Pro</h3><p>Plan layout preview. Price, billing terms and eligibility require approval.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section section-alt" id="registration">
|
||||
<div class="wrap stack"><h2>Ready to start your next search?</h2><p>Design preview. Registration and sign-in are inactive in this mockup.</p></div>
|
||||
</section>
|
||||
</main>
|
||||
<footer class="foot"><div class="bottom wrap"><span class="brand"><span class="mark" aria-hidden="true">✓</span>Jobjakt</span><span>Privacy and terms links pending approval</span><a href="index.html">Compare concepts</a></div></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,40 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 525">
|
||||
<rect width="720" height="525" fill="#d3e2d7"/>
|
||||
<path d="M0 340C115 300 200 364 327 337S550 276 720 324V525H0Z" fill="#b3cebf"/>
|
||||
<circle cx="572" cy="121" r="71" fill="#f6db97"/>
|
||||
<path d="M40 102h157v105H40z" fill="#48776b" stroke="#f2f1e6" stroke-width="8"/>
|
||||
<path d="M60 129h104m-104 24h81m-81 24h38" stroke="#f2f1e6" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M478 114h114v126H478z" fill="none" stroke="#eef4ed" stroke-width="4"/>
|
||||
<path d="M494 145h28v-24h20v24h28v19h-28v25h-20v-25h-28z" fill="#eef4ed"/>
|
||||
<path d="M647 195l-23 42h18l-8 29 32-43h-21l13-28z" fill="#36595a"/>
|
||||
<ellipse cx="357" cy="467" rx="312" ry="29" fill="#91b7a5"/>
|
||||
<!-- Teacher, with an open book. -->
|
||||
<path d="M67 458l15-94c8-48 31-76 63-83l64 1c35 9 59 38 66 84l13 92z" fill="#bb674f"/>
|
||||
<path d="M158 262h43v50c-13 14-31 14-43 0z" fill="#a65d48"/>
|
||||
<path d="M125 218c0-41 22-68 55-68 36 0 60 32 58 68l-11 52c-12 21-29 33-48 33-31 0-53-24-54-57z" fill="#c87e5a"/>
|
||||
<path d="M121 225c-18-44 8-85 56-88 38-3 66 22 65 64-28 2-53-12-68-32-10 22-29 35-53 37z" fill="#392638"/>
|
||||
<path d="M116 370l61 21 67-21-6 72-61 22-58-21z" fill="#f7e4ab"/>
|
||||
<path d="M177 391v73m-45-59 32 11m23-1 42-12" stroke="#aa8551" stroke-width="3"/>
|
||||
<!-- Nurse, with scrubs and badge. -->
|
||||
<path d="M240 461l20-103c11-50 36-82 76-91l65 1c44 9 74 41 82 90l15 103z" fill="#4a72a4"/>
|
||||
<path d="M337 248h49v52l-24 36-25-36z" fill="#855042"/>
|
||||
<path d="M302 205c0-39 25-65 60-65 36 0 62 27 61 65l-7 44c-12 30-31 44-55 44-27 0-47-17-56-44z" fill="#a86854"/>
|
||||
<path d="M298 219c-17-57 15-94 62-94 47 0 74 28 67 73-26-6-45-19-58-41-19 24-42 36-71 41z" fill="#282c3b"/>
|
||||
<path d="M324 276l38 52 38-52" fill="none" stroke="#e6ecf7" stroke-width="5" stroke-linecap="round"/>
|
||||
<rect x="385" y="353" width="45" height="30" rx="5" fill="#f4f0e0"/>
|
||||
<path d="M396 367h23" stroke="#4a72a4" stroke-width="3" stroke-linecap="round"/>
|
||||
<!-- Tradesperson, with a work jacket and hard hat. -->
|
||||
<path d="M441 460l13-91c10-52 35-81 73-90l64 1c36 8 66 38 75 89l13 91z" fill="#36595a"/>
|
||||
<path d="M536 262h48v51l-25 21-23-21z" fill="#b77957"/>
|
||||
<path d="M503 222c0-36 25-65 57-65 33 0 59 29 59 65l-6 38c-12 28-28 41-54 41-24 0-44-15-54-41z" fill="#d39873"/>
|
||||
<path d="M500 211c-2-40 21-65 60-65 37 0 62 26 61 65z" fill="#e9b85c"/>
|
||||
<path d="M489 213h143m-72-65v51" stroke="#9d6d34" stroke-width="5" stroke-linecap="round"/>
|
||||
<path d="M514 311l-20 151m105-151 25 151" stroke="#e8bd6e" stroke-width="15"/>
|
||||
<path d="M554 356h12l-8 17h12l-21 25 7-20h-12z" fill="#f6db97"/>
|
||||
<g fill="#30283a">
|
||||
<circle cx="162" cy="229" r="3.2"/><circle cx="204" cy="229" r="3.2"/>
|
||||
<circle cx="341" cy="219" r="3.2"/><circle cx="381" cy="219" r="3.2"/>
|
||||
<circle cx="539" cy="231" r="3.2"/><circle cx="580" cy="231" r="3.2"/>
|
||||
</g>
|
||||
<path d="M175 251q8 6 17 0m162-8q8 6 17 0m181 12q8 6 17 0" fill="none" stroke="#663d42" stroke-width="3" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"checks": [
|
||||
{
|
||||
"page": "minimal",
|
||||
"width": 1440,
|
||||
"height": 1000,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "minimal",
|
||||
"width": 768,
|
||||
"height": 1024,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "minimal",
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "minimal",
|
||||
"width": 320,
|
||||
"height": 720,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "premium",
|
||||
"width": 1440,
|
||||
"height": 1000,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "premium",
|
||||
"width": 768,
|
||||
"height": 1024,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "premium",
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "premium",
|
||||
"width": 320,
|
||||
"height": 720,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "human",
|
||||
"width": 1440,
|
||||
"height": 1000,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "human",
|
||||
"width": 768,
|
||||
"height": 1024,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "human",
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "human",
|
||||
"width": 320,
|
||||
"height": 720,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "editorial",
|
||||
"width": 1440,
|
||||
"height": 1000,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "editorial",
|
||||
"width": 768,
|
||||
"height": 1024,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "editorial",
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "editorial",
|
||||
"width": 320,
|
||||
"height": 720,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "index",
|
||||
"width": 1440,
|
||||
"height": 1000,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "index",
|
||||
"width": 768,
|
||||
"height": 1024,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "index",
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
},
|
||||
{
|
||||
"page": "index",
|
||||
"width": 320,
|
||||
"height": 720,
|
||||
"passed": true,
|
||||
"axeViolations": []
|
||||
}
|
||||
],
|
||||
"externalRequests": [],
|
||||
"device": "Chromium desktop emulation"
|
||||
}
|
||||
|
After Width: | Height: | Size: 185 KiB |
|
After Width: | Height: | Size: 134 KiB |