Compare commits

...

27 Commits

Author SHA1 Message Date
cesnimda 027907a806 docs(ui): record discovery acceptance and CV progression 2026-11-03 10:24:30 +01:00
cesnimda c9c6b1abc1 feat(ui): add A3 discovery filter rail and results layout 2026-11-03 10:22:19 +01:00
cesnimda 172074e90f docs(ui): record application publication and review gate 2026-11-03 10:05:53 +01:00
cesnimda 98e9502af5 feat(ui): modernise application tracking and right context 2026-11-03 10:04:00 +01:00
cesnimda dc93b589c9 docs(ui): record dashboard publication and review gate 2026-11-03 09:47:47 +01:00
cesnimda c7d26d354c feat(ui): add A1 dashboard and resumable onboarding 2026-11-03 09:45:57 +01:00
cesnimda 5e8a07d13e fix(i18n): localise mobile build revision metadata 2026-11-03 08:57:02 +01:00
cesnimda 992608c77f feat(ui): implement approved A3 hybrid navigation 2026-11-03 08:47:19 +01:00
cesnimda 0d6de71403 docs(ui): record verified A3 foundation checkpoint and review gate 2026-11-03 03:09:20 +01:00
cesnimda bdd1de0dd3 feat(ui): apply approved A3 shared design foundation 2026-11-03 03:08:13 +01:00
cesnimda d3d3383764 fix(i18n): identify Bokmål accurately in supported-language controls 2026-11-02 23:24:15 +01:00
cesnimda 1756273bc1 test(i18n): enforce catalogue key placeholder and nonblank parity 2026-11-02 23:20:25 +01:00
cesnimda 557efde073 feat(roadmap): integrate validated cleanup localisation and backup fixes 2026-11-02 23:15:05 +01:00
cesnimda db818e5ebd test(phase10): preserve relational attachment ownership and storage evidence 2026-11-02 23:06:09 +01:00
cesnimda 4840870f0c docs(roadmap): save tested i18n fixes and rendered concept review checkpoint 2026-11-02 22:27:50 +01:00
cesnimda 6f29ed4cdb docs(phase10): reconcile acceptance evidence and open qualification gaps 2026-11-02 22:15:59 +01:00
cesnimda 2a4acc179e docs(roadmap): preserve security and translation continuation receipts 2026-11-02 22:05:55 +01:00
cesnimda ba826de1e5 test(phase10): preserve 92 frontend document workflow results 2026-11-02 22:01:13 +01:00
cesnimda 525b5fe4d7 test(phase10): record 89 document and data compatibility checks 2026-11-02 21:59:47 +01:00
cesnimda 9a4b282f0a docs(roadmap): record published i18n fix and remaining qualifications 2026-11-02 21:54:42 +01:00
cesnimda 927f909b0d docs(phase10): record publication and retained compatibility reviews 2026-11-02 21:45:56 +01:00
cesnimda 78f7396adb chore(phase10): remove approved unused CRA stylesheet 2026-11-02 21:44:05 +01:00
cesnimda 36a355ea54 docs(roadmap): add recovery and localisation findings 2026-11-02 11:42:02 +01:00
cesnimda c2ef6320e3 docs(roadmap): record verified publication and partial research checkpoints 2026-11-02 06:09:44 +01:00
cesnimda 1692142295 docs(phase10): record continuation and repeated publication blocker 2026-11-02 01:16:25 +01:00
cesnimda 8cdff28f07 docs(phase10): record blocked checkpoint publication 2026-11-02 01:02:03 +01:00
cesnimda 7ba1367fd2 docs(phase10): complete direct P10-00 assessment 2026-11-02 01:00:58 +01:00
401 changed files with 76067 additions and 176 deletions
@@ -28,6 +28,18 @@ public sealed class DashboardPreferencesTests
private const string Route = "/api/auth/preferences/dashboard";
private const string Layout = "{\"version\":1,\"revision\":0,\"widgets\":[{\"id\":\"cards\",\"visible\":true,\"size\":\"full\"}]}";
[Fact]
public void Agenda_widget_uses_existing_schema_two_without_weakening_unknown_id_or_overlap_checks()
{
const string json = "{\"version\":2,\"revision\":0,\"widgets\":[{\"id\":\"agenda\",\"visible\":true,\"size\":\"standard\",\"x\":0,\"y\":0,\"w\":8,\"h\":8},{\"id\":\"funnel\",\"visible\":true,\"size\":\"standard\",\"x\":8,\"y\":0,\"w\":4,\"h\":8}]}";
using var valid = JsonDocument.Parse(json);
Assert.NotNull(DashboardLayout.Parse(valid.RootElement));
using var unknown = JsonDocument.Parse(json.Replace("agenda", "unrecognised"));
Assert.Null(DashboardLayout.Parse(unknown.RootElement));
using var overlap = JsonDocument.Parse(json.Replace("\"x\":8", "\"x\":4"));
Assert.Null(DashboardLayout.Parse(overlap.RootElement));
}
[Fact]
public async Task Geometry_roundtrip_preserves_hidden_positions_and_blocks_legacy_downgrade()
{
+1 -1
View File
@@ -15,7 +15,7 @@ public sealed record DashboardLayout(int Version, long Revision, IReadOnlyList<D
// Responses cross a JavaScript client; the incremented revision must remain an exact integer there.
private const long MaxRevision = 9_007_199_254_740_991L;
private static readonly HashSet<string> KnownIds = new(StringComparer.Ordinal)
{ "cards", "attention", "funnel", "activity", "stageAge", "sources", "salary", "companies", "skills" };
{ "cards", "attention", "agenda", "funnel", "activity", "stageAge", "sources", "salary", "companies", "skills" };
public static DashboardLayout? Parse(JsonElement root, bool reading = false, long revision = 0)
{
+4
View File
@@ -3,3 +3,7 @@
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.
+11 -11
View File
@@ -326,19 +326,19 @@ backup_database() {
return 1
fi
# 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."
# 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."
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}"
+95
View File
@@ -0,0 +1,95 @@
# 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.
+21
View File
@@ -0,0 +1,21 @@
# 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.
+33
View File
@@ -0,0 +1,33 @@
# 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.
+20
View File
@@ -0,0 +1,20 @@
# 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.
@@ -0,0 +1,27 @@
# 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.
+34
View File
@@ -0,0 +1,34 @@
# 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.
+12
View File
@@ -0,0 +1,12 @@
# 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.
+16
View File
@@ -0,0 +1,16 @@
# 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.
+25
View File
@@ -0,0 +1,25 @@
# 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).
+33
View File
@@ -0,0 +1,33 @@
# 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.
+26
View File
@@ -0,0 +1,26 @@
# 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.
+19
View File
@@ -0,0 +1,19 @@
# 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.
+31
View File
@@ -0,0 +1,31 @@
# 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.
+47
View File
@@ -0,0 +1,47 @@
{
"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"
}
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,87 @@
# 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.
@@ -0,0 +1,319 @@
{
"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."
}
]
}
+19
View File
@@ -0,0 +1,19 @@
# 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.
+31
View File
@@ -0,0 +1,31 @@
# 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.
+846
View File
@@ -0,0 +1,846 @@
{
"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"
}
}
]
}
+81
View File
@@ -0,0 +1,81 @@
{
"$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"
}
}
}
}
}
}
}
}
File diff suppressed because it is too large Load Diff
+20
View File
@@ -0,0 +1,20 @@
# 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.
+22
View File
@@ -0,0 +1,22 @@
# 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.
+18
View File
@@ -0,0 +1,18 @@
# 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.
+20
View File
@@ -0,0 +1,20 @@
# 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.
+12
View File
@@ -0,0 +1,12 @@
# 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.
@@ -0,0 +1,13 @@
# 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.
+13
View File
@@ -0,0 +1,13 @@
# Current localisation continuation
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.
+13
View File
@@ -0,0 +1,13 @@
# 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.
+917
View File
@@ -0,0 +1,917 @@
{
"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"
}
+9
View File
@@ -0,0 +1,9 @@
# 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.
+13
View File
@@ -0,0 +1,13 @@
# 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.
+29
View File
@@ -0,0 +1,29 @@
# 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.
+7
View File
@@ -0,0 +1,7 @@
# 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.
+11
View File
@@ -0,0 +1,11 @@
# 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.
+11
View File
@@ -0,0 +1,11 @@
# 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.
+11
View File
@@ -0,0 +1,11 @@
# 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.
+11
View File
@@ -0,0 +1,11 @@
# 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.
+11
View File
@@ -0,0 +1,11 @@
# 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.
+13
View File
@@ -0,0 +1,13 @@
# 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.
@@ -0,0 +1,10 @@
# 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.
+11
View File
@@ -0,0 +1,11 @@
# 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.
+15
View File
@@ -0,0 +1,15 @@
# 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).
@@ -0,0 +1,24 @@
{
"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"
]
}
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
+51
View File
@@ -0,0 +1,51 @@
# Direct-roadmap continuity
## Latest checkpoint — CLEAN-20 explicitly approved and verified
**Published and independently verified:** `78f7396adb2f1d3452c10e60bc0dbbd3a4a602e4` on `origin/feature/phase10-cleanup`; normal push exit 0 and subsequent ls-remote exact match. Graphify AST update completed locally (18,532 nodes / 46,020 edges); generated graph remains untracked. P10-02 and P10-03 now record bounded compatibility/backend retain dispositions, with no further removal candidate proven. P10-04/05 and independent audit are still incomplete.
Owner replied **"Approve CLEAN-20 only"** in this chat. This supersedes historical approval-pending statements below, without authorising any other deletion. [P10-01](P10-01.md) records the exact one-file removal, fresh typecheck/lint/build and 5/5 browser results, preserved 34 routes/57 groups, and 1,279 unchanged source files. Publication receipt follows in the next checkpoint. No final Phase 10 or production acceptance implied. Resume with this latest section, not the superseded controller/publication history below.
2 November 2026. Worktree: `C:\Users\Connor\.codex\worktrees\p10-assessment\Job tracker`. Branch: `feature/phase10-cleanup`. Initial HEAD: `fc5b9d377199ce51f480a920a3772108094929e3`; reported handoff `5cb903b989742b7a96cb22ddf4c0e24993b18980` is an ancestor and matched its original branch's live remote readback. Frozen application source remains `ba04d817fed26d659bfa2a56b089d6cac851dc34`.
## Completed and current gate
**Latest authority, 2 November 2026:** the owner's Continuous Progress Addendum explicitly retains precise P10-01 approval as outstanding, superseding the earlier interpretation of “continue” below. P10-01 is AWAITING_APPROVAL. Git publication is now resolved: normal push succeeded and independent remote readback matched `1692142295950e390a4cf807d9df86cc5cf96290`. Earlier failed attempts remain historical. Continue explicitly eligible independent planning under [the direct-roadmap register](../../direct-roadmap/ROADMAP_STATUS.md); do not use the former blanket conclusion that every later planning task is blocked. The I18N-00 source explicitly permits an audit while earlier gates remain blocked.
Continuation, 2 November 2026: the owner instructed “continue as far as you can” in response to the specific CLEAN-20 proposal. This is taken as permission to continue that nominated scope, not approval of additional candidates or later initiatives. Implementation still cannot begin across the mandatory publication gate. A normal push of clean local `8cdff28f0781e4c99efd06079149d9933e01cd4e` was retried once and again failed with the same remote SIGSEGV/pre-receive rejection. Independent remote readback again returned only the original handoff branch at `5cb903b`; the Phase 10 ref is absent. No server repair or hook bypass was attempted. The approval-pending statements below describe the preceding checkpoint; this continuation supplies the latest chat instruction, while publication remains BLOCKED.
Dependency disposition: P10-01 waits for required publication; P10-02–05 wait for their preceding checkpoints and applicable candidate decisions; PRODUCT-REVIEW-01 waits for accepted Phase 10; Global Jobs, I18N, Launch Site, Security Audit and Release Readiness wait for their ordered predecessors and entry gates. None is an independent next item that can be started by skipping this failure. The remaining external action is operator resolution of the Git-server hook fault, followed by normal push and exact remote verification. Preserve local work and stop at this boundary.
- Completed [P10-00](P10-00.md); preserved the existing staged worker draft with a dated review note. Only Markdown changed.
- Fresh checks: 263 indexed evidence hashes, 1,280 current frozen source files and 7 verifier-source entries all match; 57 groups retain 56 PARTIAL/C11 DEFERRED; 34 distinct routes match the preserved register. Product suites were NOT RUN. Historical results remain historical.
- Sole proposed candidate: **P10-01/CLEAN-20**, delete the unimported original CRA `job-tracker-ui/src/App.css`, blob `74b5e053450a48a6bdb4d71aad648e7af821975c`. Exact callers/data/routes, required checks, rollback and stop conditions are in P10-00. All other assessed compatibility code remains retained.
- **Await explicit candidate-specific owner approval in this chat and successful required publication. No implementation is authorised yet.** Do not treat approval of this stylesheet as permission for P10-02 or another initiative.
- Assessment checkpoint: **`7ba1367fd2e84375b3065eeedf9176a34996f77b`**, `docs(phase10): complete direct P10-00 assessment`. Four Markdown files, 258 inserted lines including the preserved staged draft. Documentation links, original-draft preservation, candidate hash and no-product-change assertions passed; staged `git diff --check` passed. Working tree was clean after that commit.
- **Publication FAILED / advancement BLOCKED.** Normal `rtk proxy git push -u origin feature/phase10-cleanup` exited 1: remote `fatal error: fault`, `SIGSEGV`, `github.com/go-enry/go-enry/v2/data.map.init.6()`; final result `pre-receive hook declined`. Independent subsequent `git ls-remote origin refs/heads/feature/phase10-cleanup refs/heads/test/pre-phase10-ux-acceptance` returned only `5cb903b989742b7a96cb22ddf4c0e24993b18980` for the handoff branch. No Phase 10 branch was published. No infrastructure repair, hook bypass or force push was attempted.
- The documentation-only commit containing this publication receipt is also local; resolve its exact SHA with `git rev-parse HEAD`. It changes no product source. Do not describe either local checkpoint as remotely verified.
After the Git-server operator resolves the hook fault independently, normal publication and exact remote readback remain required. Do not retry indefinitely or repair the server in this task. Owner approval of CLEAN-20 can be recorded while publication is blocked, but implementation must wait until both gates are satisfied. Assessment content completion is not published checkpoint acceptance.
## Resume without repeating the assessment
Read any newer owner reply and this handoff. Inspect current Git state and the candidate/source identity. Reuse the source-bound accepted evidence if unchanged. If CLEAN-20 is approved, perform only its documented patch/verification/publication, updating evidence and this handoff. Do not reinstall/retest unchanged product scope merely to restart this chat. Significant or affected changes require fresh applicable checks. Missing dependencies/graph/build/runtime prerequisites must be reported accurately, without modifying another worktree or inventing results.
No autonomous controller commands or state, keys, signatures, approvals, configuration or queue may be used, repaired or changed. It must remain paused. Do not modify `C:\Users\Connor\.codex\worktrees\pre-p10-ux\Job tracker`. No main merge, production deployment, production services, application AI models or deferred CV-import overhaul/personal portfolio work is authorised.
## Authoritative order after Phase 10 acceptance
All seven source files exist; their bytes were fingerprinted during P10-00. Only the active Phase 10 source was read as execution requirements here. Before entering each later workstream, read its complete source and every required linked/subordinate prompt, recheck dependencies and obtain its applicable entry decisions. Do not substitute this order table or old orchestrator records for those requirements.
| Order | Workstream / source below `E:\Storage\Projects\Active\temp docs\final\` | Source SHA256 observed |
| --- | --- | --- |
| 1 | PHASE-10: `Prompt 5 — Phase 10.txt` | `f3d5d183a1cd653aac2207a8435ba95fbb74ef4bb8cc91d605edd959f9f4ec72` |
| 2 | PRODUCT-REVIEW-01: `Prompt 6 — PRODUCT-REVIEW-01.txt` | `544d11a2d1e9a913397766c7e475f63338f0b735d2bb26dcabdedb6fe9e25a58` |
| 3 | INT-GLOBAL-JOBS-01: `done\Prompt 7 — INT-GLOBAL-JOBS-01.txt` | `c67c70862eecf677e1f2944fd0e17799068c054738d520513955fcf6542c52ce` |
| 4 | I18N-01: `I18N\00_MASTER_ORCHESTRATOR.md`, including its entire linked prompt pack | `6365901a0521d603f8059de31492bc6353229c684da23b8553df49b4844fd330` |
| 5 | LAUNCH-SITE-01: `Prompt 10 - homepage.txt` | `f1d2b143796725e37b9a86643975a716f0be2109687fc772c6e26dae5172eaa0` |
| 6 | SECURITY-AUDIT-01: `jobjakt-security\MASTER_PROMPT.md`, including its entire linked prompt pack | `37bec461f84df60b787bda45db3bd9af1a6c836c6c023f3ab6dd7dc4beb2c6db` |
| 7 | RELEASE-READINESS-01: `prompt 11 - release readiness.txt` | `12c846d754b170c2e767db05816f4053d9e8c4cf58a2349121b2de91875beaf2` |
Phase 10 checkpoints remain P10-00 baseline, P10-01 frontend, P10-02 CV/document compatibility, P10-03 backend/dependencies/config, P10-04 data/functional verification, P10-05 full acceptance. Subsequent scopes require evidence and the applicable candidate gates. If nothing is safely removable, say so; never invent a deletion to complete a checkpoint.
Human/device/language/printing, AI semantics, provider licences, hosted CI, security and production decisions remain separate. SQLite retirement stays a separately gated initiative. Production NO-GO does not prohibit an otherwise authorised bounded assessment.
+122
View File
@@ -0,0 +1,122 @@
# P10-00 — Direct assessment and deletion eligibility
**Subsequent implementation:** owner explicitly approved CLEAN-20 only. The approved candidate has now passed its required checks; see [P10-01](P10-01.md). Approval-pending descriptions below are retained as assessment history, not the latest state.
2 November 2026, Europe/Paris. **Assessment complete and published; P10-01 awaits candidate-specific owner approval.** Normal publication subsequently succeeded at `1692142295950e390a4cf807d9df86cc5cf96290`, independently read back from the remote. The Continuous Progress Addendum explicitly retains the owner gate. No application/test/dependency/schema change or deletion was performed. One narrowly bounded frontend stylesheet is nominated below; the other assessed areas remain retained. Phase 10 completion and post-redesign product-review acceptance are not established. Production remains NO-GO.
## Authority, baseline and draft review
The owner's direct-chat instruction authorises repository inspection and Markdown assessment only, then requires a stop for approval of the exact P10-01 scope. It explicitly prohibits using, repairing or activating the autonomous backlog orchestrator. Its old adapter, policy, signing and queue requirements describe autonomous execution; they are not prerequisites for this separately authorised direct assessment. No controller command, key, receipt, configuration or queue was accessed or changed. Future source-defined product, security, provider and human gates remain mandatory in their applicable scopes.
Read the complete external `Prompt 5 — Phase 10.txt`, including its prerequisites, fifteen inventory categories, checkpoint order and acceptance requirements, and the original [implementation plan](../IMPLEMENTATION_PLAN.md#phase-10--cleanup). External source SHA256: `f3d5d183a1cd653aac2207a8435ba95fbb74ef4bb8cc91d605edd959f9f4ec72`. [AGENTS.md](../../../AGENTS.md), its RTK instructions, the [current architecture pointer](../../architecture/current.md), [overview](../../architecture/overview.md) and linked frontend/backend/data/integration/schema/deployment descriptions govern ownership.
| Identity | Fresh observation |
| --- | --- |
| Worktree | `C:\Users\Connor\.codex\worktrees\p10-assessment\Job tracker` |
| Branch / initial HEAD | `feature/phase10-cleanup` / `fc5b9d377199ce51f480a920a3772108094929e3` |
| Initial changes | Only staged `docs/automation/stages/PHASE-10/P10-00.md`, 93 lines; no unstaged or unrelated files |
| Reported handoff | `5cb903b989742b7a96cb22ddf4c0e24993b18980`, verified ancestor of initial HEAD |
| Remote handoff readback | `git ls-remote origin refs/heads/test/pre-phase10-ux-acceptance` returned exactly `5cb903b989742b7a96cb22ddf4c0e24993b18980`; the Phase 10 branch did not yet exist remotely |
| Frozen tested application | `ba04d817fed26d659bfa2a56b089d6cac851dc34`, ancestor of HEAD; all subsequent committed differences are inside `docs/automation/handoffs/pre-phase10/` |
| Final assessment/publication identities | Recorded in [HANDOFF.md](HANDOFF.md); resolve current branch HEAD, never infer publication from an older readback |
Reviewed and preserved the [existing draft](../../automation/stages/PHASE-10/P10-00.md). Original staged content SHA256 was `55afecbcb09d91762fdddb2670c409566bf58f9fce6c2a705627e9fcfb8e10d0` (16,809 bytes). Only a dated review notice is added; its original text remains intact. Its positive active-consumer findings are useful. Its supplied manifest identity, asserted verified owner/controller decisions, Git-access failure, required controller canaries and prohibition on worker commits are historical context, not independently verified facts or direct-chat requirements. Its no-candidate conclusion is superseded only by the additional stylesheet investigation below. A worker's completion statement does not establish acceptance.
Graphify query was attempted before source searches. It failed because this worktree has no `graphify-out/graph.json`; no graph was created and no other worktree's graph was used as current proof. Source inspection used RTK-wrapped `rg`, Git, bounded file reads and assert-based integrity checks. No dependency installation or infrastructure repair occurred.
## Accepted evidence and its applicability
Reviewed the [Pre-Phase-10 acceptance](../../pre-phase10-ux/ACCEPTANCE.md), [CV-QA handoff](../../pre-phase10-ux/CV_QA_HANDOFF.md), [integration QA acceptance](../../cv-integration-qa/ACCEPTANCE.md) and [Phase 10 handoff](../../cv-integration-qa/PHASE_10_HANDOFF.md), [CV-UX acceptance](../../cv-redesign/ACCEPTANCE.md) and [compatibility handoff](../../cv-redesign/CV_IMPORT_HANDOFF.md), [CV-import acceptance](../../cv-import/ACCEPTANCE.md), and [Phase 9 security/requalification addendum](../phase-9/p9-sec-02/ACCEPTANCE_ADDENDUM_2026-10-25.md). Their conditional development decisions remain limited to their stated scope.
The later [final development-entry review](../../automation/handoffs/pre-phase10/FINAL_DEVELOPMENT_ENTRY.md), [authority reconciliation](../../automation/handoffs/pre-phase10/AUTHORITY.md), [baseline](../../automation/handoffs/pre-phase10/PHASE10_BASELINE.md), [handoff](../../automation/handoffs/pre-phase10/HANDOFF.md), [reproduction contract](../../automation/handoffs/pre-phase10/REPRODUCE.md), [ready-to-run conditions](../../automation/handoffs/pre-phase10/READY_TO_RUN.md) and current acceptance/evidence index distinguish historical statements from later decisions. Read the linked [PDF report](../../p10-entry-final/REPORT.md), review guide, owner-review requirements and [S01 disposition](../../automation/handoffs/pre-phase10/S01_APPROVAL.md). The 30 October owner metric/visual records supersede earlier metric/visual-pending statements only for their approved development scope. Physical printing/device/AT/language checks are still unperformed. No accepted PDF criterion was reopened or changed.
Fresh checks against the current worktree:
| Check | Result / exact boundary |
| --- | --- |
| Indexed compressed evidence hashes | **PASSED: 263/263** SHA256 values match `TEST_EVIDENCE.json`; this does not rerun their producers |
| Application source-before/source-after manifests | **PASSED: identical**, with **1,280/1,280** current file hashes matching; zero mismatches |
| Handoff verifier-source identity | **PASSED: 7/7**, both worktree bytes and the committed `39bf430401d86f894277fdd78e7eb88c58d81e8b` objects match the indexed manifest |
| Preservation classification | **PASSED membership check: 57 unique groups**, retaining **56 PARTIAL / C11 DEFERRED**; no promotion to PASS |
| Route census | **PASSED: 34 distinct application routes**, exactly the original 33 plus `/admin/processing`; outer/shell wildcard infrastructure and duplicate `/` are not extra capabilities |
| Product suites, typecheck, lint, build, browser and visual runs | **NOT RUN in P10-00**; assessment changed Markdown only |
| Full package semantic/schema/native-membership verifier | **NOT RUN**; its entry contract requires the original handoff branch and restricts all descendants to the handoff directory. No verifier was changed or bypassed to make this direct assessment appear accepted |
The hash/source checks support reuse, not a new full regression or independent security attestation. The historical package retains 1,448 backend / 1,031 frontend cases, 51 affected Windows browser cases, separate import 8 / MariaDB 90+3 / RD21 6 / admission 1 / Linux 8, Python 83 offline +14 real Docling, and native exports with their actual source/runtime/process identities. These lanes are not added into one total. Older broad browser evidence remains historical. The approved S01 36/36 per platform re-evaluated existing documents; original Windows 28/Linux 20 failures are preserved. No new PDF was generated.
## Inventory and retained compatibility
The [nineteen-entry inventory](../../automation/handoffs/pre-phase10/CLEANUP_INVENTORY.md) and preserved draft remain the detailed retain register, including historical purpose, consumers, preservation IDs, proposed tests and risks. The table below reconciles every external inventory category and records the additional concrete candidate. An active consumer defeats deletion eligibility; no exhaustive repository-wide absence claim is made for the retained areas.
| Required category | Current evidence / disposition |
| --- | --- |
| Old page components | CLEAN-01/08: `App.tsx:61,67,441,446` lazy-loads the current CV editor and admin processing page. **Retain**; names/age do not establish supersession |
| Superseded layouts | CLEAN-06/07: `DashboardView.tsx:20–22,333,367` uses layout state, editor and grid together. **Retain** show/hide/save/reset/conflict/navigation and persisted schema-2 geometry |
| Old CV Editor implementations | CLEAN-01/03: builder routes and gallery/customisation consumers remain active. **Retain** blank/inherit, history, undo, settings and entitlements |
| Obsolete CV Import screens | CLEAN-04/05: `CareerProfilePage.tsx:410,447,868` separates old-run review/accept from Docling review; `ProfileCvController.cs:270` still exposes the paired accept action. **Retain** both paths |
| Unused document components | CLEAN-02/10/12: thumbnail is imported/rendered by gallery and library; renderer design-version branches and `ApplicationAssetsService` revision-aware writers remain active. **Retain** |
| Duplicated styling | CLEAN-16: app MUI styling, fixed document CSS, sandboxed previews and RGL CSS have distinct consumers. No duplicate consolidation is proven. **Retain** |
| Unused design tokens | CLEAN-16: `ThemeProvider.tsx` uses `CssBaseline`/`getTheme`; no unused-token proof. **Retain** |
| Dead hooks/utilities | CLEAN-07/19: dashboard layout hook is imported; duplicate reminder-read optimisation remains unmeasured. **Retain**, no performance change nominated |
| Unused frontend routes | CLEAN-09: all 34 remain registered; `/kanban`, `/correspondence/review`, `/applications/:id` retain explicit redirect behavior. **Retain** bookmarks, query/hash/state and owner boundaries |
| Unreferenced API endpoints | CLEAN-05/11/12: paired legacy accept UI/API, canonical mapper and revision-aware document service remain. External-consumer absence is unproved. **Retain** endpoints/services/DTOs/mappings |
| Obsolete feature flags | CLEAN-15: `cv_import_ai.py:20` reads `CV_IMPORT_AI_ENABLED`, default false; accepted optional adapter is disabled/disconnected. Withholding is not obsolescence. **Retain disabled** |
| Unused dependencies | CLEAN-13/14/17: RGL JS/CSS imports at `DashboardGrid.tsx:4,7–8`; existing provider/parser/runtime/tooling consumers remain. No package removal nominated; runtime/test/scripts/Docker/platform census would be required for one |
| Old localisation keys | CLEAN-16: `I18nProvider.tsx:67` indexes `translations[language][key]` with fallback. Dynamic-key absence is unproved. **Retain** EN/Bokmål catalogues |
| Deprecated test fixtures | CLEAN-18: Jest roots/transform and Playwright `testDir` remain configured; historical PDF/old-run/provider/revision fixtures are acceptance consumers. No fixture is nominated |
| Dead asset references | CLEAN-16/18: layout references favicons/manifest; manifest references both logo sizes; landing page references all three mockups. **Retain** those assets. Additional unreferenced stylesheet candidate CLEAN-20 below |
### CLEAN-20 — Original CRA `job-tracker-ui/src/App.css`
**Nominate for P10-01 only; do not remove during assessment.** Historical purpose: initial Create React App demonstration styling, present since `2e8a29b` (first commit). Contents: `.App`, `.App-logo`, `.App-header`, `.App-link`, reduced-motion-aware logo animation and `App-logo-spin`; 38 lines / 602 current worktree bytes. Git blob: `74b5e053450a48a6bdb4d71aad648e7af821975c`. Worktree SHA256: `61f6c43a638172676cd2813c94dc4db88f6cf73faec19d0cd116b1ff19e46efc`.
Unused evidence uses several independent boundaries:
1. Case-insensitive `rg` across frontend, API, scripts, sidecar and deploy sources finds the distinctive selectors/keyframe only inside this file, and no `App.css` consumer. A separate tracked `git grep` likewise finds no filename consumer. There are no application-local unstaged/untracked additions at entry.
2. Inspected actual build entry chain: `app/page.tsx` → `app/[[...slug]]/ClientShell.tsx` (literal dynamic import) → `src/ClientApp.tsx` → `src/App.tsx` → current views/layout. `app/layout.tsx:4` imports **`index.css`**, which is retained. `ThemeProvider.tsx` owns active MUI/CssBaseline styling. App source and shell do not use the CRA root classes.
3. Inspected `next.config.js`: static export plus development rewrite, no source-directory/glob CSS loader or additional injection. Script/config searches show no `require.context`/`import.meta.glob` CSS ingestion. Jest mocks explicitly imported styles; it does not load this file itself. Package scripts invoke the current Next/Jest/ESLint/TypeScript tools.
4. Inspected delivery boundaries: frontend Dockerfile builds then copies only `/app/out` to nginx; nginx serves that output, and the local export server resolves only `out/`. `src/App.css` is outside public assets and has no exported/source-file URL contract. It is not document CSS, an API payload, font or stored settings format. No database inventory is required to remove this unserved source stylesheet; no persisted record is modified.
Current consumers/replacement: **none found; no replacement needed**. Preserve the already-active `index.css`, `theme.ts`, `ThemeProvider.tsx`, RGL styles, renderer styles and licensed fonts. Affected preservation review: PRES-E01–E09 (shared UI/theme/responsive/accessibility assurance); all other 48 groups and all 34 routes remain unchanged. Removal risk: **LOW**, contingent on unchanged candidate/entry/config identity and successful affected checks. Runtime/build-size improvement is **NOT MEASURED**; an unbundled source file does not imply a smaller runtime bundle.
## Data, backend and SQLite implications
Career Profile remains canonical. Preserve CV overrides and null-as-inherit, explicit blank flags, current-master history semantics, old stored CV formats/design-version-1 rendering, submitted/frozen CV/letter HTML/settings/binaries and application associations. Cover-letter writers continue under `JobApplication.Version` and `ApplicationAssetsService`; retain generic null-clear versus draft null-unchanged, no-op, restore-as-new, attachment flags, owner filtering and transaction/RD21 stale-write/rollback/retry protections. Keep historical extraction runs and paired review/accept DTOs. No data migration, schema change, writer consolidation or route transition is proposed.
Reviewed MariaDB standardisation [README](../../database/mariadb-standardisation/README.md), [acceptance](../../database/mariadb-standardisation/ACCEPTANCE.md) and [six-stage SQLite retirement](../../database/mariadb-standardisation/SQLITE_RETIREMENT.md). Actual MariaDB coverage does not establish installation inventory, full-fidelity export/isolated restore/transfer, complete harness parity, approved cutover/rollback-after-writes or retention sign-off. **SQLite retirement remains REMOVAL NO-GO as a separate initiative.** Keep provider packages/helpers/branches, partial export tools and immutable migrations. It is not a prerequisite for unrelated stylesheet cleanup. No MariaDB upgrade is proposed.
## Proposed P10-01 scope — CLEAN-20 only
Approval requested for this exact candidate at application baseline `fc5b9d377199ce51f480a920a3772108094929e3`, plus this Markdown-only assessment descendant. Before acting, require a clean published assessment checkpoint, unchanged application/build/test inputs and the exact candidate blob above. If a consumer/config/source change appears, stop and reassess rather than broadening approval.
Allowed implementation after explicit approval:
- Delete only `job-tracker-ui/src/App.css` with the patch workflow. Update this phase's evidence, TODO and continuity Markdown. No caller, export, fixture, configuration, dependency, API, route, data, renderer, font or localisation change is expected or approved.
- Recheck filename/selectors, static/dynamic entry and delivery boundaries, 57 IDs/34 routes and exact diff scope. Run existing frontend `typecheck`, `lint` and `build` using the unchanged lockfile and an isolated local dependency/build tree. Dependencies are absent in this worktree today; restore only the existing lock if needed in the authorised implementation, without upgrades or shared-worktree edits.
- Run existing `landing-presentation.spec.ts` (both EN/NB cases cover light/dark at 320/390/768/1440) and focused `smoke.spec.ts` cases `public plans stay honest, responsive and keyboard accessible`, `login establishes an authenticated session`, and `Career Workspace loads from the authenticated application shell`, with zero retries, exact discovered membership, fresh isolated fixtures/static output and native exits. This is a candidate regression sample, not a full suite or human accessibility acceptance. Do not run model/provider operations or additional PDF-producing smoke cases.
- Reuse unchanged backend/provider/sidecar/PDF evidence with source checks. Do not rerender PDFs, reopen approved metrics or rerun thousands of tests for this unimported file. Broader phase acceptance still requires the complete applicable P10-04/P10-05 programme; significance or affected-source changes require appropriate full suites.
- Run `graphify update .` as required after a code change, with AST-only/local operation. Graph absence is a known tooling limit: if the installed update cannot operate without a graph, record its actual result and the maintenance limitation; do not rebuild another worktree, fetch an extractor or add graph/orchestration infrastructure under this approval. Graph maintenance is not product-regression evidence.
- Commit the validated candidate checkpoint, normally push `feature/phase10-cleanup`, and independently compare its remote SHA. Publication failure is a real gate, not permission to repair Gitea or bypass hooks.
Rollback: revert the single implementation commit, restoring the exact original stylesheet blob; documentation records the reversal. No database restore, data rewrite, redirect or compatibility migration is needed. Failed build/browser/source-scope evidence prevents acceptance. Do not waive failed assertions, remove fixtures or extend the patch to make unrelated checks pass.
This approval would cover **P10-01/CLEAN-20 only**. It would not authorise P10-02, further removals or later initiatives. Subsequent candidate-specific implementation gates remain. When no additional safe candidate is proven, report that result and retain the code.
## Limitations, decisions and stop
This is a bounded cleanup inventory with one positively analysed stylesheet nomination, not exhaustive dead-code/package/API/locale-key/asset non-use proof. Historical CV/old-run/provider runtime behavior was not freshly executed. No source/data loss or performance improvement is claimed. Native package schemas/counters were not freshly re-parsed by the full branch-specific handoff verifier; fresh checks above cover byte integrity, source identity, group states and route membership only.
Retained independent debt: physical device/AT/contrast/proficient EN-NB/printing **NOT TESTED**; CV-model qualification **BLOCKED**, adapter disabled; deterministic PDF recall and source-review burden **PARTIAL**; canonical-only generic-AI context limitation retained; Python vendor advisory coverage **INCOMPLETE/CONDITIONAL**; hosted CI/isolation **BLOCKED/UNVERIFIED**; MySqlConnector/TLS, native image/parser production isolation, filesystem/off-disk backup/restore and deployed identity remain release qualifications. No fresh advisory search, live AI, licensed-provider or production access occurred.
| Decision | Current result |
| --- | --- |
| P10-00 direct assessment | **COMPLETE** within the authorised documentation/inspection scope |
| P10-00 checkpoint publication | **PASSED**: subsequent normal push and independent readback at `1692142295950e390a4cf807d9df86cc5cf96290`; previous pre-receive failures remain historical |
| CLEAN-20 static deletion eligibility | **NOMINATED**, with exact implementation verification and owner gate above |
| P10-01 implementation | **AWAITING_APPROVAL** of the exact candidate scope; publication prerequisite satisfied |
| Phase 10 complete acceptance | **NO-GO / NOT YET ESTABLISHED**; P10-01–05 not complete |
| Redesign development completion | Existing **CONDITIONAL GO** remains scoped; final cleanup acceptance not established |
| Post-Phase-10 PRODUCT-REVIEW-01 readiness | **NO-GO** until Phase 10 is accepted and applicable entry conditions are satisfied |
| Production release | **NO-GO** |
**STOP here. Request approval of P10-01/CLEAN-20 only.** The orchestrator must remain paused. The deferred CV-import overhaul and personal portfolio website remain outside this roadmap execution task. [HANDOFF.md](HANDOFF.md) records continuity, exact checkpoints and the later source order; later prompt packs must be read completely before their workstream is entered.
+39
View File
@@ -0,0 +1,39 @@
# P10-01 — CLEAN-20 implementation
2 November 2026. Owner explicitly answered **"Approve CLEAN-20 only"** to the candidate-specific proposal. Implemented only removal of the unused 38-line `job-tracker-ui/src/App.css`, blob `74b5e053450a48a6bdb4d71aad648e7af821975c`. No caller, route, dependency, lockfile, test, API, database schema, document renderer, localisation or active theme changes.
## Entry and preservation
Clean `feature/phase10-cleanup` entered at `36a355ea54a2357907ac5a5bf655d6946388b202`; independent remote readback matched. Candidate blob matched exactly. Application/build/test inputs unchanged from assessed `fc5b9d3` baseline before this deletion. Reference search found distinctive selectors only in the candidate; source entry/config/delivery boundary evidence in P10-00 remains applicable because those bytes did not change.
Fresh source-manifest comparison: 1,279 matching files, sole expected missing file App.css, zero mismatches. 34 distinct route identities match the preserved register. All 57 preservation groups remain present, with prior 56 PARTIAL / one DEFERRED states unpromoted. No CV, letter, legacy import, provider or RD21 contract changed.
## Fresh checks
| Check | Result |
| --- | --- |
| Isolated frontend dependency restoration | PASS: `npm ci --offline --no-audit --no-fund`, unchanged lockfile, 825 packages; no upgrades |
| Frontend typecheck | PASS, exit 0 |
| Frontend lint | PASS, exit 0, max warnings 0 |
| Static production frontend build | PASS, exit 0; local test API URL; fresh isolated output |
| Local API restore/build for browser fixture | PASS with existing SDK 9.0.317; Release build zero warnings/errors |
| Exact browser discovery | Five cases in two files |
| Browser execution | PASS 5/5, zero skips/flaky/retries; native exit 0; 44.5 seconds |
| Route/preservation/source scope | PASS as above |
| Graphify | AST-only update attempted/completed status recorded in handoff; generated graph untracked |
Browser cases: both EN/NB `landing-presentation` cases (light/dark at 320/390/768/1440), public-plan responsive/keyboard smoke, authenticated login, and Career Workspace shell. Existing Playwright config creates a fresh temporary SQLite fixture, disables AI/import/provider-alert workers, refuses server reuse and serves this worktree's prebuilt static export. Fixture-only schema initialisation is not a production migration. No live models/providers or PDF-producing tests were invoked.
Native browser report and source/check summary: [clean20-evidence/SUMMARY.json](clean20-evidence/SUMMARY.json), [compressed native report](clean20-evidence/browser-native.json.gz). This is a candidate regression sample, not full regression or Phase 10 acceptance. Unchanged backend/provider/sidecar/PDF evidence remains historical and source-bound; no accepted PDF criterion reopened.
## Failed setup attempts and retained limitations
System `dotnet` failed to resolve pinned SDK; used repository-documented existing `C:/Users/Connor/.dotnet/dotnet.exe` and DOTNET_ROOT. First no-restore API build failed because fresh worktree lacked assets; normal locked restore succeeded, followed by successful build. No project/runtime configuration changed. Offline npm restore emitted deprecation warnings and an unapproved optional unrs-resolver install-script notice; no install-script approval or dependency change made. Required lint/type/build/browser subsequently passed.
Fresh fixture startup emitted existing SQLite migration transaction/rebuild warnings and local DataProtection unencrypted-key warning. These were not hidden or repaired under CSS scope. They do not qualify backup/restore, provider parity, hosted CI, production secrets or deployed services. Graph tool lacks optional SQL/PDF extractors; no installation attempted.
## Rollback and remaining gates
Revert this candidate implementation commit to restore the exact original stylesheet; no data restore needed. A failing required candidate check would prevent acceptance and trigger restoration; all required candidate checks passed.
P10-01/CLEAN-20 implementation is verified. Required publication must be independently read back before published completion is claimed. P10-02–05 and overall Phase 10 acceptance remain open; no additional deletion is approved or invented. Next: retained CV/document compatibility review under P10-02, followed by the required downstream qualification programme. Orchestrator remains paused/untouched; no main merge or deployment.
+12
View File
@@ -0,0 +1,12 @@
# P10-02 — CV/document compatibility disposition
Review after published CLEAN-20. No additional safe CV/document deletion proven. Retain all assessed paths; no implementation removal nominated. This is a completed bounded retain/remove review, not fresh functional acceptance or a claim of exhaustive dead-code proof.
Reused the source-bound P10-00 inventory and accepted handoff: all 1,279 remaining frozen files match; only approved App.css is absent. Fresh active-consumer confirmation:
- `CareerProfilePage.tsx:410,447,868` distinguishes non-Docling and Docling persisted runs and calls the legacy accept endpoint with expected revision. `ProfileCvController.cs:270–314` exposes that endpoint, rejects inappropriate document-import acceptance, checks revisions and preserves concurrency conflicts. **Retain both workflows.**
- `CvTheme.cs:199` and `ThemedCvRenderer.cs:27,242–282` resolve explicit design-version-2 settings while retaining historical layout branches. **Retain legacy rendering and frozen settings.**
- `ApplicationAssetsService` remains the revision/history writer, with current version snapshots and design entitlement validation. Existing null/blank/no-op/restore semantics and canonical Career Profile ownership are unchanged. **Retain, no writer consolidation.**
- Current editor/gallery/thumbnail and original fixtures retain their P10-00 positive consumers. No duplicate replacement proven; no imported data, old extraction record or submitted binary removed.
Tests: no new P10-02 product tests; sources unchanged and historical CV/provider/PDF/RD21 evidence reused only within original qualifications. CLEAN-20 Career Workspace sample is fresh but not historical-format/PDF requalification. P10-04/05 and independent audit remain required. No migration or PDF rendering requested. Deferred CV-import overhaul stays outside scope.
+11
View File
@@ -0,0 +1,11 @@
# P10-03 — Backend, dependency and configuration disposition
Bounded review complete with **no proven additional safe deletion**. Reuse P10-00 CLEAN-11–19 active-consumer inventory; source comparison confirms backend, dependencies, locks, scripts and configuration are unchanged. Do not manufacture a removal to satisfy a stage name. Implementation scope is empty; full independent audit and P10-04/05 acceptance remain open.
- Keep canonical mapper, versioned writers, legacy parser and disabled optional interpretation adapter: different responsibilities/current readers persist. Disabled is not obsolete.
- Keep migration history and both database providers. Reviewed `SQLITE_RETIREMENT.md` again: installation inventory, full-fidelity export/restore, transfer reconciliation, coverage parity, approved cutover/reverse transfer and retention sign-off are not established. Existing SQLite browser fixture is itself a current consumer. SQLite removal remains separately gated and does not block unrelated cleanup.
- Current project embeds licensed document fonts and declares runtime/platform/provider packages. No package has a complete runtime/build/test/script/container/platform absence proof. No upgrades, lock changes, flag activation or platform consolidation performed.
- Keep current routes/redirects, locale keys, original tests and frozen PDF oracles. Dynamic consumers and historical compatibility defeat name/age-based deletion.
- Duplicate reminder-read optimisation is still unmeasured and therefore not nominated for cleanup.
Fresh supporting check from P10-01: locked API restore/Release build and frontend offline restore/typecheck/lint/build passed. These prove builds for retained inputs, not unused-package absence or fresh security/provider qualification. Backup-parser remediation lives on its independent release branch; it is not silently integrated into this Phase 10 branch.
+30
View File
@@ -0,0 +1,30 @@
# P10-04 — Functional and data integrity qualification
2 November 2026. PARTIALLY COMPLETE. Selected document-contract regression executed against Phase 10 application sources after CLEAN-20. This checkpoint is not full regression or final acceptance.
## Fresh results
PASSED: 27 tests, zero failures/skips, native exit 0, across ApplicationAssetsTests, CvRevisionReadinessTests and CvExportRevisionTests. Coverage includes association/tenant isolation, canonical-profile ownership, letter history and restoration, null/inherited overrides, stale-write rejection and PDF-export revision preconditions. Local in-memory/temporary SQLite fixtures, mocked PDF exporter; no physical PDF acceptance, production database, model or provider validation.
Command: pinned local .NET SDK 9.0.317, Release test with `--no-restore`, filter `FullyQualifiedName~ApplicationAssetsTests|FullyQualifiedName~CvRevisionReadinessTests|FullyQualifiedName~CvExportRevisionTests`, TRX logger. Restore separately passed with locked mode; lockfiles and product source remained unchanged. Initial invocation incorrectly passed `--locked-mode` to dotnet test and was rejected by MSBuild before running tests; this was corrected by separate locked restore, without configuration edits.
Raw native evidence: [document-contracts.trx.gz](p10-04-evidence/document-contracts.trx.gz). Uncompressed SHA256 `692a0fe8016140c3198e76e6b3c1d56f438d80390666bc7f1b2dc06b4ac4ead5`. Test records identify individual cases and execution timestamps.
## Remaining qualification
Additional PASSED executions, same Release assembly and native exit 0:
- ProfileCvControllerTests: 36 passed, zero failures/skips. Includes import admission, reviewed persistence and deterministic/fixture parsing with mocked AI dependencies. No live classifier/model or provider was used. [Native TRX](p10-04-evidence/p10-04-import-compatibility.trx.gz), uncompressed SHA256 `844cd54ff382bff0d48429336f8588ab010f0c72ea255ca02fe300b1561dc513`.
- SqliteDateTimeOffsetCompatibilityTests and CareerProfileServiceTests: 26 passed, zero failures/skips. Local canonical-profile history plus SQLite submission capture, sparse/missing-attachment package handling, owner-scoped date ordering and extraction endpoints. [Native TRX](p10-04-evidence/p10-04-local-data-compatibility.trx.gz), uncompressed SHA256 `1ac55913fdc3b705afbed27829fb280bef08d33c62fa26faa2c04e23c0c95908`.
The three filters are disjoint: 89 distinct backend cases passed, zero failed/skipped. They are selected regression coverage, not a complete backend pass.
Frontend PASSED: five suites, 92 tests, zero failures/pending, native exit 0, 41.237 seconds. Exact selected paths: `career-history-view.test.tsx`, `application-assets.test.tsx`, `cover-letter-document.test.tsx`, `cv-document-controls.test.tsx`, `cv-import-review.test.tsx`; Jest `--runInBand --runTestsByPath`, local mocked contracts. [Native JSON](p10-04-evidence/frontend-document-workflows.json.gz), uncompressed SHA256 `b919a96d94218ff166de684f6b82d3ce6f34d47b51d52480721e8955df2df257`. Browser/real PDF fidelity and semantic AI quality are separate evidence. Backend and frontend counts remain separate.
Migration rehearsal/rollback, MariaDB integration, sidecar, complete suites, security acceptance, hosted CI and human/device qualification remain NOT RUN here. Reuse unchanged accepted renderer evidence only within its source/fixture/environment boundaries. No migration or destructive cleanup is proposed. P10-05 remains open; production remains NO-GO.
## Additional attachment qualification
Fresh AttachmentConsistencyTests execution: 14 PASSED, zero failures/skips, native exit 0. Reused the existing Release assembly with --no-build/--no-restore after confirming no backend/test source difference between the Phase 10 and security branches. Relational temporary SQLite and synthetic files only. The named case Another_users_attachment_cannot_be_downloaded_renamed_or_deleted verifies three NotFound results and preserves the foreign file/row. Other selected cases cover upload/storage consistency. This is direct controller/local fixture evidence, not authenticated HTTP or deployed/MariaDB isolation acceptance. No application code changed.
[Native TRX](p10-04-evidence/attachment-ownership-and-storage.trx.gz). These 14 cases are disjoint from the earlier 89 backend cases: selected backend coverage is now 103 distinct cases, with the 92 frontend tests kept separate. Complete suites and P10-05 remain open.
+30
View File
@@ -0,0 +1,30 @@
# P10-05 — Acceptance reconciliation (OPEN)
2 November 2026. This is an acceptance work register, not final acceptance. P10-01 CLEAN-20 is the only implemented deletion. P10-02/03 retain reviews found no additional proven-safe candidate. No further cleanup is authorised or needed merely to populate a checkpoint.
## Evidence applicability
Fresh integrity check at continuation from 2a4acc17: all 263 indexed TEST_EVIDENCE artifact hashes match; 1,279 application-source hashes match the accepted source-after manifest, with only the approved App.css absent and zero changed-file mismatches. Paths were resolved under the expected repository/evidence root before reading. This establishes historical source applicability, not fresh execution or a complete independent audit. New reports and native test artifacts are outside the application manifest.
| Required area | Evidence disposition | Remaining limit |
| --- | --- | --- |
| Cleanup eligibility | CLEAN-20 blob/callers and narrow approval recorded in P10-00/01 | No additional deletion proven |
| Frontend types/lint/build | PASSED fresh for CSS deletion; P10-01 | Full-suite execution is not represented by these checks |
| Focused browser EN/NB/theme/responsive | PASSED five selected cases; P10-01 | Canary is not full browser regression or device acceptance |
| Backend document/data contracts | PASSED 89 selected cases; P10-04 | Not complete backend regression |
| Frontend document workflows | PASSED 92 selected tests; P10-04 | Not complete frontend regression |
| Routes/capabilities | Existing 34-route and 57-group reconciliation retained | 56 PARTIAL / one DEFERRED is not 57 accepted groups; independent closure review pending |
| Historical CV/document/PDF | Accepted source/fixture-bound evidence retained; affected document contracts freshly checked | No fresh physical/PDF visual metric acceptance; unchanged metrics must not be reopened without affected change |
| Complete suites/browser contracts | Historical evidence remains source-bound | No fresh full-suite result in this cleanup branch; reviewer must reconcile required acceptance scope explicitly |
| MariaDB/migration rollback/restore | Existing qualifications remain scoped | Current independent environment and recovery qualification incomplete; no database migration added or executed |
| Sidecar/security/accessibility/hosted CI | Existing limited evidence retained | Full independent audit, actual plugin scans, integrated qualification, hosted/human/device gates remain open |
## Decisions
- CLEAN-20 implementation: locally validated and published; no further code cleanup proposed.
- Phase 10 completion: OPEN; full acceptance is not established by targeted counts or this report.
- Redesign completion and post-redesign Product Review acceptance: OPEN; new full-application design also requires final owner approval.
- Independent product/research/i18n/security offline work: may continue under the owner's direct parallel-work authorisation. Do not claim upstream acceptance or integrated release qualification for isolated branches.
- Production release: NO-GO. No merge or deployment authorised.
Next: reconcile complete accepted suite evidence and remaining preservation-group qualifications, complete independent audit coverage, and record genuine reviewer/owner decisions. Keep active-host, provider, model, migration and paid-scan gates distinct from ordinary source review. Do not rerun thousands of unchanged tests solely as a restart demonstration. If a relevant implementation changes, refresh its affected checks and final integrated qualification accordingly.
@@ -0,0 +1,40 @@
{
"scope": "P10-01 CLEAN-20 only",
"approval": "Owner chat: Approve CLEAN-20 only",
"baselineCommit": "36a355ea54a2357907ac5a5bf655d6946388b202",
"deletedPath": "job-tracker-ui/src/App.css",
"deletedBlob": "74b5e053450a48a6bdb4d71aad648e7af821975c",
"sourceManifestFiles": 1280,
"sourceManifestMatched": 1279,
"sourceManifestMissing": [
"job-tracker-ui/src/App.css"
],
"sourceManifestMismatched": [],
"routes": 34,
"preservationGroups": 57,
"checks": {
"typecheck": "PASSED exit 0",
"lint": "PASSED exit 0",
"frontendBuild": "PASSED exit 0",
"apiBuild": "PASSED exit 0, 0 warnings/errors",
"browser": "PASSED 5/5, zero skips/retries/flaky"
},
"browserStats": {
"startTime": "2026-11-02T20:41:52.224Z",
"duration": 44532.167,
"expected": 5,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"browserMetadata": {
"isolatedDataRoot": "C:\\Users\\Connor\\AppData\\Local\\Temp\\jobtracker-e2e-4580-mvzq5nbx",
"actualWorkers": 1
},
"nativeReportSha256": "3b051b65fccbb79b298989ad52987c6e1c4c9fe60ff4e7d8796a40ca2e060bd1",
"compressedReportSha256": "baf659c51c4f412f30b8971588ef84c3863830b64afd5cbc874800172f95c3c0",
"limitations": [
"candidate regression sample, not full Phase 10 acceptance",
"no new PDF/model/provider/production qualification"
]
}
@@ -0,0 +1,22 @@
# Preliminary release discovery
2026-11-02. Branch `planning/release-readiness-discovery`; accepted conditional development baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`. Stage 1 IN_PROGRESS. No release candidate nominated. Production NO-GO. This report records source inspection and a bounded offline check, not full release qualification.
| Component / inspected owner | Dependency / failure boundary | Required release evidence |
| --- | --- | --- |
| `job-tracker-ui/package.json`, `Dockerfile`, `nginx.conf.template` | Next static export, React/MUI and React Router; nginx serves `out`, proxies `/api/`, `/health`, `/ready`; configured host and forwarded-header handling | Exact build/image, browser journeys and deployed proxy/TLS identity |
| `JobTrackerApi/Program.cs`, `JobTrackerApi.csproj` | net9.0, EF 9.0.14, Pomelo 9.0.0; authentication/authorization then rate limiting/session middleware and controllers | Endpoint-by-endpoint ownership/session/CSRF/error tests; source registration alone is not security proof |
| `JobTrackerApi/Data/DatabaseConfiguration.cs` | Defaults to MariaDB; missing connection throws; SQLite requires explicit transitional selection | Actual MariaDB migration/upgrade/rollback and preservation evidence; retain legacy paths |
| `docker-compose.database.yml` | Development persistent volume and separate integration tmpfs service; MariaDB 12.2.2 pinned digest; loopback ports | Isolated provider tests; no claim of equality with production |
| Career/CV domain and PDF | Program registers CareerProfileService, ApplicationAssetsService, CV/letter renderers and Playwright exporter | Canonical facts, null-as-inherit, revisions, historical artifacts and physical print remain separate contracts |
| Background services | Program registers backup, rules, reminders, saved search, export, enrichment, summarizer probe, AI operation, retention, email recovery and account deletion workers | Verify configuration, failure recovery and tenant isolation for enabled workers; registration is not runtime activation |
| Auth/mail/provider integrations | Architecture documents Google/Microsoft identity, Gmail/Graph/IMAP/SMTP, NAV, optional translation, local/external AI, Stripe | Synthetic local tests separate from licensed/provider/account delivery and consent |
| `.gitea/workflows/ci-deploy.yml` | Test pipeline; deployment limited by source condition to push on `refs/heads/main` | Fresh hosted artifact/commit/runner evidence; development branch push is not hosted qualification |
| `.gitea/workflows/mariadb-integration.yml` | Isolated runner label, explicit initial exit-1 isolation gate | Operator isolation evidence and authorised workflow review before enabling; do not remove gate during discovery |
| Existing backup/deployment runbooks | Database, attachments/CV artifacts, keys and deletion tombstones; code rollback differs from data restore | Disposable restore with independent content/decryption/deletion checks; approved RPO/RTO and failure rehearsal |
Public boundary currently inspected: nginx host routing, `/health`, `/ready`, `/api/`; API controllers are mapped but a complete anonymous/authenticated endpoint census is still PENDING. External mail/job/AI requests, uploaded documents, browser credentials, database records and stored artifacts are separate trust boundaries. No live endpoints, Docker engines, databases, credentials, models or production services were accessed.
Local development, test and production are not interchangeable: integration uses a generated project and disposable service; production needs the external network, server-side environment, actual ingress and operator controls. Current architecture/runbooks describe these differences; exact intended staging/production configuration and image identity remain unverified.
The latest handoff's source-bound PDF metric/visual approvals supersede the older acceptance paragraph describing unchanged S01 coordinate failures. They are preserved for the approved development scope. Physical print, device, AT and language review remain open. No export was rerun because no renderer/font/fixture/application source changed.
@@ -0,0 +1,11 @@
# Discovery baseline and actual checks
Date 2026-11-02. Source `5cb903b989742b7a96cb22ddf4c0e24993b18980`; application freeze `ba04d817fed26d659bfa2a56b089d6cac851dc34`. No accepted post-roadmap release candidate, build identifier or release image exists in this discovery checkpoint.
Fresh check: `rtk proxy python scripts/test-mariadb-integration.py` exited 0; **5 tests passed** in 0.030 seconds. This existing offline suite mocks subprocess execution. The printed cleanup failure/exit 17 and setup error/exit 1 are intentional negative-test outcomes asserted by the suite, not a real container failure. No MariaDB/Docker execution occurred. This proves five runner guards, not database behavior, hosted isolation or a full regression.
Read-only source checks confirmed the MariaDB default/missing-connection fail-closed behavior and the hosted workflow's explicit isolation blocker. Refer to SYSTEM_INVENTORY for inspected paths. `git diff --check` is a documentation hygiene check, not product qualification.
Historical test totals, PDF exports, security scans and provider runs remain attributed to their original evidence. They are not fresh runs here. `docs/automation/handoffs/pre-phase10/FINAL_DEVELOPMENT_ENTRY.md` records the latest approved unchanged-source applicability and narrow PDF metric/visual closure. Direct chat does not adopt or activate its historical autonomous-controller instructions.
NOT RUN: full backend/frontend/browser/Python/provider suites, builds, container validation, security scan/advisory refresh, performance, native review, deployment smoke, restore or rollback rehearsal. These require the actual release-stage source/environment and their own applicable gates. Discovery does not mark any mandatory release gate PASS merely because historical tests exist.
@@ -0,0 +1,36 @@
# Recovery implementation review and rehearsal plan
2026-11-02; source `5cb903b989742b7a96cb22ddf4c0e24993b18980`. Read-only discovery. The entire 765-line `deploy/deploy.sh` was inspected, never executed or sourced. No operational keys, credentials, environment files, databases, containers or remote storage were accessed.
## Distinct recovery mechanisms
| Owner | Verified source behavior | Qualification boundary |
| --- | --- | --- |
| `SqliteDatabaseBackupRunner` | SQLite-only VACUUM snapshot and count retention; explicitly unsupported for MariaDB | Does not prove MariaDB backups exist |
| `BackupController` | Authenticated, encrypted user-data export using application Data Protection; includes structured records and attachment metadata | Not a server-wide database/files/keys recovery set; do not use it as disaster recovery proof |
| `deploy/deploy.sh:backup_database` | Requires explicit provider; SQL dump for MariaDB, volume archive for SQLite; rejects missing/empty/malformed/trailerless dumps | Format checks do not restore or compare records; emergency skip exists and is not approved here |
| `backup_recovery_volumes` | MariaDB additionally archives required application data volume; independently archives tombstones when present | Consistency between dump/files/tombstones and current key availability still needs isolated rehearsal |
| Retention/off-host copy | Daily/monthly retention and optional rclone copy | Source message calls remote encrypted but source does not establish actual remote encryption configuration; off-host configuration and recovery remain unverified |
| `finish_deploy` | On failure after replacement, restarts previous backend/frontend image references when both exist; retains failed exit | No database reversal, no previous AI image restoration, and no post-rollback health check in this handler |
| Tombstone store and replay | Validates ledger records; Program invokes `StageRestoredAccountsAsync` at startup; deleted identities are staged again | Test restored data with latest independent tombstones; corrupt ledger must fail closed. Existing AccountDeletionTests include restore replay, not a complete operational restore |
Build retry paths prune Docker build/system cache and deployment may warm an Ollama model. Therefore even a proposed "local deploy smoke" must not run this script against the shared workstation. No such action was taken.
## RR-11: backup connection parser mismatch - reproduced
The script's host `sed` expression accepts `Server=` but returns no host for `SERVER=` and `Host=`. The latter is a documented MySqlConnector alias ([official connection options](https://mysqlconnector.net/connection-options/), checked 2026-11-02). The script then fails its required-host check before dump execution. Impact: a valid application connection spelling can prevent deployment backup/deployment; no observed data loss or actual production impact. Engineering priority proposed P2; not a security vulnerability rating.
Three synthetic cases used only loopback and dummy identifiers. Exact source expression was extracted from the `db_host` assignment, then executed through Git Bash with `echo <shell-quoted synthetic input> | sed -n <shell-quoted source expression>`. Results: canonical `Server` -> `127.0.0.1`; uppercase `SERVER` -> empty; alias `Host` -> empty. Assertions confirmed all three results. No connection was opened. Initial direct Windows-to-sed invocations failed the positive-control assertion and were discarded as invalid harness evidence; the shell-native rerun passed its positive control.
Proposed future remediation: parse with the same supported connection-string semantics as the API, or explicitly validate/document a narrower deploy contract before any operational step. Cover aliases/case, quoted separators, duplicate keys, missing required values and secret-redaction behavior. Do not print real input. Any implementation belongs to an authorised release remediation scope, not P10 cleanup.
## Isolated rehearsal specification - NOT RUN
1. Bind accepted candidate, image digests, migration history and disposable host ownership. Use synthetic accounts and a separate temporary MariaDB/files/key/tombstone set; never copy production data here without separate authority.
2. Seed two owners with canonical profiles, CV overrides, letter history, submitted packages, attachments, encrypted provider placeholders and completed deletion tombstones. Record independent counts and artifact hashes, without recording plaintext secrets.
3. Produce the actual supported dump/files/tombstone recovery set. Demonstrate a failed dump or missing required volume prevents promotion. Verify off-host retrieval/decryption separately if that integration is approved.
4. Restore into a second isolated environment. Independently compare rows/ownership/revisions/artifact bytes; exercise application decryption and document reopening. Restore an older database with newer tombstones and prove erased accounts cannot regain access. Inject a malformed ledger and assert fail-closed startup.
5. Rehearse prior-image rollback after failed replacement, then after a representative additive migration and writes. Check `/health`, `/ready`, exact version and authenticated read/write preservation. Document when image rollback is insufficient and database restore would lose newer writes.
6. Measure recovery duration and data-loss window against owner-approved RTO/RPO. No target or measurement exists in this checkpoint. Preserve cleanup and evidence identities; no production execution or release approval implied.
Fresh checks: Git Bash `bash -n deploy/deploy.sh` PASSED (syntax only); `python scripts/test-mariadb-workflow.py` PASSED 4/4 (source quarantine guards only). These are separate from the earlier 5/5 offline runner tests. Restore, failure injection, hosted isolation, live encryption and rollback health remain NOT TESTED.
@@ -0,0 +1,21 @@
# Preliminary release blocker reconciliation
Discovery only, 2026-11-02. These are qualification gaps unless a concrete defect is stated. No inferred P0/P1 vulnerability ratings or owner risk acceptance.
| ID | Historical item / current finding | Status / closure evidence needed |
| --- | --- | --- |
| RR-01 | Phase 9/10 and production NO-GO | Phase 10 assessment now independently published, implementation still awaits exact approval. Later roadmap acceptance absent. BLOCKED for final RC |
| RR-02 | Old Linux 11/24 and later S01 failure narratives | Latest handoff records approved S01 36/36 per platform and owner visual acceptance for unchanged development output. Do not reopen these metrics without affected change; physical print/device remain NOT TESTED |
| RR-03 | Python advisory/native parser/image qualification | Latest scoped conditional disposition retained; current advisories and production-equivalent native isolation NOT TESTED. No new scan or risk waiver |
| RR-04 | Hosted MariaDB/isolation | Source explicitly fails before execution until isolated runner proof. BLOCKED; fresh local 5 guard tests do not close it |
| RR-05 | Human/device/provider | Actual AT/contrast, physical devices/print, native language and live provider accounts not qualified here. BLOCKED/NOT TESTED by lane |
| RR-06 | Old known-issues F19 SQLite fallback statement | Current DatabaseConfiguration defaults to MariaDB and throws without connection. Old wording is superseded for this source. SQLite retirement still BLOCKED on transfer/restore/parity gates |
| RR-07 | Old F01 stale-write statement | MariaDB acceptance documents bounded RD21 resolution; later handoff carries it. Do not reopen all old F01 findings based on stale index wording; final affected API census/regression remains required |
| RR-08 | MySQL TLS / dependency / production identity | Latest handoff retains MYSQL-TLS-01 and OPS-01. No live configuration read; current advisory disposition and deployed equivalence unverified |
| RR-09 | Backup/restore and rollback | Existing procedures and historical seeded rehearsal are not a current restore. Need isolated recovery-set completeness, decryption, tombstone behavior, post-write rollback compatibility and agreed RPO/RTO |
| RR-10 | AI quality/activation | Deterministic Docling fixtures are distinct from real-model semantic accuracy. Optional unqualified adapter remains disabled; no AI invocation authorised here |
| RR-11 | Backup host parsing rejects supported `Host=` alias; uppercase spelling also unrecognised | REPRODUCED with synthetic input and shell-native positive control. Deployment aborts before backup; proposed P2 compatibility defect. Fix scope awaits authorised release remediation |
| RR-12 | Rollback restores core images without post-rollback health qualification; no schema/data/AI reversal | VERIFIED source limitation, runtime impact NOT TESTED. Requires isolated post-migration/post-write recovery rehearsal; no rollback guarantee |
| RR-13 | Off-host encryption and recovery-set consistency not established by script success messages | NOT TESTED operational qualification. Verify remote encryption, retrieval/decryption, database/files/key/tombstone consistency in approved isolation |
Next remediation is evidence work: complete the source/endpoint/environment census and resolve historical records against their exact latest evidence. RR-11 now has a bounded future fix proposal in 11_BACKUP_RESTORE_ROLLBACK.md; no runtime implementation is authorised by this discovery checkpoint. Every fix needs minimal scope, targeted verification and the applicable stage approval.
@@ -0,0 +1,26 @@
# Preliminary acceptance matrix
2026-11-02. **NO-GO for production.** This is a discovery snapshot, not Stage 7 final acceptance. No accepted final RC or production-equivalent build is nominated. PASS applies only to an executed gate, not historical source evidence.
| Mandatory gate | Current release verdict | Missing release evidence / dependency |
| --- | --- | --- |
| Functional regression | BLOCKED | Accepted final roadmap source; fresh applicable critical journeys |
| Frontend/UX | BLOCKED | Accepted design/implementation and final source-bound browser evidence |
| Accessibility | NOT TESTED | Actual AT/device/contrast/manual evidence plus automation |
| Authentication/authorization | NOT TESTED | Final endpoint/tenant/session qualification |
| Security assessment | BLOCKED | Dedicated security initiative start and predecessor gates; no scan run |
| Backend APIs | NOT TESTED | Final API census and applicable regression |
| MariaDB/migrations | BLOCKED | Hosted isolation and actual RC upgrade/recovery evidence; five offline guards are not this gate |
| CV/PDF fidelity | BLOCKED | Final RC source equivalence and retained scoped approvals; physical print still missing |
| AI integrations | BLOCKED | Explicit isolated-model qualification and semantic evidence |
| Email/OAuth | BLOCKED | Actual configured provider/consent/account verification |
| Performance/reliability | NOT TESTED | Approved load targets and bounded final-source measurements |
| Docker/infrastructure | NOT TESTED | Exact images/environment/configuration/ingress parity |
| CI/CD | BLOCKED | Hosted isolation and fresh actual run/artifacts |
| Backup/restore | NOT TESTED | Disposable complete recovery rehearsal with content assertions |
| Deployment/rollback | NOT TESTED | Authorised isolated rehearsal; production execution remains prohibited |
| Monitoring | NOT TESTED | Failure detection, delivery and redaction evidence |
| Documentation | NOT TESTED | Complete release-source/runbook reconciliation, beyond this partial discovery |
| Human/device/provider | BLOCKED | Real reviewers/devices/accounts and source-bound records |
No gate is marked FAIL without fresh evidence of unacceptable behavior. No missing qualification is marked PASS. Historical source-specific acceptance may be reused where permitted and unchanged, but cannot establish final release readiness by itself.
+11
View File
@@ -0,0 +1,11 @@
# Release discovery handoff
Branch `planning/release-readiness-discovery`, baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`; documentation only. Stage 1 IN_PROGRESS, not complete. Full authoritative release prompt read. No final GO/NO-GO completion report or deployable release claimed.
Completed: initial source inventory, historical blocker reconciliation, preliminary 18-gate matrix and five fresh offline MariaDB runner guard tests. Preserved scoped PDF acceptance and separate model/provider/human/hosted/production gates.
Next authorised work: complete endpoint and environment census, map each failure boundary to existing test/runbook owners, and inspect remaining backup/restore/deployment implementation without executing it. Then prepare a concrete isolated-rehearsal plan. Final baseline/qualification depends on accepted roadmap source; do not run thousands of unchanged tests to fill this report.
Continuation: recovery implementation inspection and isolated rehearsal specification are now recorded in 11_BACKUP_RESTORE_ROLLBACK.md. RR-11 parser mismatch reproduced using three synthetic cases; RR-12/13 retain rollback/encryption qualification limits. Four source quarantine guard tests and shell syntax check passed. No deployment script execution. Next: endpoint/environment census, then remaining independent I18N/homepage audit work. Stage 1 remains IN_PROGRESS.
No production credentials/environment files were opened; no infrastructure, models, main branch or autonomous orchestrator changed. The earlier delegated researcher was interrupted by a service limit; parent supplied this partial checkpoint. No background agent remains active.
@@ -0,0 +1,19 @@
# RR-11 bounded remediation
Authorised by the owner's Continuous Roadmap Execution instruction explicitly prioritising this fix. Branch `codex/release-backup-parser`, based on published discovery `653f8d04d469dcd52c883d4b98bea76b8adacada`. Separate from CLEAN-20, full release qualification and infrastructure operations.
Replaced five inconsistent sed expressions with one stdlib Python parser and a shell-safe field transfer. Case-insensitive aliases, quoted separators/doubled quotes, Unicode and empty passwords survive to the dump command. Invalid ports, incomplete/ambiguous/control-bearing values and unsupported multi-host/socket/path forms fail before dumping. No eval; connection input travels via stdin, not argv; errors never include input. No dependency added. Existing dump/TLS/retention/rollback behavior is otherwise unchanged.
## Evidence
- Regression first: four test methods ran against the original backup function; eight subcase failures reproduced alias/case rejection and quoted-password truncation. Canonical/negative controls executed. No real dump or deployment.
- Final targeted suite: **5/5 methods PASSED**, including 7 host spellings, quoted semicolon/equal/doubled quote/shell characters, Unicode/single quotes, empty password, and six invalid/ambiguous input cases. Tests run the actual backup function and mock only external dump/Docker boundaries.
- Full offline script unittest set: **31/31 PASSED**, including targeted cases, ingress Compose rendering with synthetic env, workflow/runner guards, retry guard, supply-chain fixtures and offline model-evaluation helpers. No model invocation. Printed exit17/exit1 are expected mocked runner negative cases. Do not add targeted five to the overlapping total.
- Ordinary unittest discovery found zero tests because repository filenames contain hyphens; recorded as NOT A PASS. Explicit importlib loading of every `scripts/test-*.py` unittest module (excluding standalone Docker topology runner) executed the 31 tests. Docker topology qualification NOT RUN.
- Git Bash `bash -n deploy/deploy.sh`: PASSED.
- Graphify AST update completed locally: 18,504 nodes / 45,920 edges; missing optional PDF/SQL extractors reported. Newly generated untracked graph output retained locally, not a runtime verification or introduced repository artifact.
- Product/backend/frontend/full database/browser suites NOT RUN: this package changes only deploy parsing and its offline tests. Real dump/restore, Linux-host operational behavior, hosted CI and production validation remain NOT TESTED.
The first Unicode test attempt failed in the Windows test harness encoding before reaching product code; the harness was corrected to UTF-8, then passed. Parser stdin/stdout are explicitly UTF-8. No application user data or production credentials used.
Rollback: revert this bounded implementation commit to restore the prior parser (and its known limitation). No database/schema change needs reversal. RR-11 is FIXED AND OFFLINE-TESTED on this development branch; RR-12/13 and production remain open. No main merge/deploy authorised.
+10
View File
@@ -1,3 +1,13 @@
## Direct Phase 10 — 2 November 2026
- [x] P10-00: preserve/review the staged draft, verify baseline/evidence applicability and complete the [direct assessment](../redesign/phase-10/P10-00.md).
- [x] Publication gate: normal push and exact remote readback succeeded at `1692142` after the earlier Gitea failure; no hook bypass or server repair. Further progress is tracked in [the direct-roadmap register](../direct-roadmap/ROADMAP_STATUS.md).
- [ ] Owner gate: explicit approval of P10-01/CLEAN-20 only (`job-tracker-ui/src/App.css`), with the assessment's exact verification/rollback boundaries.
- [ ] After approval only: implement and qualify that candidate; commit, publish and independently verify the checkpoint. Stop at subsequent candidate/entry gates.
- [ ] P10-02–05 and later roadmap: preserve contracts and follow authoritative order from [continuity](../redesign/phase-10/HANDOFF.md). No later implementation is currently authorised.
The autonomous backlog orchestrator remains paused and untouched. Earlier TODO entries retain their historical dates and decisions.
## Phase7 final acceptance — 21 October 2026
P7-00–P7-12 implemented scope complete, CONDITIONAL GO; full1060backend/899frontend/351browser plus23contracts/56offline-sidecar passing. See [final report](../redesign/phase-7/p7-12/FINAL_ACCEPTANCE.md). Retain manual/provider/output/reliability qualifications and production NO-GO. Phase8 planning handoff conditional; implementation not started.
+226
View File
@@ -0,0 +1,226 @@
# Jobjakt — A3 Final Design Approval and Implementation Authorisation
I approve **A3 as the final Jobjakt UI/UX design foundation** and authorise its phased implementation across the application.
I have reviewed the design direction and am happy with the result.
This approval includes the consolidated A3 prototype, its established design system, navigation approach, layouts and connected workflows.
## 1. Confirmed design decisions
Preserve the approved A3 combination:
- Original A1 dashboard.
- D1 visual foundation.
- B1 application tracking.
- Labelled, grouped and collapsible desktop sidebar.
- Hybrid mobile navigation.
- CV editor on the left with live preview on the right.
- Full application-detail pages with contextual information on the right.
- Optional quick-preview panels.
- Career Profile overview first, with immediate editing actions.
- Calendar agenda first, with an optional month view.
- Automation controls under Settings.
- Contextual AI assistance.
- Optional, resumable dashboard onboarding checklist with on-demand walkthroughs.
Maintain the selected light/dark visual treatment and consistent responsive behaviour.
Do not restart design exploration or generate another five concepts.
Minor adjustments for implementation feasibility, accessibility and usability are permitted.
Consult me before making substantial changes to the approved visual direction or user journeys.
## 2. Implementation approval
I authorise the actual implementation of the approved A3 redesign within the appropriate Jobjakt development branches.
This includes:
- Shared design system.
- Typography and colours.
- Navigation.
- Dashboard.
- Application tracking.
- Application details.
- Job discovery.
- Career Profile.
- CV Builder.
- CV import.
- Cover letters.
- Calendar.
- Correspondence.
- Documents.
- Settings.
- Automation controls.
- Administration.
- Onboarding.
- Mobile layouts.
- Light/dark modes.
- Accessibility improvements.
The implementation must cover the actual application, not merely reproduce static prototypes.
## 3. Preserve existing functionality
The design handoff identifies 57 preservation groups and 34 routes.
Treat these as mandatory preservation requirements.
Do not remove, simplify or hide advanced functionality merely because it was not shown in the prototypes.
Preserve:
- Existing user data.
- Career Profile ownership and persistence.
- CV revisions and undo/redo.
- Document imports and exports.
- Application records.
- Authentication.
- AI permissions and qualification restrictions.
- Dashboard customisation.
- Administrative permissions.
- Existing integrations.
- English/Norwegian support.
- Future European localisation.
- Database compatibility.
- Existing accessibility functionality.
Maintain all relevant RD21 data-integrity protections.
## 4. Implementation sequence
Use the implementation milestones documented in the A3 handoff.
Subject to the authoritative dependencies and Phase 10 gates, organise implementation approximately as follows:
**UI-01 — Shared design system and navigation**
Implement foundational styles, typography, components, navigation, themes and responsive structures.
**UI-02 — Dashboard and applications**
Implement dashboard layouts, interactive widgets, application tracking, Kanban and application-detail experiences.
**UI-03 — Career Profile and CV workflows**
Implement the approved Career Profile, CV Editor, template, import and cover-letter experiences.
**UI-04 — Job discovery and application journeys**
Implement approved job-discovery layouts and connections to the existing application workflows.
Coordinate with INT-GLOBAL-JOBS-01 to avoid conflicting implementations.
**UI-05 — Supporting workflows**
Implement calendar, reminders, correspondence, documents, administration, settings and automation controls.
**UI-06 — Onboarding and mobile refinement**
Complete guided optional onboarding, mobile navigation, small-screen layouts and responsive interaction parity.
**UI-07 — Integrated qualification**
Run full preservation, accessibility, responsive, browser and application regression acceptance.
Use the authoritative A3 implementation plan where it specifies more precise dependencies or acceptance requirements.
## 5. Autonomous development
Continue working through the implementation milestones without asking me to approve every ordinary change.
You may autonomously:
- Implement approved designs.
- Refactor affected frontend components.
- Introduce reusable design-system components.
- Improve responsive layouts.
- Fix implementation defects.
- Add tests.
- Update translations.
- Run regression checks.
- Commit validated checkpoints.
- Update documentation.
Pause only when a genuine owner decision, mandatory gate or substantial design change is required.
If a task is blocked, record the blocker and continue independently eligible work.
Do not bypass Phase 10 cleanup approvals, required integration baselines or other authoritative development-entry gates.
## 6. Coordinate with the remaining roadmap
Continue the existing direct roadmap execution.
Do not use the autonomous orchestrator.
Coordinate A3 implementation with:
- Phase 10.
- Product Review.
- International Global Job Search.
- Full European localisation.
- Multilingual homepage redesign.
- Security audit.
- Release readiness.
Avoid duplicate implementations and unnecessary rewrites.
Use established accepted baselines, isolated branches and documented dependencies.
Do not treat provisional mockup content as actual product functionality.
## 7. Validation requirements
For each implementation milestone:
- Run relevant frontend tests.
- Run required backend tests where workflows are affected.
- Validate browser journeys.
- Validate mobile layouts.
- Check keyboard accessibility.
- Check translation behaviour.
- Check light/dark modes.
- Test preservation requirements.
- Compare implementation against the approved A3 design.
- Record regressions and failures.
The prototype validation results are useful design evidence, but they do not qualify the implemented application.
Real screen-reader, physical-device and human accessibility tests remain pending until actually completed.
Do not claim unperformed tests passed.
## 8. Git and release restrictions
The latest design checkpoint is `237c79b8`.
The roadmap continuation checkpoint is `286535be`.
Verify the actual commits, branches and ancestry before integrating work.
Preserve the existing worktrees and acceptance records.
Keep validated changes in development branches and commit checkpoints.
Do not spend time repairing Gitea as part of this design implementation.
If publication fails, preserve the local work, record the issue and continue eligible work without falsely claiming publication success.
Never merge into main or deploy production without explicit approval.
## 9. Final objective
Deliver the approved A3 experience throughout the real Jobjakt application.
I want a cohesive, modern, approachable and powerful product, with equally strong desktop and mobile experiences.
Preserve the application's advanced capabilities while making everyday workflows easier to understand and use.
**This is my final approval of the A3 design and authorisation to begin its staged development implementation.**
It is not approval for production deployment or for bypassing outstanding security and release gates.
Continue with the next authorised implementation milestone, maintaining durable progress reports and proceeding through independently eligible work without unnecessary interruptions.
@@ -0,0 +1,7 @@
# Application-tracking publication and next review
3 November2026. Implementation `98e9502af5039429fb6da45353e719a27e8aa22d` on codex/a3-ui-04 pushed successfully. Independent remote readback returned that exact hash. Committed manifest verification returned zero mismatches:20 sources and56 evidence files;80 exported assets are separately hashed.
Owner already accepted dashboard/onboarding and authorised this increment with **"Approve dashboard/onboarding and A3-IM04"**. Do not repeat that decision. Application-tracking Gate F is now pending in this chat, requesting progression to A3-IM05 discovery presentation/filters and permitted saved-search UX. This does not approve new international providers, geography behavior, licensing, live services or release.
See [qualification](APPLICATIONS_VALIDATION.md), [desktop detail](evidence/applications/browser/detail-en-light-1440.png), [mobile board](evidence/applications/browser/board-nb-dark-320.png). Preserve UI03/UI02 refs and the original integration d3d33837. Independent document-date ca519cac remains on its own branch; do not claim it is integrated here. Other independently eligible roadmap work may continue while this review is pending.
@@ -0,0 +1,39 @@
# A3-IM04 B1 applications and right context
3 November2026. Authorised by the owner's exact reply **"Approve dashboard/onboarding and A3-IM04"**. codex/a3-ui-04 starts at accepted dashboard receipt dc93b589, without merging the older design tree. Implementation preserves existing task, data, revision and permission owners.
## Result
Table and Board retain shared filters/search/counts, all columns, density, paging, saved views, selection/bulk/trash and precise status controls. Filters now use quiet separators instead of another rounded container; results/board cards follow the D1/B1 foundation. Board's contained horizontal scroller is explicitly named and keyboard-focusable; existing pickup/drop/cancel and exact-status menu remain. No feature/action was removed to match a mockup.
Full detail puts primary task content left and recorded context right above1000px. Context follows primary content in DOM and stacks below it on narrow/compact-preview layouts. Jump focuses the named context heading; Return focuses the current labelled task panel without route changes. Source/company/location/country/salary/tags and recorded dates remain visible across sections. Existing overview dates move into this shared context; missing dates remain unknown and date-only deadlines remain local calendar dates. Original detail disclosure, description/translation distinction, preparation/next action/activity and every tab/subtab stay available. No new API read/write is introduced.
Visual review reproduced an existing trust defect: a null nextStep claimed the application was fully prepared despite missing CV/letter data. Two EN/NB tests failed first; the existing message now says no next action is recorded and asks the user to review preparation, with informational severity. It no longer infers readiness from absence of a next action.
## Evidence and preservation
| Lane | Result / exact scope |
|---|---|
| Baseline |62 tests/7 suites PASSED before changes |
| Test-first contracts |Two missing-context failures; separately two false-readiness failures reproduced before their fixes |
| Final core frontend |69 tests/8 suites PASSED, including new focus/context/readiness cases, table/board/workspace, daily/trust loop and catalogue |
| Disjoint writer suites |57 tests/2 suites PASSED: application-assets and edit-job-revision.126 unique selected frontend cases across10 suites; reviewer52 and baseline overlap, never added |
| Backend preservation |88 tests PASSED, zero failed/skipped: ApplicationWorkspace, JobQueryParity, Rd21JobPersistence, JobApplicationsAuthorization, JobPipeline, JobApplicationsAppliedDateHistory. InMemory/isolated SQLite and mocked summarizer; no real models/providers or MariaDB |
| Typecheck / full lint / build |PASSED on final implementation sources; static export includes the copy correction |
| Browser |Actual built React with local synthetic API responses;16 configurations at320/390/768/1440 × EN/NB × light/dark.48 axe scans/captures, zero returned violations.16 search → Board → precise Waiting status → full detail → context jump/return → originating filtered Board journeys |
| Writes |16 PATCH status requests explicitly fulfilled by fixtures. Zero unexpected writes/page exceptions; no request reached a real backend. All external requests aborted. This is separate from backend service/controller tests |
| Independent review |No actionable findings.52 tests/3 suites passed independently but overlap core69. Native horizontal ArrowRight scroll behavior was not explicitly asserted by the browser verifier |
Tests retain sorting, page size, optional columns, shared query/view history/membership, saved-view account ownership, partial bulk failures, trash restore, custom statuses, precise menu, keyboard pickup/drop/Escape/focus, dirty-letter/answers navigation, coherent/stale Answers snapshots, legacy documents/correspondence/notes links, aggregate errors/retry, CV source revisions, attachments/history/frozen packages and edit revision conflict behavior. Secondary domain unit tests use controlled components/services; browser journeys above exercise the actual table/board/overview only. They do not establish successful live workflows for every task/document tab.
Intermediate verification exposed one old date-summary selector after moving that summary into context; corrected to the new named landmark, retaining checks for recorded and unknown dates. Typecheck caught an unsupported testing-library exact option; removed it. Both were resolved before final runs. Baseline/red native reports remain separate from green evidence. Source/evidence manifest binds final sources and exported assets. UI language still does not change source job content or document language.
## Open qualifications and rollback
No backend implementation, schema, dependency, route, permissions or revision writer changed. All57 inherited groups/34 route declarations remain; membership is not blanket functional/security acceptance. Canonical Career Profile/CV override/revision/RD21 contracts and physical document renderer remain untouched. No reason to reopen accepted PDF metrics or visuals.
Rollback this presentation increment on its branch; no data rollback. Existing application records, filters and saved views use the same owners. UI03 agenda compatibility remains documented separately. The independently published document-date patch ca519cac remains separate and is not silently included in these results.
NOT RUN: MariaDB, real service-backed browser/database end-to-end, hosted CI, native devices/touch/screen-reader/actual zoom, native-language review, licensed providers/live AI, final integrated security or release qualification. Final all-route integrated acceptance remains A3-IM10. Phase10, Product Review overall, Global Jobs, full Europe localisation, homepage and release gates remain open.
Next: publish/read back this increment, then required owner Gate F before A3-IM05 discovery presentation/permitted saved-search UX. Provider/geography expansion remains governed by the separate Global Jobs prerequisites and rights.
@@ -0,0 +1,9 @@
# Dashboard publication and Gate F receipt
3 November 2026. Implementation `c7d26d354c44b0bdd2976cf2f1c2b0737d7cc2d2` on `codex/a3-ui-03` was pushed successfully. Independent `git ls-remote --heads origin refs/heads/codex/a3-ui-03` returned the same full hash. Committed source/evidence manifest verification returned zero mismatches (23 sources,42 evidence artifacts; export hashes retained separately).
Navigation Gate F is accepted by the owner's exact reply **"Approve navigation and A3-IM03"**. Dashboard/onboarding Gate F is now pending; the question submitted in this chat requests acceptance and progression to A3-IM04 B1 application table/Kanban/full detail pages, retaining actions, revision/permission protections and right-side context. Do not begin that dependent work until answered. Independent localisation continues separately; no automatic branch combination.
See [qualification](DASHBOARD_VALIDATION.md) and [desktop capture](evidence/dashboard/browser/dashboard-en-light-1440.png), [mobile walkthrough](evidence/dashboard/browser/walkthrough-nb-dark-320.png). UI03's checklist item for owner acceptance remains open deliberately. This receipt does not accept Phase10, security or release readiness.
Git printed Windows filename-too-long warnings for unrelated Codex turn-diff checkpoint refs during commit. The application branch commit, source-manifest check, push and independent remote readback succeeded. No Git infrastructure/refs/hooks/configuration was repaired or bypassed. Worktree is clean except existing untracked generated graphify-out.
@@ -0,0 +1,39 @@
# A3-IM03 dashboard and onboarding qualification
3 November 2026. Owner accepted navigation992608c7 and explicitly answered **"Approve navigation and A3-IM03"**. This authorises this increment; the next milestone still requires Gate F review under the approved A3 implementation proposal. Publication receipt follows after committing.
## Implemented scope
New/reset defaults put Today first, Your week left and pipeline right, then metrics and retained analytics. Saved layouts retain order, hidden positions and geometry. All nine original widget IDs remain; one additive `agenda` ID is accepted by the existing schema2 server validator. Existing saved layouts append it hidden. No migration, endpoint or dependency change. Personal greetings use recorded first/display names only; unnamed accounts retain Dashboard.
Your week uses strictly parsed, recorded deadlines and follow-ups within seven local calendar days, from the existing attention feed. Date-only deadlines retain their calendar date and raw datetime attribute. Missing/free-text/invalid dates are omitted. It displays at most three entries and links to Reminders; it does not claim complete calendar or interview coverage. Full calendar remains A3-IM07 work.
Setup moves below the task dashboard. Existing dismissal keys still work; dismissal exposes a resume/walkthrough entry. Individual skips persist per owner and never increase completion. Completion remains based on the existing account/Career/mail/job reads. Walkthrough steps link to existing destinations, explain optional import/mail consent, support previous/next/close and focus return. No guidance action writes source data, grants access, or blocks manual tracking. Existing loading/error/retry remains.
## Fresh evidence
| Check | Result and boundary |
|---|---|
| Baseline | 71 frontend tests /9 suites PASSED before changes |
| Test-first new behavior | Six frontend failures reproduced before implementation; backend agenda acceptance failed before whitelist addition |
| Final selected frontend | 95 tests /12 suites PASSED, zero failed; dashboard/grid/CAS hook/customisation/presentation/onboarding/dates/control-loop/navigation/metadata/catalogue/provider. Baseline, red runs and reviewer45 overlap; do not add totals |
| Backend layout | 36 DashboardPreferencesTests PASSED, zero failed/skipped; isolated SQLite HTTP host, real owner/CAS/bounds/collision/legacy tests. New agenda test rejects unknown IDs and overlap. Focused green1 overlaps36 |
| Typecheck / full lint / build | PASSED on combined UI03 + localisation5e8a07d1 tree; zero-warning lint, fresh static export |
| Actual React browser | 16 configurations: widths320/390/768/1440 × EN/NB × light/dark; 32 whole-page axe scans, zero returned violations;32 PNGs |
| Connected journeys | All16: week dates/order, no overflow, desktop week/pipeline row, skip/reload/resume, dismiss/reload/resume, guide next/close/focus, hide agenda/save/reload |
| Write boundary | 16 explicit layout PUTs fulfilled by in-memory fixtures; zero unexpected writes/page errors. Guidance causes zero writes. Every external request aborted; Google Fonts attempts are not provider validation |
| Independent review | No actionable findings. Reviewer45 tests /3 suites PASSED, overlapping95; did not independently rerun backend/browser/build |
Native JSON/TRX, captures and source-bound hashes are in [evidence/dashboard](evidence/dashboard). Browser harness: `rtk proxy node scripts/verify-a3-dashboard.mjs` from job-tracker-ui against the static export on localhost4338. Browser persistence is controlled in-memory API behavior, separate from real backend SQLite tests; this is not an integrated database E2E pass. Screenshots use synthetic nurse, teacher and engineer data; English job descriptions in Bokmål UI are source content, not translated UI labels. Fixed-header placement in full-page scroll captures is a browser capture artifact, not a native-device result.
New catalogue keys are paired EN/NB and covered by catalogue QA. The existing widget-title dynamic domain now has ten IDs, including agenda, each backed by both catalogues. All188 historical dynamic reviews remain accounted for; full European localisation is still open. The independent mobile build-metadata fix is now combined and included in selected tests. Prior navigation/foundation evidence remains historical source-bound evidence, not a fresh full rerun.
## Preservation, recovery and open gates
Schema2 bounds, collisions, CAS and ownership remain in their existing owners. No route declarations or permission flags changed. Career Profile, CV/letter revisions, null-as-inherit overrides and RD21 owners are untouched. No physical document renderer changes warrant reopening accepted PDF metrics/visuals.
Rollback: revert this increment on the feature branch, retaining localisation5e8a07d1. No source job/profile data or database schema is changed. An old build may ignore/omit the new agenda preference on a subsequent layout save; all nine old widgets remain compatible. Production rollout/rollback qualification is still required before deployment. Existing layouts are never automatically reset.
NOT RUN: MariaDB, real backend/browser integrated journeys, hosted CI, native device/touch/screen reader/actual zoom, real provider/mail/model workflows, final integrated security, live recovery or release acceptance. No production services were accessed. Phase10 final acceptance and the wider roadmap remain open. The broader calendar and remaining A3 screens are not complete.
Next protected dependency: owner Gate F review of this dashboard/onboarding increment before A3-IM04 B1 application table/Kanban/detail implementation. Other independently eligible work remains authorised.
@@ -0,0 +1,7 @@
# Discovery publication and owner acceptance
3 November2026. Implementation `c9c6b1abc1f87a907d1e37062cfa5e2ed3fd933c` on codex/a3-ui-05 pushed successfully; independent remote readback matched. Committed source/evidence manifest had zero mismatches (14 sources,54 evidence files;80 exported assets separately hashed).
Owner then explicitly answered **"Approve discovery and A3-IM06"**. Discovery Gate F is ACCEPTED; do not ask again. Next authorised scope is Career Profile overview, CV library/editor/templates/import review and cover-letter presentation, preserving canonical ownership, editor-left/preview-right, null-as-inherit, undo/save/conflicts/history, frozen packages and RD21. Deferred CV-import engine overhaul remains excluded. This acceptance does not accept Global Jobs provider expansion, Phase10, final integrated security or release readiness.
See DISCOVERY_VALIDATION.md and UI-05.md for evidence/boundaries. The original integration/UI01–04 refs remain separate. Root security policy de3d5031 and document-date ca519cac remain on their independent branches and are not silently included.
@@ -0,0 +1,31 @@
# A3-IM05 existing discovery presentation qualification
3 November2026. Owner explicitly answered **"Approve applications and A3-IM05"**. Branch codex/a3-ui-05 starts at accepted application receipt172074e9. No older design tree or unrelated implementation branch merged.
Filters and saved searches form a left rail beside a single result list above1000px. Narrow screens preserve filters-before-results DOM order; Jump to results and Return to search filters move focus without requests or route changes. Source coverage explanation is above both columns. Existing query/location fields, sort, saved-search create/run/pause/delete/dismiss, source attribution/provenance/original links, Save-to-tracker route and busy/empty/error/retry owners remain unchanged. Added only three paired EN/NB labels. UI language does not translate source content.
This is presentation of the existing NAV workflow. No new country, provider, radius, taxonomy, matching or in-app full-description capability was fabricated. Global Jobs' future three-pane authorised-detail experience depends on GJ prerequisites, rights and actual data contracts. GJ-00 planning is separate; GJ-01+ acceptance/provider activation is not implied. Source master and initial planning pack were read at `E:\Storage\Projects\Active\Job tracker\docs\planning\global-jobs-prompts\` because this older integration branch does not contain that pack. The original external source's provider/prerequisite constraints remain intact.
| Evidence | Result and boundary |
|---|---|
| Baseline |21 discovery tests passed before edits |
| Test-first focus contracts |Two EN/NB missing-landmark failures reproduced before implementation |
| Final frontend |32 tests/3 suites passed: discovery23, provider6, catalogue3; reviewer23 and baseline overlap, not additional cases |
| Backend preservation |14 passed, zero failures/skips: JobDiscoveryControllerTests, SavedJobSearchSqliteTests, SavedJobSearchAlertTests. Synthetic HTTP handler/FakeDiscovery, InMemory/isolated SQLite; no live NAV/provider request or app worker activation |
| Types/full lint/build |Passed; new browser script also passed scoped zero-warning lint |
| Built React browser |16 conditions:320/390/768/1440 × EN/NB × light/dark;48 whole-page axe scans, zero violations,48 PNGs |
| Connected journeys |All16: initial guidance/no automatic provider search, keyboard jump/return, wide/stack geometry, three-occupation search, save nurse/Oslo query, pause alerts, manual saved run, retained original link, dismiss and separately confirmed deletion |
| Mutation boundary |80 explicit requests fulfilled only by in-memory fixtures:16 each create/pause/run/dismiss/delete. Zero unexpected writes/page errors. All external requests aborted; no real backend/provider writes |
| Independent review |No actionable findings;23 tests/one suite passed independently, overlapping32. Reviewer did not independently execute browser/backend |
Native reports/captures and source manifest: [evidence/discovery](evidence/discovery). Browser harness runs from job-tracker-ui: `rtk proxy node scripts/verify-a3-discovery.mjs`, against the static export on localhost4338. Synthetic nurse/teacher/engineer listings are fixtures, never represented as current live search results. Source data remains in its original language even in Bokmål UI.
Two harness defects were corrected: initial URL used a nonexistent /jobs/discover path instead of /discover; immediate uncheck assumed optimistic switch state. The final verifier clicks the control and waits for the existing backend-acknowledged state. No application behavior was weakened to satisfy either harness issue. Failed attempts are not passing journeys. Fixed bars can appear within full-page scroll captures; native-device layout is not qualified by those captures.
Existing unit coverage retains sorting/metadata, initial versus empty results, saved-list validation/loading/retry, per-search result boundaries, stale-free request snapshots, failure-retained drafts/toggles/deletion/dismissal, duplicate-start prevention, current-language errors without replay, and explicit mutation recovery. These are controlled contracts; the browser did not repeat every failure path or perform actual Save-to-tracker import.
No backend/schema/API/dependency/revision writer/route or physical document renderer changes. Existing owner/persistence/right checks stay with their services. Rollback reverts this UI increment; no database or data rollback. The separate ca519cac document-date patch and de3d5031 security policy are not silently combined here.
NOT RUN: live NAV/commercial providers, MariaDB, real backend/browser end-to-end, hosted CI, native screen-reader/device/touch/actual zoom/native-language review, final integrated security/recovery/release. Complete Product Review, Global Jobs, European localisation and Phase10 remain open. No production/main changes.
Next protected dependency: publish/remote verify and owner Gate F before A3-IM06 Career overview/CV/letter workflows. Deferred CV-import engine overhaul remains excluded; canonical Career Profile, null-as-inherit settings, undo/save/conflict/history and RD21 must be preserved.
@@ -0,0 +1,216 @@
# Jobjakt — Gate F Approval and Continued Autonomous Development
## Owner decision: APPROVED
I approve the **A3 UI-01 Foundation checkpoint under Gate F**.
The approved checkpoint includes:
- Updated palette and typography.
- Shared UI controls.
- Quieter, more consistent surfaces.
- Light and dark theme foundations.
- English and Norwegian compatibility.
- Responsive foundation across the tested viewport widths.
Reported verification:
- 35 targeted tests passed.
- 48 scoped browser/accessibility checks passed.
- TypeScript typecheck passed.
- Lint passed.
- Build passed.
- Application commit: `bdd1de0d`.
- Latest branch receipt: `0d6de714`.
- Remote publication verified.
This approval authorises progression beyond the foundation increment.
It does not constitute production acceptance or waive unperformed integration, accessibility, security or release testing.
## 1. Continue A3 implementation
Proceed immediately with the next authorised A3 milestone: **navigation**.
Preserve the approved A3 design direction:
- D1 visual foundation.
- Original A1 dashboard.
- B1 application tracking.
- Labelled, grouped and collapsible desktop sidebar.
- Hybrid mobile navigation.
- CV editor left and live preview right.
- Full application-detail pages with contextual information on the right.
- Career Profile overview first.
- Calendar agenda first, with month-view option.
- Automation controls under Settings.
- Contextual, optional AI assistance.
- Optional, resumable onboarding.
Do not restart design exploration.
## 2. Complete as much authorised work as possible
I want you to continue development autonomously, making substantial progress without unnecessary interruptions.
After navigation, proceed through the remaining A3 milestones in their approved dependency order:
- Dashboard and application tracking.
- Application details.
- Career Profile.
- CV Builder and import workflows.
- Cover-letter editing.
- Job discovery.
- Calendar and correspondence.
- Documents and administration.
- Settings and automation.
- Optional onboarding.
- Responsive mobile refinement.
- Integrated UI/UX qualification.
Follow the actual approved A3 implementation plan and existing preservation requirements.
For each increment:
1. Inspect the existing implementation.
2. Implement the approved changes.
3. Fix bounded defects.
4. Run relevant tests.
5. Validate responsive layouts and both themes.
6. Verify English/Norwegian behaviour.
7. Check accessibility.
8. Verify preservation of existing functionality.
9. Commit validated changes.
10. Push where available.
11. Record evidence and continuation status.
12. Proceed to the next authorised increment.
Avoid repeatedly asking permission for ordinary reversible implementation decisions already covered by the approved design.
## 3. Milestone approvals
I want maximum autonomous progress, but genuine mandatory owner gates remain in force.
Where the approved implementation plan requires an owner milestone review:
- Complete the increment.
- Prepare the review evidence and screenshots.
- Record the exact proposed next scope.
- Request the required approval.
- Do not bypass that gate.
While awaiting approval, continue other independently authorised tasks that do not depend on the blocked milestone.
Do not treat my Gate F approval as blanket approval of all future protected gates.
Where the authoritative plan allows automatic progression, proceed without stopping.
## 4. Preserve the complete application
The A3 design handoff identifies 57 preservation groups and 34 routes.
Ensure every existing function remains available unless removal has been separately authorised and qualified.
Pay particular attention to:
- Career Profile persistence.
- CV revisions and undo/redo.
- Existing CV and cover-letter documents.
- Imports and exports.
- Authentication and account security.
- Job application data.
- Dashboard customisation.
- Administration permissions.
- RD21 data-integrity protections.
- Existing integrations and automations.
Do not simplify away advanced features merely because they were absent from a design prototype.
## 5. Continue the wider roadmap
Continue independently eligible work across:
1. Phase 10 completion and acceptance.
2. PRODUCT-REVIEW-01.
3. International Global Job Search.
4. Full European localisation.
5. A3 application UI/UX implementation.
6. Multilingual homepage redesign.
7. Security audit and remediation.
8. Release-readiness preparation.
Respect dependencies, explicit owner decisions and authoritative acceptance gates.
Coordinate Global Job Search, translations and A3 so their implementations do not conflict.
Do not repeat accepted work unnecessarily.
## 6. Blockers and continuation
If a task cannot proceed:
- Record the exact blocker.
- Identify its impact and dependency.
- Preserve completed work.
- Continue another independently eligible task.
- Revisit the blocker only when new evidence or an approval makes progress possible.
Maintain the existing durable roadmap continuation records.
Do not build or reactivate the autonomous orchestrator.
Do not spend development time fixing unrelated Git infrastructure issues.
Never claim unsuccessful publication or unperformed tests passed.
## 7. Validation expectations
Continue targeted verification throughout development.
Run broader regression suites when required by the approved milestone gates.
Keep these statuses distinct:
- Implemented.
- Tested.
- Accepted.
- Published.
- Production-ready.
The UI-01 browser checks do not qualify real backend journeys, native-device accessibility or integrated security.
Those requirements remain open.
## 8. Git and production restrictions
Use the existing authorised development branches and worktrees.
Verify the correct integration baseline before combining workstreams.
Commit and publish validated checkpoints when possible.
Do not merge into `main`.
Do not deploy production.
Do not activate unqualified AI models.
Do not perform destructive migrations without approval.
## Final instruction
**Gate F is approved for the A3 UI-01 Foundation checkpoint.**
Proceed immediately to navigation implementation.
Then continue through as much of the remaining authorised A3 overhaul and wider Jobjakt roadmap as possible.
Prioritise completing functional, integrated user journeys rather than accumulating disconnected partial implementations.
Minimise unnecessary interruptions.
Pause only for genuine mandatory decisions, and continue independent work whenever another task is blocked.
Keep the roadmap, test evidence and remaining approval items updated.
Do not merge into main or deploy production.
@@ -0,0 +1,39 @@
# A3-IM02 navigation validation and review
Status: implemented and tested; owner Gate F navigation review remains OPEN before dashboard/onboarding A3-IM03. Foundation Gate F is already accepted, not reopened. See UI-02.md for preserved owners and exact next scope.
## Fresh scoped evidence
| Check | Result / scope |
|---|---|
| Baseline | 15 tests / 3 suites PASSED before navigation edits; BASELINE.json |
| New primary-navigation tests | Five expected failures before implementation; desktop preservation case already passed |
| Current-route regression | Reproduced drawer staying open; fixed in shared handler; red/green case retained |
| Final selected Jest run | 49 tests / 9 suites PASSED; FINAL_TESTS.json. Intermediate32/17 and reviewer11 overlap this total, not extra cases |
| Typecheck / lint / production build | PASSED; built static export used API base /api for controlled loopback checks |
| Real React screen matrix | 32 conditions: login + Companies × 320/390/768/1440 × EN/NB × light/dark |
| Dialog and navigation accessibility | 56 scoped axe sweeps, zero returned violations: 32 complete screen surfaces, 16 company dialogs, 8 mobile More drawers |
| Connected browser checks | 16 configurations: primary route selection and heading focus, secondary navigation, collapse persistence or More/Escape/current-route selection, reviewed synthetic company edit/save and phone notification clearance |
| Primary routes | All four primary shell destinations visited in each configuration (64 transitions). API-unavailable content states are permitted; this verifies navigation/focus, not successful domain/backend journeys |
| Write safety | 16 explicit company PUTs intercepted and fulfilled by local browser fixtures; zero requests reached a backend. Unexpected write methods/paths rejected; no unexpected writes or page exceptions observed |
| Captures | 56 PNGs: 32 screens + 8 More drawers + 8 collapsed desktop/tablet + 8 phone notification states |
| Preservation census | All 57 inherited groups retained; all 34 inherited route declarations present. Source membership is not complete functional or authorisation acceptance |
| Independent source review | No important/critical findings. Conservative extra safe-area clearance noted; native notched-device review still pending |
The browser lane is the actual built React application, with controlled service responses, not the design prototype. It rejects every external request; 40 existing Google Fonts attempts were aborted. Provider/model/production services were never contacted. Only Companies has a successful synthetic mutation fixture; other core destination content may display honest unavailable-service states. No model was started. Main document/page renderer sources are unchanged.
During verification, a mistyped translation test path produced a failed harness run (two real suites/eight cases passed); corrected to the existing catalogue/provider files, then final nine-suite run passed. A broad alert selector also matched Next's route announcer; narrowed to the actual Snackbar feedback. These are resolved harness defects, not hidden passing tests. Layout review reproduced broken English labels at320px: content-based flex widths with minimum44px targets fixed them while retaining11px labels and long-text wrapping. The final browser assertions require Dashboard and Applications to fit one line in English.
No original concepts were regenerated. No route, advanced workflow, permission, document revision, schema, dependency, controller or production configuration was removed. Route declarations are unchanged; navigation grouping is changed deliberately. Existing admin visibility flags, router/legacy redirects, quick search, notification count semantics, desktop storage and ownership disposal remain in their existing owners.
## Review examples
- [Phone navigation](evidence/navigation/companies-en-light-320.png).
- [Bokmål dark desktop](evidence/navigation/companies-nb-dark-1440.png).
- [More drawer](evidence/navigation/more-en-light-390.png).
- [Notification above the bar](evidence/navigation/feedback-nb-dark-320.png).
- [Collapsed sidebar](evidence/navigation/collapsed-en-light-1440.png).
Run the installed harness from job-tracker-ui against the current static export on loopback port4338: `rtk proxy node scripts/verify-a3-theme.mjs --navigation`. This mode writes only evidence/navigation; historical foundation artifacts stay unchanged. SOURCE_MANIFEST.json binds final source, native reports, captures and exported assets. Historical foundation source hashes remain bound to bdd1de0d, not falsely reused as new navigation results.
NOT RUN: real database/backend workflows, hosted CI, real identity/mail/job providers, AI models, physical PDF/container requalification, native screen reader/touch/software keyboard, actual browser zoom, native-language review, final integrated security or release-readiness acceptance. Those gates remain separate. Full A3 UI/UX implementation is not complete.
+38
View File
@@ -0,0 +1,38 @@
# UI-01 — approved A3 foundation implementation
Status: A3-IM01 foundation ACCEPTED under Gate F by explicit owner attachment a178edeb-c3ef-4c0e-b4c2-bcd1ca84b90b, 3 November 2026. Do not repeat that approval request. Navigation A3-IM02 proceeds on codex/a3-ui-02; see UI-02.md. Original implementation branch `codex/a3-ui-01`, isolated integration worktree. Base `d3d338376444b8abdcaf7200f682faa3daf1ad10`; design source `237c79b8cb3e280d7e4d1ef95cdbb2c77bb81c69`; roadmap receipt `286535bef046417a09a156685c937e8be9155147`.
Owner's 3 November 2026 attachment explicitly approves the final A3 foundation and staged real-application implementation. Verbatim authorisation is retained in A3_APPROVAL.md. Gates C/D/E are approved for that scope; deployment, Phase 10, security/provider/native/device/release gates are not waived.
## Task ledger and verification plan
- [x] Verify branch/commits and use accepted integration baseline; preserve existing worktrees. Created implementation branch in the already isolated integration worktree, keeping its original branch ref unchanged. No wholesale merge of the older design tree.
- [x] Baseline: four existing theme/dialog suites, 28 tests PASSED before production edits.
- [x] A3-IM01: approved D1 palette, typography, quiet surfaces and shared controls implemented through existing theme.ts. Added visual-contract regression checks; retained semantic contrast, theme/system persistence, focus, reduced-motion, density and dialog checks.
- [x] Targeted tests, types, lint, production build and actual application browser checks in EN/NB, both themes and mobile/desktop. See VALIDATION.md for exact source scopes and pending human/zoom checks.
- [x] Validated checkpoint `bdd1de0dd3259e4e9e9f46c81948f865317c6054` committed, pushed to origin/codex/a3-ui-01 and independently confirmed by git ls-remote. No infrastructure repair. Subsequent documentation receipts do not change this immutable application/evidence identity.
- [x] Gate F foundation review approved by the owner in GATE_F_FOUNDATION_APPROVAL.md. Navigation is A3-IM02, separately implemented and reviewed.
Scope reaches the existing ThemeProvider and every MUI theme consumer, including navigation semantic colours and shared fields/buttons/cards/dialogs. Preserve component APIs, routes, application state, server data ownership, RD21 and physical CV/PDF renderers. No dependency, API or database changes. Existing semantic status colours must retain readable contrast on all new surfaces; dividers are decorative and do not replace stronger essential field boundaries.
Ruling: use targeted shared-theme/dialog/state checks and relevant browser workflows rather than thousands of unrelated tests, following the owner's explicit evidence/testing instructions. Backend tests are unnecessary unless backend behaviour is changed. Prototype tests are not application qualification.
Ruling: approved global MUI roles will also be inherited by existing public React consumers; this is shared theme plumbing, not selection or implementation of a new homepage layout/claims/SEO. Keep the existing gradient API and physical document rendering untouched. Later launch-site decisions remain separate.
Rollback: revert this UI increment on its development branch; no persisted data/schema change. Re-run affected theme/layout checks. Never reset unrelated work or alter the autonomous orchestrator.
## Implemented behaviour
Shared MUI theme now uses approved violet canvas/text/accent/navigation roles in both schemes; existing state synchronisation/storage remains unchanged. App chrome uses the approved system font stack, more readable body rhythm and responsive page-title hierarchy. Shared cards use restrained borders without floating section shadows. Buttons use sentence case and 44px base height; outlined fields retain their notched focus indicator and now have a 44px base height. Existing density hit-region rules remain in force. Actual navigation structure and feature layouts are not represented as implemented yet.
Contrast verification exposed the old dark error role at 4.275:1 on the new elevated surface. Corrected dark error main/darker fills to #FF8A80/#FF7067 with explicit dark contrast text; thresholds were not lowered. Final semantic contrast tests pass, and code review checked standard alert text against composited surfaces. CV/template/letter previews use isolated document HTML; physical renderer source, fonts, metrics, fixtures and historical document acceptance were not changed.
Independent code review: no important/critical findings. Accepted minor recommendation to assert every collected scoped axe violation array, rather than only colour contrast. Reviewer's 16 theme tests overlap the final 30 and must not be added to them. Initial two-width browser artifact was superseded by the final four-width run, not added as extra coverage.
## Continuation and review gate
Actual selected validation: 30 theme/state/dialog tests in five suites plus five disjoint navigation/CV-thumbnail tests in two suites; baseline28 and review16 are overlapping and excluded from that35. Full typecheck/lint/build passed. Final actual React browser lane:32 screen conditions,16 keyboard dialog journeys,48 scoped axe sweeps with zero returned violations,32 screenshots, zero page exceptions or attempted backend writes. All32 existing Google font requests aborted. No physical document or native/human acceptance reopened.
Historical pre-approval gate note (now satisfied by the explicit attachment above): the approved design handoff `docs/product-modernisation/08-a3-handoff/IMPLEMENTATION_PROPOSAL.md` at design checkpoint237c79b8, A3-IM01 row says "Owner milestone review before next increment." User's ordinary-implementation authorisation persists; do not ask about individual reversible changes after the relevant milestone entry is authorised.
Next UI task after that review: retain all34 routes and57 groups while implementing the approved labelled grouped/collapsible desktop sidebar and hybrid mobile navigation through existing AppShell/router owners. Do not merge this branch into main or activate deployment. The original codex/direct-roadmap-integration ref remains at d3d33837; its existing isolated worktree is currently checked out on codex/a3-ui-01. Generated graph is untracked (18,714 nodes/46,204 edges). Design approval record b7051a3e is local-only on the prototype branch; do not publish that restricted branch.
+27
View File
@@ -0,0 +1,27 @@
# A3-IM02 — navigation
Status: IMPLEMENTED and TESTED; Gate F navigation review OPEN before the next dependent increment. Branch codex/a3-ui-02 from approved foundation receipt 0d6de714. Owner attachment a178edeb-c3ef-4c0e-b4c2-bcd1ca84b90b explicitly accepts foundation Gate F and authorises navigation; later protected milestone reviews remain separate. Verbatim approval: GATE_F_FOUNDATION_APPROVAL.md. Publication receipt is recorded in the continuing roadmap handoff.
Review [navigation evidence and screenshots](NAVIGATION_VALIDATION.md): final 49 tests / 9 suites; typecheck/lint/build; 56 scoped browser accessibility sweeps with zero violations; 56 captures; 16 configurations with primary/secondary navigation, focus/persistence, controlled company save and phone feedback clearance. No live backend qualification. Native/human/device/zoom and final integrated security/release gates remain open.
Tasks: inspect existing owners/callers and baseline tests; add failing mobile/route-preservation tests; implement five-destination hybrid navigation through AppShell, promote Discovery in existing App nav groups, retain every secondary tool/permission/route; reserve mobile clearance for feedback and actions; verify targeted tests, typecheck/lint/build, actual controlled-API browser journeys in both languages/themes/viewport classes; commit/push/read back; prepare next scope and required Gate F review.
No API/schema/dependency or physical document changes. Existing theme/state/router/dialog/toast owners remain. Keep desktop collapse persistence, route-heading focus, skip link, command palette, notification semantics, account menus, legacy redirects and admin guards. Use existing 768px small breakpoint for hybrid mobile navigation, matching compact header controls and the approved tablet sidebar arrangement.
Baseline navigation/notification/readiness results remain separate from final totals. UI-01's35/48 evidence qualifies its own foundation scope only. After this increment, A3-IM03 dashboard/onboarding and A3-IM04 application layouts await the source-defined next milestone review; other independent roadmap work may progress while that decision is pending.
## Implemented scope
The existing AppShell now provides Dashboard, Applications, Discover, Career and More on phones. More and the existing header trigger open the same accessible MUI drawer, retaining all secondary destinations. Career includes builder deep links; Applications includes job/detail/legacy aliases. Secondary tools select More. Visible primaries are derived from the existing permitted navigation tree; hidden ancestors are pruned. No new route or permission system.
Desktop retains labelled/grouped navigation, whole-sidebar collapse persistence and secondary menus. Discovery is now a primary Job Search item. Reminders, correspondence, analytics and existing Operations are workspace destinations; companies/offers/trash, CVs/documents, accounts and admin tools remain accessible. No route declarations removed or rewritten.
The bottom bar is measured, so wrapped labels/safe areas reserve actual space in main padding, native scroll clearance and existing Snackbar positioning. Notifications and feedback remain above the bar. Desktop/public contexts retain zero bar clearance. Native notched-device review remains pending; existing safe-area padding adds a conservative extra gap after the measured bar.
Regression found/fixed: choosing the current destination returned before closing the mobile drawer. The shared handler now closes it and focuses the heading after the transition, while Escape still returns to the opener. Red/green unit regression and browser checks cover it. No unsaved-document guard, persistence, API or physical renderer is replaced.
Independent read-only review found no important/critical findings; reviewer 11 tests overlap the final selected suite and are not additional evidence. All 188 historical dynamic-call reviews remain accounted for; four new static EN/NB navigation keys were added with catalogue parity checks. No new European language was advertised or enabled.
## Next proposed scope / protected review
Gate F navigation review required before dependent A3-IM03. Proposed next scope: approved A1 dashboard hierarchy and optional resumable onboarding using existing DashboardView/grid/layout/checklist owners; preserve schema-2/CAS, hidden positions/gaps, collision handling, drag/resize/keyboard alternatives, existing-data completion, skip/resume and notification behaviour. No schema migration, new provider/model or loss of widgets. Then prepare that increment's targeted state/browser/preservation evidence and review. Existing A3 approvals persist; request only this mandatory milestone entry, not a new overall design choice.
+20
View File
@@ -0,0 +1,20 @@
# A3-IM03 — A1 dashboard and optional onboarding
Status: IMPLEMENTED / VALIDATED; publication and owner Gate F review tracked in DASHBOARD_VALIDATION.md. Owner explicitly answered the navigation Gate F question: **"Approve navigation and A3-IM03"** on 3 November 2026. Approved navigation checkpoint992608c7 remains immutable. Branch codex/a3-ui-03 starts there, with the independently validated small localisation patch d4b938fa applied as5e8a07d1. No wholesale merge of the older i18n/theme tree. Combined checks qualify this integration only for the stated scope.
## Scope / task ledger
- [x] Read existing DashboardView, OnboardingChecklist, DashboardGrid/layout/hook/editor, source-backed completion tests, backend DashboardLayout reader/validation and current A3 contracts.
- [x] Baseline dashboard/grid/layout/onboarding and combined navigation/metadata checks.
- [x] Task-first A1 defaults for new/reset layouts; existing geometry, schema2/CAS and controls preserved. Additive agenda ID is the only server contract change (ruling below); no migration.
- [x] Quiet hierarchy, personal greeting when a recorded name exists, movable week glance beside pipeline; reporting retained. Week coverage limited to recorded attention-feed dates.
- [x] Optional owner-scoped setup, skip/resume and on-demand walkthrough; skips never count as completed data. Guidance controls do not mutate source data or grant consent.
- [x] Targeted regression, types/lint/build and fixture-backed browser journeys across languages/themes/viewports; physical renderer unchanged.
- [x] Independent read-only review: no actionable findings; reviewer45 tests overlap final95.
- [ ] Commit/publish/read-back and next Gate F owner review. Do not begin A3-IM04 before approval; continue unrelated eligible work.
Preservation:57 groups/34 routes remain; all nine existing widget IDs remain supported. Career Profile stays canonical, account identity remains separate, old dismissal keys remain compatible, owner disposal prevents cross-account state. Existing layout persistence and rendering logic stay in their owners. Legacy version1 preferences keep their recorded order; schema2 coordinates are not repacked on load. API/provider/model/backend/production qualification remains distinct from controlled browser evidence.
Ruling: the week panel must be separately movable/hideable to reproduce A1's week-left/progress-right row. Add one `agenda` widget ID to the existing catalogue and server JSON whitelist; no schema migration or new endpoint. Keep all nine old widgets and their saved coordinates. Existing saved layouts append the new widget hidden; only new/reset defaults show it. Backend parser/CAS/bounds/collision protections remain unchanged and require targeted regression. The earlier plan's "no backend contract change" assumption is superseded by this small additive ID; no new calendar/provider service is introduced.
Next dependency after review: A3-IM04 / approved B1 application tracking/detail work. No automatic advance through a future protected owner gate.
+17
View File
@@ -0,0 +1,17 @@
# A3-IM04 — B1 applications and persistent right context
Owner reply3 November 2026: **"Approve dashboard/onboarding and A3-IM04"**. Dashboard implementation c7d26d35 and publication receipt dc93b589 are accepted for progression. Isolated codex/a3-ui-04 starts at dc93b589; no older design-tree merge. A3 frozen design237c79b8 and original five concepts remain unchanged.
## Bounded implementation plan
- [x] Baseline62 tests/7 suites passed before edits.
- [x] B1 quiet filter/results surfaces and compact board cards through existing MUI owners. Existing density/sort/filter/page/columns/saved views/bulk/trash owners retained.
- [x] Persistent right context above1000px; context follows the task in DOM and narrow/compact layouts. Named jump/return controls. Existing dates moved, next action/preparation/activity/details and tabs retained.
- [x] Full-page/preview, list return/focus, unsaved guards, source language, precise status menu and revision writers retained. Corrected reproduced unsupported fully-prepared claim when next action is absent.
- [x] Test new focus/navigation contract first; final126 selected frontend,88 backend, types/lint/build and16 controlled browser journeys/48 scans/captures passed. Limits in APPLICATIONS_VALIDATION.md.
- [x] Independent read-only review: no actionable findings; reviewer52 tests overlap selected totals.
- [ ] Final source-bound evidence, coherent commits, publish/remote verify and Gate F before A3-IM05.
Affected callers: JobTable's jobs/trash/table/board modes; Kanban card/status navigation; ApplicationWorkspace full-page and overlay callers, primary/secondary tabs; shared EN/NB keys/tests/browser fixtures. APIs, persistence, schema, permissions and physical document rendering are unchanged. No provider/model calls, database migrations or dependency changes.
Rollback: revert this presentation increment on its branch; no data rollback. Do not modify revision writers just to ease fixtures. Remaining breadth must stay OPEN until qualified; baseline tests alone are not complete IM04 or Phase10 acceptance.
+13
View File
@@ -0,0 +1,13 @@
# A3-IM05 — discovery presentation and existing saved searches
3 November2026 owner reply: **"Approve applications and A3-IM05"**. Application implementation98e9502a/publication receipt172074e9 accepted for progression. Isolated codex/a3-ui-05 starts at172074e9. No new international provider or geography authorization is inferred.
## Bounded plan
- [x] Baseline21 existing discovery tests passed.
- [x] Filter/saved-search rail left, result list right above1000px; narrow logical stack and named jump/return focus. Existing source explanation prominent.
- [x] All existing handlers/semantics retained; no unsupported provider/country/radius controls or API changes.
- [x]32 selected frontend/3 suites,14 mocked-provider/local backend tests, type/lint/build,16 controlled browser journeys/48 scans/captures passed. Independent review found no actionable issue; reviewer23 overlaps32.
- [ ] Publish/readback, Gate F before A3-IM06 Career/CV/letter work.
Callers: JobDiscoveryPage, its EN/NB messages, tests and browser fixtures only. Existing API/data/provider owners retained. Canonical occupation/geography expansion remains Global Jobs work with its own prerequisites and permissions; GJ-01+ is not accepted by a presentation change. Rollback reverts presentation/tests; no migration or data rollback. Preserve source ads and generated-content language distinction.
+33
View File
@@ -0,0 +1,33 @@
# A3-IM01 — implementation validation
3 November 2026. This qualifies a bounded shared-theme increment in the actual React application. It does not qualify the entire A3 redesign, Phase 10, Product Review, international discovery, European localisation, security or release readiness.
| Check | Result | Scope |
|---|---|---|
| Existing baseline | PASSED: 28 tests / 4 suites | Theme contrast/state, loaded company states and dialog flow before edits. BASELINE.json |
| A3 visual contract before implementation | FAILED as expected: 2 tests | Old light/dark canvas values differed from approved A3; no production code had been changed |
| First new-palette regression | FAILED, corrected | Dark error text 4.275:1 on new elevated surface; changed colour, retained 4.5 threshold |
| Final targeted theme/state/dialog tests | PASSED: 30 / 5 suites | Includes the baseline 28 and 2 new A3 visual-contract cases; not 58 independent tests. THEME_TESTS.json |
| Additional preservation checks | PASSED: 5 / 2 suites | Existing CV thumbnail/template rendering and shell navigation; disjoint from the 30 theme/state/dialog cases. PRESERVATION_TESTS.json |
| Typecheck | PASSED | npm run typecheck, no incremental cache |
| Lint | PASSED | npm run lint, zero-warning policy |
| Static production build | PASSED | npm run build with NEXT_PUBLIC_API_BASE_URL=/api for controlled loopback browser checks; no deployment |
| Actual React screen matrix | PASSED: 32 conditions | Login and loaded Companies × 320/390/768/1440px × EN/NB × light/dark |
| Company dialog keyboard journeys | PASSED: 16 | Keyboard edit/open, visible focus, Escape and focus return; actual MUI controls |
| Scoped axe sweeps | PASSED: 48, zero returned violations | 32 main surfaces + 16 dialogs; rule tags WCAG2 A/AA, 2.1AA, 2.2AA. Excludes shell/navigation from the main-surface sweep; not full WCAG conformance |
| Actual form validation | PASSED: 16 screen variants | Empty login submit marks required fields invalid and focuses first field; no authentication POST |
| Root reflow / colours / locale | PASSED in screen matrix | Actual built app body palette and html lang/scheme, no root overflow at the tested widths |
| Source review | PASSED for bounded patch | Independent reviewer found no important/critical issue; physical document frames/renderers retain font ownership |
| Graph | AST-only refresh completed | Generated graph untracked; no model/semantic graph call |
`evidence/BROWSER.json` records every screen/dialog scope, page exceptions, attempted writes and blocked external requests; `scripts/verify-a3-theme.mjs` reproduces it from the static export served locally on port 4338 by the existing serve-export script. All API responses are controlled synthetic fixtures, all write methods are rejected, and every remote request is aborted. No backend, production data, model, identity provider or mailbox was contacted. This is actual application rendering with controlled service responses, not live-service acceptance.
The first browser run reached all its two-width screen/dialog assertions but failed its final no-external-attempt assertion because the existing page head requests Google Fonts. The harness was corrected to permit only that **blocked** known font origin, retaining all aborts and rejecting any unexpected origin. The final four-width run supersedes that result. No remote font was downloaded. Removal/localisation of existing font imports requires separate caller/renderer review; it was not performed here.
Lint initially rejected CommonJS require imports in the new browser harness. Converted the harness to the project's existing ES-module script convention rather than suppressing lint rules or changing lint configuration. The final .mjs run and full lint supersede the failed intermediate harness check. No application source changed during this conversion.
Evidence has 32 populated screen screenshots. The built application's sidebar structure is still the existing one: only its shared semantic colours changed. Do not present these captures as completed A3 navigation or A1 dashboard implementation. The prototype's 480 conditions/50 axe sweeps are separate historical design evidence and are not included in these application counts.
NOT RUN: real backend flows, full application regression, native screen reader, physical touch/software keyboard, actual browser zoom, native-language review, final integrated security, live provider/model, physical PDF/container requalification, backup/restore or hosted CI. Source-defined acceptance for those scopes remains open. Pending zoom/human checks prevent a claim of complete accessibility acceptance.
Reproduce sequentially from job-tracker-ui with installed dependencies: targeted Jest paths recorded in native JSON reports, npm run typecheck, npm run lint, NEXT_PUBLIC_API_BASE_URL=/api npm run build, serve-export on local port 4338, then `rtk proxy node scripts/verify-a3-theme.mjs`. Rebuild when application source changes; the evidence manifest binds source and exported assets to this checkpoint.
File diff suppressed because one or more lines are too long
+505
View File
@@ -0,0 +1,505 @@
{
"rows": [
{
"screen": "login",
"width": 320,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 320,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 320,
"language": "en",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 320,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 320,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 320,
"language": "en",
"mode": "dark",
"violations": []
},
{
"screen": "login",
"width": 320,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 320,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 320,
"language": "nb",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 320,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 320,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 320,
"language": "nb",
"mode": "dark",
"violations": []
},
{
"screen": "login",
"width": 390,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 390,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 390,
"language": "en",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 390,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 390,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 390,
"language": "en",
"mode": "dark",
"violations": []
},
{
"screen": "login",
"width": 390,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 390,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 390,
"language": "nb",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 390,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 390,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 390,
"language": "nb",
"mode": "dark",
"violations": []
},
{
"screen": "login",
"width": 768,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 768,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 768,
"language": "en",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 768,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 768,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 768,
"language": "en",
"mode": "dark",
"violations": []
},
{
"screen": "login",
"width": 768,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 768,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 768,
"language": "nb",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 768,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 768,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 768,
"language": "nb",
"mode": "dark",
"violations": []
},
{
"screen": "login",
"width": 1440,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 1440,
"language": "en",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 1440,
"language": "en",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 1440,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 1440,
"language": "en",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 1440,
"language": "en",
"mode": "dark",
"violations": []
},
{
"screen": "login",
"width": 1440,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "companies",
"width": 1440,
"language": "nb",
"mode": "light",
"geometry": {
"overflow": false,
"background": "rgb(255, 255, 255)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 1440,
"language": "nb",
"mode": "light",
"violations": []
},
{
"screen": "login",
"width": 1440,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "companies",
"width": 1440,
"language": "nb",
"mode": "dark",
"geometry": {
"overflow": false,
"background": "rgb(40, 35, 52)"
},
"violations": []
},
{
"screen": "company-dialog",
"width": 1440,
"language": "nb",
"mode": "dark",
"violations": []
}
],
"errors": [],
"writes": [],
"blockedExternalRequests": [
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com"
],
"scope": "actual static-export React application with controlled API; existing remote font requests aborted; no backend or provider qualification"
}
@@ -0,0 +1 @@
{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":2,"numPassedTests":5,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":2,"numTotalTests":5,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1793671502665,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":66,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"template thumbnails retain distinct server-rendered samples in noninteractive sandboxed frames","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793671505757,"status":"passed","title":"template thumbnails retain distinct server-rendered samples in noninteractive sandboxed frames"}],"endTime":1793671505824,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-template-thumbnail.test.tsx","startTime":1793671503519,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":258,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"language controls identify Bokmål with its native name and language code","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793671506673,"status":"passed","title":"language controls identify Bokmål with its native name and language code"},{"ancestorTitles":[],"duration":108,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-01 PRES-E07 E08] grouped navigation exposes the current child without marking the parent as the page","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793671506931,"status":"passed","title":"[P5-01 PRES-E07 E08] grouped navigation exposes the current child without marking the parent as the page"},{"ancestorTitles":[],"duration":222,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-01 PRES-E07 E08] collapsed secondary destinations remain keyboard-operable","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793671507039,"status":"passed","title":"[P5-01 PRES-E07 E08] collapsed secondary destinations remain keyboard-operable"},{"ancestorTitles":[],"duration":142,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-01 PRES-E08] successful shell navigation focuses the new route heading and exposes a skip link","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793671507261,"status":"passed","title":"[P5-01 PRES-E08] successful shell navigation focuses the new route heading and exposes a skip link"}],"endTime":1793671507403,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\app-shell-navigation.test.tsx","startTime":1793671505840,"status":"passed","summary":""}],"wasInterrupted":false}
@@ -0,0 +1,150 @@
{
"recordedAtUtc": "2026-11-03T02:07:53.565494+00:00",
"base": "d3d338376444b8abdcaf7200f682faa3daf1ad10",
"design": "237c79b8cb3e280d7e4d1ef95cdbb2c77bb81c69",
"policy": "Text and JSON LF-normalised SHA-256; PNG/exported asset bytes raw",
"sources": {
"job-tracker-ui/src/theme.ts": "6b3c28a2a920e53e01ed9ee12ee2f5cdaa0fe7c3752415a97ca544c82fce8cfa",
"job-tracker-ui/src/ThemeProvider.tsx": "1d25fd091ca632f7671e413db24e917d4ca4a375fddade0ca1ff397a8ae9f950",
"job-tracker-ui/src/themePrefs.ts": "d775741cd6b2fc7ac59dca13e5e6cf5ffd3856cf4a2e011948b2dfb0d9c319ca",
"job-tracker-ui/src/themeBootstrap.ts": "0035725a9d43077ede757c1f20382465a6f04511b63fb22ac65adcfb8ce5f2d0",
"job-tracker-ui/src/a3-theme-contract.test.ts": "039382d49d84f84df81d583079f217a21ca0be4b9c90c82f2da744998fbfe73d",
"job-tracker-ui/scripts/verify-a3-theme.mjs": "3d550137be4500b0a1711b88d34d01592ab33e2b9dad261a19b033dc4db609c0",
"job-tracker-ui/package.json": "3745394e406cefa40d30a87e840bccb359be147bac6ffba736e2ae90898a8626",
"job-tracker-ui/package-lock.json": "bf31e90d7af03e8af059db2aaf893925b9e8881a30a1688034ed88ef45d4fcab",
"job-tracker-ui/src/App.tsx": "28d906c0f04d82da41125d4722a04dce2b2c1573e333b68a0ef83018d6f94c9f",
"docs/pre-phase10-ux/preservation.json": "a4c2a5a0244ea89381008218de32daee1f615a250eb3808b60e0ee103c674d4d",
"docs/ui-modernisation/A3_APPROVAL.md": "54243c73fcb15e9c03b81e2c6ee3cb0ed3485067891243a33da9eb83fb383fca"
},
"evidence": {
"BASELINE.json": "2cf5b006ab9a3c499be32c0e3c3e4aff69708819b6516c6044b8db835dbfab74",
"BROWSER.json": "f16dd11c041d3f9a57474acc8f3efd71639f048448894f9c1d97b114996d4261",
"companies-en-dark-1440.png": "26ef08a0df3b17e33499cc2a0a6a78916702e4bed6d9254bfb60f23deaf0d6c3",
"companies-en-dark-320.png": "b18d4e604f40a17bfdf2624d5823c17d467e03583beccc0e497893ee51c735ce",
"companies-en-dark-390.png": "8f17a05b8b22cced76ef47326863b8317ed71ea2807db301cf762ad2f869ac28",
"companies-en-dark-768.png": "ba34903cae2b5de339b667e3e6817b821c46e761d8467d876e1ca2bd0ce0202e",
"companies-en-light-1440.png": "7ae163a26e395005cc09b2cca8f492ec64b52aae19be6251ef169f6f62a9645c",
"companies-en-light-320.png": "bc4d8a94bf354c0968ea47d97bd59b56e42fa9e9730a4e59d4671060062f8b0d",
"companies-en-light-390.png": "b01d0ffb8ca2703bc75dcf5ab1c34ac442737ba5d5f9792a1627eb959f665553",
"companies-en-light-768.png": "826d7b6707f238703a0a4a74d81c1e5542bcc7f4d1da876e12557fce003b31b9",
"companies-nb-dark-1440.png": "579072333acc7fefd677277083f9c9d2792523ef12d7ace02afe973f47c36c7f",
"companies-nb-dark-320.png": "62795143d79221b2711077d5c0cdd5766d920418036f18340221a018c845e2a4",
"companies-nb-dark-390.png": "e10db421d105c130e7265667b03f8018a934a826ecfcf2500880f89a3379590e",
"companies-nb-dark-768.png": "fe2003b73991b7b80c206a0b2baa8fce90c9a994a24d0ab9813aa018e94b5c12",
"companies-nb-light-1440.png": "6b3c2f917fb33db424f81be3777969122504455f380db3e5729cad26475487a2",
"companies-nb-light-320.png": "5b8b170cdd93f9ee73049a9e307f3c7e8663c640f6cdd3b5e657d519c194f796",
"companies-nb-light-390.png": "d18c51480b8fb8f75247118f3bbaeec55f0702e29a988aaf07bc143caf0ae913",
"companies-nb-light-768.png": "b430df3421e72a6040730d5dff90e8584cb7926452d537d6fa5ac50353b742a8",
"login-en-dark-1440.png": "7f14b204ac297a11d0f66ae14630fc178db576003f5739c8837c0d89a8c671b5",
"login-en-dark-320.png": "1349497aa9a8c69135fd65a1b033c235519fea6158574df0bfe480168366fbe6",
"login-en-dark-390.png": "e1bc62e9622daed83e702bece9fbbde56a0eb8b44d662436c3c88884dee53571",
"login-en-dark-768.png": "398df1bc62c65b52808dfc4060a15f3ddda4ecd53600e1f0f1f48116d46330e8",
"login-en-light-1440.png": "adf362ed3cb066a868d466317a5a5f1f9e32e80292d780a43b435e67d8250229",
"login-en-light-320.png": "4b0c2f278b6224969bf8d16e73a4bce317948b6fa9b5f2a46ddb4c1692848455",
"login-en-light-390.png": "526ae4c4c998c766ad4cb55ccce65db6dd6448c6ca3a88d5fa497d17ffff006a",
"login-en-light-768.png": "569319b19e4bb37955a805778a87ca4dfd2b13c4c8c33c4ea9d2e0418f9e25cd",
"login-nb-dark-1440.png": "e3dfcad81696cb40e33acae6b2ae9553eb773d5c02e84f9b5974f978a2345389",
"login-nb-dark-320.png": "810c6f9b9dd368de5836620004f777b6c7bfd38d20bd6f9a41bef43082ae40b6",
"login-nb-dark-390.png": "5dd78b744b92c33f70f40848c905a26f38184324cf77f51caf3d947d59d22902",
"login-nb-dark-768.png": "a95543cb6c60c308f756d4f16f480be75d20b03fd9ab855ad3abcd56434bda2c",
"login-nb-light-1440.png": "4ca9d0de9a2aaf217c484073f0b3ffffba91d33bfaceef313bc748ec3ad19cc3",
"login-nb-light-320.png": "d2d9729bcc9c3cf8d3b8044c9b6e63d463a84b2f7aabb362ca5b7bebd9538804",
"login-nb-light-390.png": "7fd0429224e620c58552a9e1ada72e830eb10b3ef392b76f0074a4e6d343f42f",
"login-nb-light-768.png": "8f7d2a44913d5cc3dc835b9bde07f04fd56a300cc9bf502a34825777eb02cb74",
"PRESERVATION_TESTS.json": "e3e0007714e0ea38daf016516f8442ec785ca6f588f6ffafe915723a32c34fd6",
"THEME_TESTS.json": "eaccb949dc12cfc0845292bde4dfe2cda1a8af7c107357c52dc68aa2c4c3f195"
},
"exportAssets": {
"404.html": "44f4f5ea405e5f3c283757c06815b9d76b80ccded65975710f79eb08cc686fe9",
"favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a",
"favicon.svg": "63ecf8f37f8bb146ecfae3917187c6b692d4e801641e8a314486a4007912f3a3",
"index.html": "62802e5c9baf3cbb913a5602d23193265f35e68b70b262b262d509b5ad8d9e41",
"index.txt": "f0e4bed88cef037cb296f31ccdada5fa0698b673ea8816de1e1901f7a5cf7510",
"logo192.png": "bc652031597fabd19b9f14e22a71f809490d218037521b3b64d013418c1390b4",
"logo512.png": "5129e9bc1ba812b711fd9a646d3a38a906d365a26ee685df183b8752458944d4",
"manifest.json": "2667ce63c2e0835b7007239816a5597639321d333da396a78638dfa9e8a7c935",
"robots.txt": "e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c",
"_not-found.html": "44f4f5ea405e5f3c283757c06815b9d76b80ccded65975710f79eb08cc686fe9",
"_not-found.txt": "6ee9df2ea06c8d6b46b4a2e397cbb0a209381f31125f5aa60d790ad65f2c7e5f",
"__next._full.txt": "f0e4bed88cef037cb296f31ccdada5fa0698b673ea8816de1e1901f7a5cf7510",
"__next._tree.txt": "b9100c9cbea4f7b3ba2f511d63c7d4b9d82ddf8b305cbefc4709fde4e99f742b",
"__next.__PAGE__.txt": "a9259f14c2060132db3929f867737f869b58e47eeb73f7306a101565860da7f6",
"mockups/dashboard.svg": "318be3adb1324c26eb30f05572a29528a3e38331c6a604652eef75b54f8c29dc",
"mockups/pipeline.svg": "db2ef41faabeb90e7ce85413e168581686c54535d970fc7d8deda3888a479de4",
"mockups/workspace.svg": "9bbab22349147c7b01d6e18c93c622a6f8aed6dedaf23715189ab54d60e1ddbd",
"_not-found/__next._full.txt": "6ee9df2ea06c8d6b46b4a2e397cbb0a209381f31125f5aa60d790ad65f2c7e5f",
"_not-found/__next._tree.txt": "128650e2c58388ed26616d9820dcbd1a477dbc1f8674d57742c69b584ced1f94",
"_next/static/chunks/0-_aq6ipzcshj.js": "39f90c215bf52aef6274ed3dcc0f8af32e21a37fe8845b3bca0d6ea60da6a8c2",
"_next/static/chunks/07vdc-duql714.js": "5a4840d1ba6b65782459968940a2f4cf973c99f0f77890f4171c4f420f339353",
"_next/static/chunks/0bdt7ln111t48.js": "6184b1a61f22e2a640c17941634fdc75678ce93d142848d9f07f163e0d1fd201",
"_next/static/chunks/0bwvt3mysnclc.js": "7705667a1b75812b7833d9c9dff47fe023015e58e382c40f4507d9948c973af4",
"_next/static/chunks/0cz1d0mv5g_q7.js": "0973c1d64c88adc8e3c950410cb58b288f72118d5965b78049438deb8f2f9683",
"_next/static/chunks/0enhs8x_8oeah.js": "44c76f6178d407e1f147fdf70015fd05c21e58ed220fc922d23dfd1e0f8631bd",
"_next/static/chunks/0jcvc3qm6-lyk.js": "7c27e1fe373b822adc68c63096a5bf38444ad605b9743f0920271652989c56f1",
"_next/static/chunks/0lxzrfwn1fphq.js": "1f1792240611f3fabb14afa6b66f80de20b035a3d0ceee2e40f5f6f589129774",
"_next/static/chunks/0q20g9o8x-k8z.js": "3d4d9086985419aa8866b032158196c774acb8bf318f3c8245508c8daa9c5148",
"_next/static/chunks/0q_pwu9jxv4-d.js": "42a43b3d7245a413c7c29b4cbe87823037a6dbc637e2e282c92405470e0f575d",
"_next/static/chunks/0w69-xg9od0ja.js": "88a7bd64f4fddf57cdbf3e993be2a44e48d5b313e434038bc9a7337d107ae162",
"_next/static/chunks/11-48p8kygxgp.js": "57eb9059599b5a5a30598d0a334912d58af571c0ffe28448ca76ad77c8ea8df9",
"_next/static/chunks/13uq1xe3s3l_c.js": "dd5b46dbf29a692062dcedc2604ff9c254db1abfcf9d39f30ab96b2de87d1707",
"_next/static/chunks/14-lfugawba2w.js": "6a5780ca3c84d7f130f3c0a14431c85c7a1e799e2645b8c171161dab40a64360",
"_next/static/chunks/1435in_k_-dhc.js": "4757476512d5c4dd25f9264a18b304ed4824b23aff1c09e134fcbff21d9c36b6",
"_next/static/chunks/145oicobmjvm7.js": "d6bbbdeed1381652dc7412e5ce673a077579ecd5cee8934cb6b533c814098764",
"_next/static/chunks/14e7ovj0s3elm.js": "070567dd4d23fb9fa0b9ba132185a697af6578045d43b2b1c7bbb2a1594d935d",
"_next/static/chunks/154b5a6du9olf.js": "49e4df3a3e10119ddc34f84767883b9228ff6798a07fd759c2fb8e2be62fe9fb",
"_next/static/chunks/16lfece6cnlln.js": "716363ba044f30b0e70440756b4e5eafa2d25f2e1628e855e3bc4ab9eabee3d3",
"_next/static/chunks/1d0xrdyyzw7qc.js": "c11668ff1e152008e0d7b4454af12eb36c97df46a5860938e2eb5d8429b374a8",
"_next/static/chunks/1h7j7ef9e6i41.js": "cb6cd497566dc188b67d09b9c031ef9bbf36f2b85d0aac02621f56daa44faa34",
"_next/static/chunks/1ke8pzecwofrg.css": "32e9ab963ebadebcbe2c68dffb24cfbfc8cc24255ad91b48b7941fc777bf7439",
"_next/static/chunks/1m3dt58dmprbw.js": "3a80b00707e6a884a03fa636260511585f1760f37c24fd4861ead110e6b3e985",
"_next/static/chunks/1req80b9jj38r.js": "eee4d2e3789e1215195dba99ad0f09d34f8c83da848322b76054722233e9dae3",
"_next/static/chunks/1vlgr-jtg9qr0.js": "6e41421a30b7313860e86c2069ed9dde394e29d004eeb42af46b2d2d124a1acb",
"_next/static/chunks/1w3q8yrcjn2jk.js": "365200e241ee9290e93d7c2fdba169f2b0a8e774541e3cbf3f6f2781110fa644",
"_next/static/chunks/1xn023_28rgzj.js": "4f7f2108d030a48d039930736c92a55710975dddf419fe673f84d92899b1f575",
"_next/static/chunks/1xwc-b795syag.css": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f",
"_next/static/chunks/1zi8i6dnxiac_.js": "8aea28bbe6a138e5d4b619429ca71570883a7aee974b86d5a4a746d90f704dbc",
"_next/static/chunks/21n31t_q2ou2m.js": "bbd6a5dc061a64d5b7817babeeb5c2f90aae8ba21cff54fea1064c39f497af6a",
"_next/static/chunks/22uh2tvaw80j2.js": "dafe6b4e23dc5c1d32f8b4a60c561238d2d5e7545f23ebc5b3f7304b48626dbf",
"_next/static/chunks/22wx8--1b9tnq.js": "3f7d8e762371262c6a740b4dac21725b424847319afac46055e97074a99ff5f5",
"_next/static/chunks/245ibf0f31ne8.js": "8b27ab5d720bd278b5d73a7e824bfcccf4cc893ced9fa6f1937bb2bc7a65f967",
"_next/static/chunks/280cq9ekejv1f.js": "01de8c1c3555cdd8d711763065ea9d8aec2968c3053f61254e43e26c999027bf",
"_next/static/chunks/2br3ad_-bc7k9.js": "80fa55f7a32db4d743fda36747c36994fde00a0f53f2eb25b2a6d07c6fb97cd7",
"_next/static/chunks/2gd9s_n-0nl1p.js": "31e2811be51a3c4d0ff2d1e3cea756e7fd8d57ef89141b5de69f638c1301d039",
"_next/static/chunks/2j9f-6w2x4auf.js": "a23068fc68514dcaa1375de8802bf7f9bdfc561835e4fe47b9e6fe8f7372f85c",
"_next/static/chunks/2s2gjr6ro25dj.js": "7489e2ac285a05b563c2bcb4eaf9274bf930f2a7385f17d6d5e6850064b88b10",
"_next/static/chunks/2u5qve004opku.js": "be388d9a6aa423082bafb4584c3facc65ddfed71bcfa5c1d06b097b408c5ff97",
"_next/static/chunks/2wae6urahmel1.js": "ae86575883781981cc373601a07009101d81eba801f40d4607e6f3f168777a5b",
"_next/static/chunks/2xlg4_1fj8fxh.js": "8ab4ba521db0167f3dbf684787ebf643cbc66fa7ffff7cdc65a8d8076a926155",
"_next/static/chunks/2z42el0b2mp8_.js": "86ff990ef32c90c4839583e4f1d1bcbddb165dad3141b9fcd2ecec67f4ff24b8",
"_next/static/chunks/334vtqp3-g1j6.js": "c33d42da97f3af7388e29273297e9f42c67f54b7f5ec77a5d0637e2da06d7f7e",
"_next/static/chunks/3720519r84mh6.js": "54358db392a13914e3363046d594e824b1a3ef987913d95002bf48267dded4aa",
"_next/static/chunks/3bqn9b34na0b9.js": "f1b8ebcc1b22251c33c9f3a5d11c1f893cad2da2e8744a441e790f7347aa9e73",
"_next/static/chunks/3ckk_j5ril9ag.js": "87f631dae7b648d32171e9e05a3e000753ecb54f8d3b86a4401c0e4ab4d73553",
"_next/static/chunks/3f96r6vscobou.js": "d4b452ff3f1433f8fe1df705a8f592326f51b5a8846e6c2790d28df5a977aed3",
"_next/static/chunks/3gkylew_qn7cw.js": "7e6c74c81be0c41ab433e36d65b914f62c48f332922e27f7cc953476f4dd78cb",
"_next/static/chunks/3mowdlh-jq9ii.js": "2c6ccd1500d28ec0c7312cb08ee221f0e4184ba21465ee166a054aa9a6c7f3ed",
"_next/static/chunks/3os11ovm65tyl.js": "c5a908bd61f53f0d75927efb71e53aef8fdd9b2e4fef412a167990dbc702c166",
"_next/static/chunks/3q4v10rrqy40n.js": "d87ff7b7a0f07d0d92eab3876481eb686a12d9c43d8b92cbe406aefa227a11c1",
"_next/static/chunks/3q80eur194l-9.js": "7b52d29843c23a0ed74056eeb1704de14488f36e9d05f2f8271434c61051dce0",
"_next/static/chunks/3u61o8t7m_jza.js": "86231c12e0f8cacc8638bed0bc4b34f645fc35e60de342dc154d3cce0c9a5afa",
"_next/static/chunks/40y_aqqilokr2.js": "1f5a5260316134d6bffe949400752ee6b42addf908ae714ef4ae4ebde916dddd",
"_next/static/chunks/43b5x8qjjh3ax.js": "6ee7261cf9a63e0e6ea181bbb09125e09948588b6e10b5c02727c686a6062a3a",
"_next/static/chunks/442d7ylb3po0z.js": "d95cedfbdcd00c674fd718cbbf391ec01c0728018b0db2461a06df7074049132",
"_next/static/chunks/turbopack-25fzg9ay_1ss-.js": "c40f39e993a30c96d6247bb3a7b581538bb046efe8ef8ec07bea3ba32291750f",
"_next/static/ibUkuY7Y_5wUxZxd0jW38/_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea",
"_next/static/ibUkuY7Y_5wUxZxd0jW38/_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a",
"_next/static/ibUkuY7Y_5wUxZxd0jW38/_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00",
"_not-found/__next._not-found/__PAGE__.txt": "b29ec33fb211daa1fd701159576a82422aecee42bc24fa6927e28f4e22e3df0c"
},
"commands": {
"typecheck": "npm run typecheck: exit 0",
"lint": "npm run lint: exit 0",
"build": "NEXT_PUBLIC_API_BASE_URL=/api npm run build: exit 0",
"browser": "node scripts/verify-a3-theme.mjs: exit 0"
},
"limits": [
"synthetic API fixture browser lane",
"Google font requests aborted, not downloaded",
"no backend or native-device/security/release acceptance"
]
}
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More