fix(security): enforce audited account, network and resource boundaries

Implement B01-B06 with regression coverage and retained validation evidence. Preserve the production ingress preflight; F04 runtime verification remains open.
This commit is contained in:
cesnimda
2026-09-09 18:21:47 +02:00
parent 7d641edc7b
commit 0954876295
116 changed files with 10101 additions and 122 deletions
@@ -0,0 +1,46 @@
{
"ticket": "B01",
"completedDate": "2026-09-08",
"baselineCommit": "7d641edc7bca866ccf06012897ba1d107c07e59f",
"environment": "Windows, .NET SDK 9.0.317, Release, existing packages, no external services",
"status": "complete locally; not deployed; F11 remains open for B07 and deployment evidence",
"runs": [
{
"phase": "before application edits, regression reproduction",
"path": ".artifacts/b01/b01-before.trx",
"total": 12,
"passed": 8,
"failed": 4,
"skipped": 0,
"sha256": "320B78B4A5A6E008B66D64661816F7A7F827BF48AEE69052C03D79989D631FA7"
},
{
"phase": "final focused import and existing IMAP literal guard tests",
"path": ".artifacts/b01/b01-focused.trx",
"total": 98,
"passed": 98,
"failed": 0,
"skipped": 0,
"sha256": "FE5BB3EB7A3D1D169C3C9B91AD46AF6B88868DE548D2AF3F228E30CBEC72B928"
},
{
"phase": "broader backend including focused cases",
"path": ".artifacts/b01/b01-backend.trx",
"total": 840,
"passed": 840,
"failed": 0,
"skipped": 0,
"excluded": ["JobTrackerApi.Tests.ImapServiceSsrfGuardTests.ConnectAsync_rejects_unresolvable_host_without_leaking_dns_detail"],
"exclusionReason": "Existing test performs real DNS resolution; external access was not authorized.",
"sha256": "379541860BFA4BFB819AF0BD172F23DEDDF26F003AD6A23F4906700DD333F022"
}
],
"build": {
"command": "dotnet build JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore -warnaserror",
"exitCode": 0,
"warnings": 0,
"errors": 0
},
"newRegressionCases": 88,
"originalEvidencePreserved": true
}
@@ -0,0 +1,18 @@
// Copy to .artifacts/b02/playwright.offline.config.ts and run from job-tracker-ui.
import base from "../../job-tracker-ui/playwright.config";
import path from "node:path";
export default {
...base,
testDir: path.join(process.cwd(), "e2e"),
use: { ...base.use, launchOptions: { args: ["--no-proxy-server", "--host-resolver-rules=MAP * ~NOTFOUND, EXCLUDE localhost, EXCLUDE 127.0.0.1"] } },
webServer: (base.webServer as Array<Record<string, unknown>>).map(server => ({
...server, cwd: process.cwd(), env: {
...(server.env as Record<string, string>),
Auth__GoogleClientId: "", Auth__MicrosoftClientId: "", Email__Enabled: "false",
Ai__BaseUrl: "http://127.0.0.1:1", Stripe__SecretKey: "", Backups__Enabled: "false",
Workers__AiOperationsEnabled: "false", Workers__RulesEnabled: "false", Workers__FollowUpRemindersEnabled: "false",
Workers__DailyExportEnabled: "false", Workers__JobEnrichmentEnabled: "false"
}
}))
};
@@ -0,0 +1,9 @@
{
"ticket": "B02",
"date": "2026-09-08",
"scenario": "Retain A profile request, logout, sign in as B, submit with B cookies/fresh CSRF and retained request context",
"before": { "status": 200, "a": "Private A", "b": "A draft must never enter B" },
"after": { "status": 409, "a": "Private A", "b": "Private B" },
"fixtures": "Permanent Playwright API tests against actual API, Identity/session checks and isolated SQLite; synthetic accounts only",
"historicalEvidenceUnchanged": ["probes.mjs", "evidence/observations.json"]
}
@@ -0,0 +1,133 @@
{
"ticket": "B02",
"completedDate": "2026-09-08",
"baselineCommit": "7d641edc7bca866ccf06012897ba1d107c07e59f",
"environment": "Windows, existing .NET 9 SDK and UI dependencies, synthetic local SQLite/browser fixtures, external providers disabled",
"status": "complete locally; not deployed; existing R01a standalone TypeScript diagnostic remains",
"acceptance": "Original retained request rejected; direct object ownership and associations enforced; same-account controls and private state disposal pass",
"runs": [
{
"phase": "before application edits: original replay expected safe assertion failed",
"path": ".artifacts/b02/before.json",
"sha256": "BECFB841585A287BADF04E7446DC43FB785F066981E07636534E75F6EF9D2E30",
"total": 1,
"passed": 0,
"failed": 1,
"skipped": 0,
"observation": "HTTP 200; A unchanged; B overwritten with retained A draft"
},
{
"phase": "focused backend authorization/session/career/CV",
"path": ".artifacts/b02/focused.trx",
"sha256": "B43DF85097B6CE15B6DC7766162934E14F62132686EAA20B76F8EA014170A659",
"total": 91,
"passed": 91,
"failed": 0,
"skipped": 0
},
{
"phase": "broader backend including focused cases",
"path": ".artifacts/b02/backend.trx",
"sha256": "9539800BF98F5B6B2CA6E52FA37FCFB96845A77D6CDA166DFEB3948AA10AD07D",
"total": 853,
"passed": 853,
"failed": 0,
"skipped": 0,
"excluded": [
"JobTrackerApi.Tests.ImapServiceSsrfGuardTests.ConnectAsync_rejects_unresolvable_host_without_leaking_dns_detail"
],
"exclusionReason": "Existing test performs real DNS; external access not authorized."
},
{
"phase": "focused frontend before final anonymous-BFCache control addition; superseded by full run",
"path": ".artifacts/b02/frontend-focused.json",
"sha256": "72CCCA872249B808C3C1BFAFCA64F5C4BCB1417FD6DA8643AB2DA241B045BE09",
"suites": 5,
"total": 51,
"passed": 51,
"failed": 0,
"skipped": 0
},
{
"phase": "final full frontend",
"path": ".artifacts/b02/frontend.json",
"sha256": "2D0B7B4A47BF5986FC80205D70FD0024B4CDA6483202A72D225A1034297D1F16",
"suites": 66,
"total": 294,
"passed": 294,
"failed": 0,
"skipped": 0
},
{
"phase": "full browser suite before final anonymous-BFCache refinement",
"path": ".artifacts/b02/browser.json",
"sha256": "FA78BF60624F42F9DA4A7F7C7DA53FBC4C984297946ED98116DD93BD0FFDB844",
"total": 17,
"passed": 17,
"failed": 0,
"skipped": 0,
"flaky": 0
},
{
"phase": "final B02 API/browser rerun after all application edits",
"path": ".artifacts/b02/browser-final.json",
"sha256": "A24785864DD906D04C4E6FF84A0ADE2F5D6F2A43B361C901635F41CEB81617B4",
"total": 4,
"passed": 4,
"failed": 0,
"skipped": 0,
"flaky": 0,
"observation": "HTTP 409; both A and B unchanged"
}
],
"checks": [
{
"command": "dotnet build JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore -warnaserror",
"path": ".artifacts/b02/backend-build.log",
"sha256": "3B4A8D824FDF9BC33C527A5B00FD3E045AE7C43F28FD79885CA78641DF222927",
"exitCode": 0,
"warnings": 0,
"errors": 0
},
{
"command": "node --max-old-space-size=4096 node_modules/next/dist/bin/next build",
"cwd": "job-tracker-ui",
"path": ".artifacts/b02/frontend-build.log",
"sha256": "DC7F4BC6EAAD13C897A69F58394867B3B5CBD49B881B60C2D0DF8F7A4612E592",
"exitCode": 0
},
{
"command": "node node_modules/typescript/bin/tsc --noEmit --pretty false",
"cwd": "job-tracker-ui",
"path": ".artifacts/b02/typecheck.log",
"sha256": "2F9960647ABADEFD054152A9566E4E6557A55383E98627AED742B93EDEBB16DD",
"exitCode": 2,
"diagnostic": "src/interview-prep.test.tsx(120,10): error TS2571: Object is of type 'unknown'.",
"classification": "Pre-existing audit R01a, unchanged, no new diagnostics"
},
{
"command": "node node_modules/eslint/bin/eslint.js src/api.ts src/sessionBoundary.ts src/session-boundary.test.ts src/App.tsx src/views/LoginPage.tsx src/i18n/translations.ts e2e/account-isolation.spec.ts e2e/smoke.spec.ts --max-warnings=0",
"cwd": "job-tracker-ui",
"path": ".artifacts/b02/lint.log",
"sha256": "33237F0AC9684ACA5331E14FA4337EFC24C4C03D39E589FD0FBCA54F627A9483",
"exitCode": 0,
"note": "Tool emitted stale Browserslist database advisory; no lint violations; no dependency update."
},
{
"command": "git diff --check",
"exitCode": 0
}
],
"newRegressionCases": {
"backendMiddleware": 13,
"frontendBoundary": 15,
"realApiAndBrowserScenarios": 4
},
"commands": "Exact test commands and local offline fixture reproduction in ../b02-completion.md and b02-browser-config.ts.txt",
"rawOutputs": "Hashes identify local ignored .artifacts/b02 files; permanent tests, this manifest and compact observations are retained in repository.",
"originalEvidencePreserved": true,
"b01ApplicationCodePreserved": true,
"schemaMigration": false,
"deployed": false,
"nextTicket": "B03 — shared PDF admission; not started"
}
@@ -0,0 +1,8 @@
{
"ticket": "B03",
"date": "2026-09-08",
"before": { "source": "Permanent actual-exporter regression before application edits", "concurrentCalls": 2, "actualBrowserStubLaunches": 2, "safeAssertion": "failed as expected" },
"after": { "source": "Authenticated real API/controllers/exporter with inert process fixture", "configured": 2, "admittedDuringBurst": 2, "rejected": 10, "queued": 0, "maximumActualRenders": 2, "busyStatus": 503, "retryAfterSeconds": 3, "recoveryStatus": 200 },
"limitations": "Inert subprocesses prove actual launch admission, not Chromium peak memory, throughput, sandbox or production host sizing.",
"originalEvidencePreserved": true
}
@@ -0,0 +1,207 @@
{
"ticket": "B03",
"completedDate": "2026-09-08",
"baselineCommit": "7d641edc7bca866ccf06012897ba1d107c07e59f",
"environment": "Windows, existing .NET 9 SDK and UI dependencies; synthetic local SQLite/API/browser fixtures, external providers disabled",
"status": "Complete locally; not deployed. B01/B02 preserved; B04 not started.",
"acceptance": "All four expensive PDF routes use one shared admission pool; bounded actual process launches, safe rejection, repeated exception/cancellation/timeout recovery and configuration validation proven.",
"regressionsAdded": {
"backendCases": 22,
"frontendCases": 2,
"authenticatedMultiRouteApiScenarios": 1,
"existingAccountSwitchTest": "Wait for B02 final redirect before a new navigation; application B02 behavior unchanged."
},
"countsOverlap": true,
"runs": [
{
"path": ".artifacts/b03/before.trx",
"sha256": "5317581B7BCF11D1D102AE59CACC211B8E5514DA2DB4AA14D4ABF08B3535123C",
"total": 1,
"passed": 0,
"failed": 1,
"skipped": 0,
"phase": "Before application edits: expected failure reproduces unrestricted launches",
"observation": "Two simultaneous calls through the actual exporter started two held inert child processes; safe assertion failed."
},
{
"path": ".artifacts/b03/focused-verified.trx",
"sha256": "3812F700D223CEC9F6CF7B38CBA16220BC34BFCA07C19BCA17BA5FCAE3F2B714",
"total": 23,
"passed": 23,
"failed": 0,
"skipped": 0,
"phase": "Final focused PDF/admission and existing retention tests"
},
{
"path": ".artifacts/b03/affected.trx",
"sha256": "23943DA4A80D623B6F6DC3F8BFE86FA922C3C670E9A4689F63AAA163813E9E4A",
"total": 208,
"passed": 208,
"failed": 0,
"skipped": 0,
"phase": "Affected backend before the last logging-fault test; superseded by final full backend"
},
{
"path": ".artifacts/b03/backend-verified.trx",
"sha256": "4E4D66EECA8D305923EF9D6198F0B7CACF6A68A7B29BBE076B6277ACCE416289",
"total": 875,
"passed": 875,
"failed": 0,
"skipped": 0,
"phase": "Final broader backend, including all B01/B02/B03 tests",
"excluded": [
"JobTrackerApi.Tests.ImapServiceSsrfGuardTests.ConnectAsync_rejects_unresolvable_host_without_leaking_dns_detail"
],
"exclusionReason": "Existing test performs real external DNS; external access not authorized."
},
{
"path": ".artifacts/b03/frontend-focused.json",
"sha256": "FB2D9A9A76DB165EA9765CDDBCC40799F2A6EB6DE3C6B97BA192CC99DEC23A36",
"suites": 5,
"total": 37,
"passed": 37,
"failed": 0,
"skipped": 0,
"phase": "Focused frontend"
},
{
"path": ".artifacts/b03/frontend.json",
"sha256": "2C7580F8E82F9CFC516B35044BAB452C35F57F389CF0A5377A5876CA7CF37EDD",
"suites": 66,
"total": 296,
"passed": 296,
"failed": 0,
"skipped": 0,
"phase": "Full frontend"
},
{
"path": ".artifacts/b03/adversarial.json",
"sha256": "4D7CCD07EB6195D2AE9C6D12DEFEAC2DB3BA45BA7229AE237D0ACEA769560D80",
"passed": 0,
"failed": 1,
"skipped": 0,
"flaky": 0,
"durationMs": 13734.423999999999,
"startedAt": "2026-09-08T10:46:39.267Z",
"phase": "Initial HTTP fixture run: failed control-directory setup",
"diagnosis": "Runner and worker initially created different stub control directories; corrected test configuration to inherit one directory."
},
{
"path": ".artifacts/b03/adversarial-verified.json",
"sha256": "A43BE3B32215073A25B72A466B37B48A6765B74F10FDF50103B948FC2E2AB26D",
"passed": 1,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 17724.545,
"startedAt": "2026-09-08T16:12:27.545Z",
"phase": "Final authenticated multi-route API adversarial regression",
"observations": {
"configured": 2,
"admittedDuringBurst": 2,
"rejected": 10,
"queued": 0,
"maximumActualRenders": 2,
"busyStatus": 503,
"retryAfterSeconds": 3,
"recoveryStatus": 200
}
},
{
"path": ".artifacts/b03/browser.json",
"sha256": "9B334B702DCCF8C5DFAAE7252CC4901558D44223BD5A56EA925379EA6CEF98FF",
"passed": 12,
"failed": 5,
"skipped": 0,
"flaky": 0,
"durationMs": 317668.186,
"startedAt": "2026-09-08T10:53:22.552Z",
"phase": "Initial browser development-server run",
"diagnosis": "Two real PDF timeouts from an introduced explicit Chromium user-data-dir argument, two navigation timeouts and transient API-status-chip axe contrast failures. Superseded by final passing static run."
},
{
"path": ".artifacts/b03/real-pdf-diagnostic.json",
"sha256": "19119A7C91E822F0F66E7FAEE6554EBE73795A75CBE26656E435F90795E9E8E9",
"passed": 0,
"failed": 2,
"skipped": 0,
"flaky": 0,
"durationMs": 178063.123,
"startedAt": "2026-09-08T15:50:26.573Z",
"phase": "Real Chromium diagnostic run",
"diagnosis": "Both PDFs reached the 60-second render timeout. Local CLI control isolated added user-data-dir argument; removed it to preserve original browser invocation."
},
{
"path": ".artifacts/b03/browser-final.json",
"sha256": "4511D084489B4CC857243439E711ABB99F5E4A221B6CB5B3ADB6440A1B6D6F55",
"passed": 15,
"failed": 2,
"skipped": 0,
"flaky": 0,
"durationMs": 142642.293,
"startedAt": "2026-09-08T16:01:38.189Z",
"phase": "First full static-browser run after CLI correction",
"diagnosis": "Account-switch fixture raced B02's final redirect (test wait corrected); separate Code-PDF setup hit existing SQLite Error 5 database is locked in profile/Identity projection before rendering. No database or accessibility changes."
},
{
"path": ".artifacts/b03/browser-verified.json",
"sha256": "A78EB7BB65180AE3427AF692E15E879426A70B7F2F3EBB806DCCF9CAFCB043DF",
"passed": 17,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 88765.154,
"startedAt": "2026-09-08T16:05:45.871Z",
"phase": "Final full static browser suite",
"notes": "All 17 pass with no retries/flaky outcomes. Real public and Code PDF renders approximately 1.3/1.4 seconds. This does not prove the existing SQLite projection race resolved."
},
{
"path": ".artifacts/b03/backend-build-verified.log",
"sha256": "640B718E87F7E6E02AEEAE33E00F058751F0C10F66202BFE3BF47B6BB9504402",
"phase": "Final Release warnings-as-errors build",
"exitCode": 0,
"warnings": 0,
"errors": 0
},
{
"path": ".artifacts/b03/frontend-build.log",
"sha256": "635DC750AFBC06B2E936C0F21B5B5406F875B47F7DC3DCA38819B0D552C7ADA1",
"phase": "Next production build",
"exitCode": 0
},
{
"path": ".artifacts/b03/typecheck.log",
"sha256": "2F9960647ABADEFD054152A9566E4E6557A55383E98627AED742B93EDEBB16DD",
"phase": "Standalone TypeScript",
"exitCode": 2,
"diagnostic": "src/interview-prep.test.tsx(120,10): error TS2571: Object is of type 'unknown'.",
"classification": "Pre-existing R01a; no new diagnostic or suppression."
},
{
"path": ".artifacts/b03/lint-verified.log",
"sha256": "33237F0AC9684ACA5331E14FA4337EFC24C4C03D39E589FD0FBCA54F627A9483",
"phase": "Final targeted lint, including account-switch test wait",
"exitCode": 0,
"notes": "Existing Browserslist stale-data advisory; no lint warnings/errors."
},
{
"phase": "Final git diff --check",
"path": ".artifacts/b03/diff-check.log",
"sha256": "C274B72A1428ACB647E415C5582D003F75341E912BA5832D478B8964228C623C",
"exitCode": 0,
"notes": "Repository line-ending normalization retained. Additional explicit trailing-whitespace check passed for 13 new/previously untracked B03 and documentation files."
}
],
"finalSourceTiming": "Last logging-fault refinement covered by final full backend, focused PDF and authenticated API runs. No frontend or browser invocation changes after final passing frontend/browser suites.",
"residualLimitations": [
"Process-local; N rendering instances allow N times configured active renders. Owner allowance is also process-local.",
"R04 still required for production memory/CPU/PID sizing, process-tree containment, browser sandbox and forced-kill Chromium profile cleanup.",
"No FIFO queue or time-window abuse quota; zero waiting. Public requests account to document owner and may occupy multiple owners' allowances, subject to the global limit.",
"Upstream AI/HTML/DB preparation and arbitrary single-document memory/output size are outside render admission.",
"Unconfirmed process termination disables all new renders; operator must inspect/stop remnants before restart.",
"Existing standalone TypeScript R01a failure and observed SQLite profile-projection fixture race remain outside B03.",
"Local browser static export targets localhost:5302 and is not a production deployment artifact."
],
"evidenceRetention": "Original audit/probes retained. Raw local TRX/JSON/logs are ignored under .artifacts/b03; hashes and compact synthetic observations are retained here. Permanent tests are the current executable regression boundary.",
"recommendedNextTicket": "B04 Resolve principal before owner limiting; requires separate user instruction."
}
@@ -0,0 +1,22 @@
{
"ticket": "B04",
"date": "2026-09-08",
"boundary": "Real local API, authentication, endpoint authorization, partitioned rate limiter, B02 middleware and synthetic SQLite data",
"before": {
"accountAStatuses": [200, 200],
"accountBStatusesOnSameIP": [429, 429],
"safeAssertionFailed": true
},
"after": {
"aFirst": { "A": { "admitted": 2, "rejected": 1 }, "B": { "admitted": 2, "rejected": 1 } },
"bFirst": { "A": { "admitted": 2, "rejected": 1 }, "B": { "admitted": 2, "rejected": 1 } },
"concurrent": { "sessionsPerAccount": 2, "auth": ["cookie", "bearer"], "admitted": 4, "subsequentRejectedAcrossOtherIPs": 4 },
"craftedEmailSendOwner": { "B": { "chargedAttempts": 10, "rejectedByRateLimit": 1 }, "A": { "chargedAttempts": 10, "rejectedByRateLimit": 1 }, "emailsSent": 0, "staleOrForgedContextStatusBeforeExhaustion": 409 },
"invalidCredentials": { "categories": 7, "protectedAccountEndpointStatus": 401, "accountPartitionReached": false, "anonymousLoginScope": "IP; 10 admitted validation attempts then 429 per IP" },
"untrustedProxyHeaders": { "source": "127.0.0.2", "admittedValidationAttempts": 10, "changedForwardedHeadersCannotEvade429": true, "secondSource127_0_0_3Status": 400 },
"rateResponse": { "status": 429, "retryAfterSeconds": "positive fixed-window lease metadata", "cacheControl": "no-store", "code": "rate_limit_exceeded" }
},
"finalOrder": "Existing CSRF, authentication, endpoint authorization, rate limiting, B02 session context, controller",
"scopeLimits": "Process-local policy counters; live external OAuth and production ingress not exercised. IP security policies and B03 global rendering admission remain distinct.",
"originalEvidencePreserved": true
}
@@ -0,0 +1,186 @@
{
"ticket": "B04",
"completedDate": "2026-09-08",
"baselineCommit": "7d641edc7bca866ccf06012897ba1d107c07e59f",
"status": "Complete locally; not deployed. B01/B02/B03 preserved; B05 not started.",
"environment": "Windows, .NET 9 and existing UI dependencies; synthetic local SQLite/API/browser data; external providers disabled",
"finalMiddlewareBoundary": "Existing CSRF -> authentication -> endpoint authorization -> rate limiting -> B02 session context -> controllers",
"acceptance": "Account policies use the final authorized principal, independent across accounts and shared across same-account sessions/transports/IPs. IP security policies, B02 provenance and B03 resource admission remain covered.",
"regressionsAdded": {
"backendCases": 2,
"realHttpScenarios": 9,
"testFixtureCorrection": "Stop signed-in public-CV setup page before cookie removal; no frontend runtime change."
},
"countsOverlap": true,
"runs": [
{
"path": ".artifacts/b04/focused.trx",
"sha256": "DCE64904E7C1921DCC896BF12BCFD1586C5CD77A9D3FC2334ED0FDBE277C18B9",
"total": 207,
"passed": 207,
"failed": 0,
"skipped": 0,
"phase": "Focused auth/rate/B01-B03 backend before final authorization-order refinement"
},
{
"path": ".artifacts/b04/backend-final.trx",
"sha256": "AD8761B5C2B06D4E286856AF9E9D02E586BD6751276EDC12E6204E6A49CEC09C",
"total": 877,
"passed": 877,
"failed": 0,
"skipped": 0,
"phase": "Final full selected backend",
"excluded": [
"JobTrackerApi.Tests.ImapServiceSsrfGuardTests.ConnectAsync_rejects_unresolvable_host_without_leaking_dns_detail"
],
"exclusionReason": "Existing test makes external DNS requests; external access not authorized."
},
{
"path": ".artifacts/b04/frontend-focused.json",
"sha256": "273FF523A49CBB533EAF257BFC22A8A3622E457C0B50873881E4F6D4AB97CD86",
"suites": 4,
"total": 36,
"passed": 36,
"failed": 0,
"skipped": 0,
"phase": "Affected frontend; runtime code unchanged by B04"
},
{
"path": ".artifacts/b04/before.json",
"sha256": "9D76376030CBBED4A8840434C4AFA44F6855B4EDDF71A14B33C70ADBB29EE4D3",
"passed": 0,
"failed": 1,
"skipped": 0,
"flaky": 0,
"durationMs": 7913.539999999999,
"startedAt": "2026-09-08T21:06:28.266Z",
"phase": "Before application edits: expected failing safe assertion",
"observation": "A received 200/200; B on the same IP received 429/429."
},
{
"path": ".artifacts/b04/api-initial.json",
"sha256": "97E4A1AF216F6CB84B8E7D508F6C5C7F739EE47E95260D1052321C50D26402E9",
"passed": 9,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 11056.037,
"startedAt": "2026-09-08T21:10:18.256Z",
"phase": "Initial authentication-only ordering, superseded after self-review",
"notes": "Original scenarios passed, but endpoint-specific authorization may change the default principal. Final ordering also waits for authorization."
},
{
"path": ".artifacts/b04/api-final.json",
"sha256": "FD0BDEE6F68F7AF6438087732A8F0A6809B7A7EFD6DC7FF9A6BBB3672707026A",
"passed": 9,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 10464.229000000001,
"startedAt": "2026-09-08T21:20:33.327Z",
"phase": "Final HTTP rate-policy regression, including authorization-before-partitioning",
"scenarios": 9,
"observations": "Two accounts each admit 2/reject 1 on the same IP in both orders; four concurrent cookie/bearer/session requests succeed, later requests across other IPs remain limited. Invalid credentials are denied before account limiting; anonymous login remains IP-limited."
},
{
"path": ".artifacts/b04/browser.json",
"sha256": "AF984A9F9CB0F8EB1AAE88B724A1B0F718208FA0F6EFD10FA30D71D69049F33D",
"passed": 17,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 76250.659,
"startedAt": "2026-09-08T21:13:03.191Z",
"phase": "Full browser before final authorization-order refinement"
},
{
"path": ".artifacts/b04/browser-final.json",
"sha256": "D89F4F58561A2B6F161F33BE9223C9A1582E3A1BD34F4985C33C0FEBA20F453C",
"passed": 16,
"failed": 1,
"skipped": 0,
"flaky": 0,
"durationMs": 80244.032,
"startedAt": "2026-09-08T21:22:28.655Z",
"phase": "First browser run after final authorization-order refinement",
"diagnosis": "Public CV fixture cleared cookies while signed-in page remained active, triggering B02's correct session-change redirect. Remaining 16 tests passed; fixture subsequently stops that page before cookie removal."
},
{
"path": ".artifacts/b04/browser-verified.json",
"sha256": "9512176BAB16E19E70CEBE9767FBE590CD8EB97308628ED29F46E690ADC77382",
"passed": 17,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 67434.35999999999,
"startedAt": "2026-09-08T21:25:36.046Z",
"phase": "Final full browser after fixture correction",
"notes": "All 17 passed without retries/flaky outcomes, including account switching and real PDFs."
},
{
"path": ".artifacts/b04/pdf-admission-final.json",
"sha256": "6213EA4CF8B5E713D5FD01D332765979BF10F492F741DE6C33854F64847D5520",
"passed": 1,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 7616.844999999999,
"startedAt": "2026-09-08T21:28:50.581Z",
"phase": "Final unchanged B03 authenticated multi-route admission probe",
"observations": {
"configured": 2,
"admitted": 2,
"rejected": 10,
"maximumActualRenders": 2,
"recoveryStatus": 200
}
},
{
"path": ".artifacts/b04/build.log",
"sha256": "97AE4880F122E36BFC2A96184868F509DF76BA7177E9F5851D022ADED6FBB924",
"phase": "Final Release warnings-as-errors build",
"exitCode": 0,
"warnings": 0,
"errors": 0
},
{
"path": ".artifacts/b04/lint.log",
"sha256": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
"phase": "Final targeted ESLint including public CV smoke fixture",
"exitCode": 0
},
{
"path": ".artifacts/b04/typecheck.log",
"sha256": "2F9960647ABADEFD054152A9566E4E6557A55383E98627AED742B93EDEBB16DD",
"phase": "Final standalone TypeScript",
"exitCode": 1,
"initialExitCode": 2,
"diagnostic": "src/interview-prep.test.tsx(120,10): error TS2571: Object is of type 'unknown'.",
"classification": "Existing R01a only; no suppression or B04 type error."
},
{
"path": ".artifacts/b04/diff-check.log",
"sha256": "07A41BCFE160D0FA5AA278C009F548C35372FBDDA40BDFC61BBDFF43DDF699DB",
"phase": "git diff --check",
"exitCode": 0
},
{
"path": ".artifacts/b04/public-cv-session-race.md",
"sha256": "118B893EC4CB2472EF8FE7DA309067188A6BF04A8CE9C4A3C78C98D6806A0BB4",
"phase": "Retained public CV fixture failure context",
"observation": "Session-change sign-in screen, not a PDF/rate-limit failure."
}
],
"frontendBuild": "B04 changes no frontend runtime source. Affected Jest and full browser checks used B03's previously built static export targeting localhost:5302; no new Next build claimed. This artifact is not for production deployment.",
"residualLimitations": [
"Fixed-window counters remain process-local and reset on restart. N instances can provide N times each configured allowance.",
"Intentional security IP limits remain shared behind NAT; account isolation does not convert every policy to an account limit.",
"Requests denied by CSRF/authorization do not reach rate limiting. Authorized attempts can consume their own allowance before later B02/controller refusal.",
"Authentication/session/policy evaluation occurs before rate rejection; this is not global ingress or pre-auth CPU admission.",
"Production trusted proxy/firewall/direct-ingress proof remains B06; only controlled local proxy behavior was exercised.",
"Optional external OAuth providers were not contacted. Authorization-before-limiting handles endpoint-specific principal selection using the existing framework.",
"Known R01a standalone TypeScript failure remains; B03 R04 resource/containment evidence remains open."
],
"evidenceRetention": "Original audit/probes preserved. Raw outputs remain local under ignored .artifacts/b04; these hashes and compact observations are retained. Initial passing-but-incomplete ordering and the browser fixture failure are explicitly distinguished from final verification.",
"recommendedNextTicket": "B05 Spreadsheet-safe CSV fields; requires separate user instruction."
}
@@ -0,0 +1,2 @@
Company,CompanyLocation,CompanySource,JobTitle,Status,DateApplied,Location,Salary,SalaryMin,SalaryMax,SalaryCurrency,SalaryPeriod,NextAction,FollowUpAt,JobUrl,Notes,CoverLetterText
Ærlig Økonomi Ås,,,'=1+1,Applied,,,,,,,,,,,,
1 Company CompanyLocation CompanySource JobTitle Status DateApplied Location Salary SalaryMin SalaryMax SalaryCurrency SalaryPeriod NextAction FollowUpAt JobUrl Notes CoverLetterText
2 Ærlig Økonomi Ås '=1+1 Applied
@@ -0,0 +1,2 @@
Company,CompanyLocation,CompanySource,JobTitle,Status,DateApplied,Location,Salary,SalaryMin,SalaryMax,SalaryCurrency,SalaryPeriod,NextAction,FollowUpAt,JobUrl,Notes,CoverLetterText
Ærlig Økonomi Ås,,,=1+1,Applied,,,,,,,,,,,,
1 Company CompanyLocation CompanySource JobTitle Status DateApplied Location Salary SalaryMin SalaryMax SalaryCurrency SalaryPeriod NextAction FollowUpAt JobUrl Notes CoverLetterText
2 Ærlig Økonomi Ås =1+1 Applied
@@ -0,0 +1,190 @@
[
{
"file": "after-csv.csv",
"excelVersion": "16.0",
"company": "Ærlig Økonomi Ås",
"title": "'=1+1",
"titleHasFormula": false,
"cells": [
{
"column": 1,
"value": "Ærlig Økonomi Ås",
"hasFormula": false
},
{
"column": 2,
"value": null,
"hasFormula": false
},
{
"column": 3,
"value": null,
"hasFormula": false
},
{
"column": 4,
"value": "'=1+1",
"hasFormula": false
},
{
"column": 5,
"value": "Applied",
"hasFormula": false
},
{
"column": 6,
"value": null,
"hasFormula": false
},
{
"column": 7,
"value": null,
"hasFormula": false
},
{
"column": 8,
"value": null,
"hasFormula": false
},
{
"column": 9,
"value": null,
"hasFormula": false
},
{
"column": 10,
"value": null,
"hasFormula": false
},
{
"column": 11,
"value": null,
"hasFormula": false
},
{
"column": 12,
"value": null,
"hasFormula": false
},
{
"column": 13,
"value": null,
"hasFormula": false
},
{
"column": 14,
"value": null,
"hasFormula": false
},
{
"column": 15,
"value": null,
"hasFormula": false
},
{
"column": 16,
"value": null,
"hasFormula": false
},
{
"column": 17,
"value": null,
"hasFormula": false
}
]
},
{
"file": "after-typed.csv",
"excelVersion": "16.0",
"company": "'=1+1",
"title": "'@SUM(A1:A2)",
"titleHasFormula": false,
"cells": [
{
"column": 1,
"value": "'=1+1",
"hasFormula": false
},
{
"column": 2,
"value": "' +SUM(1,2)",
"hasFormula": false
},
{
"column": 3,
"value": "'\t-2+3",
"hasFormula": false
},
{
"column": 4,
"value": "'@SUM(A1:A2)",
"hasFormula": false
},
{
"column": 5,
"value": "'\r\n=1+1",
"hasFormula": false
},
{
"column": 6,
"value": "2026-09-09T12:30:00.0000000Z",
"hasFormula": false
},
{
"column": 7,
"value": "'​=1+1",
"hasFormula": false
},
{
"column": 8,
"value": "'-750",
"hasFormula": false
},
{
"column": 9,
"value": -750.5,
"hasFormula": false
},
{
"column": 10,
"value": 1200.75,
"hasFormula": false
},
{
"column": 11,
"value": "'+NOK",
"hasFormula": false
},
{
"column": 12,
"value": "'@year",
"hasFormula": false
},
{
"column": 13,
"value": "'=1+1",
"hasFormula": false
},
{
"column": 14,
"value": "2026-09-10T12:30:00.0000000Z",
"hasFormula": false
},
{
"column": 15,
"value": "'+1",
"hasFormula": false
},
{
"column": 16,
"value": "'=SUM(1,2)\næøå",
"hasFormula": false
},
{
"column": 17,
"value": "'=1+1\r\nÆØÅ",
"hasFormula": false
}
]
}
]
@@ -0,0 +1,7 @@
{
"file": "before.csv",
"excelVersion": "16.0",
"company": "Ærlig Økonomi Ås",
"title": 2.0,
"titleHasFormula": true
}
@@ -0,0 +1,37 @@
param([string[]]$CsvPaths)
$ErrorActionPreference = 'Stop'
$excel = $null
$results = @()
try {
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$excel.EnableEvents = $false
$excel.AskToUpdateLinks = $false
$excel.AutomationSecurity = 3
foreach ($csvPath in $CsvPaths) {
$book = $null
try {
$resolved = (Resolve-Path -LiteralPath $csvPath).Path
$book = $excel.Workbooks.Open($resolved, 0, $true)
$sheet = $book.Worksheets.Item(1)
$company = $sheet.Cells.Item(2, 1)
$title = $sheet.Cells.Item(2, 4)
$cells = @()
for ($column = 1; $column -le 17; $column++) {
$cell = $sheet.Cells.Item(2, $column)
$cells += [ordered]@{ column = $column; value = $cell.Value2; hasFormula = $cell.HasFormula }
[void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($cell)
}
$results += [ordered]@{ file = [IO.Path]::GetFileName($resolved); excelVersion = $excel.Version; company = $company.Value2; title = $title.Value2; titleHasFormula = $title.HasFormula; cells = $cells }
[void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($company)
[void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($title)
[void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($sheet)
} finally {
if ($null -ne $book) { $book.Close($false); [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($book) }
}
}
} finally {
if ($null -ne $excel) { $excel.Quit(); [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel) }
}
$results | ConvertTo-Json -Depth 6
@@ -0,0 +1,132 @@
{
"ticket": "B05",
"date": "2026-09-09",
"scope": "Local only; B01-B04 preserved; B06 not started",
"results": {
"beforeRegression": {
"expectedFailure": true,
"passed": 0,
"exitCode": 1,
"failed": 1
},
"focusedCsvBackend": {
"passed": 25,
"exitCode": 0,
"failed": 0
},
"backend": {
"passed": 902,
"skipped": 0,
"exitCode": 0,
"failed": 0,
"excluded": "ImapServiceSsrfGuardTests.ConnectAsync_rejects_unresolvable_host_without_leaking_dns_detail (external DNS not authorized)"
},
"focusedFrontend": {
"exitCode": 0,
"passed": 2
},
"frontend": {
"suites": 67,
"passed": 298,
"exitCode": 0
},
"browser": {
"flaky": 0,
"passed": 18,
"exitCode": 0,
"failed": 0
},
"b04Http": {
"exitCode": 0,
"passed": 9
},
"b03Admission": {
"exitCode": 0,
"passed": 1
},
"releaseApi": {
"warnings": 0,
"errors": 0,
"exitCode": 0
},
"releaseUi": {
"apiBase": "/api",
"exitCode": 0
},
"targetedLint": {
"exitCode": 0
},
"diffCheck": {
"exitCode": 0
},
"standaloneTypeScript": {
"preExisting": true,
"exitCode": 1,
"diagnostic": "src/interview-prep.test.tsx(120,10): error TS2571: Object is of type 'unknown'."
},
"excel": {
"numericCells": [
-750.5,
1200.75
],
"afterFormula": false,
"version": "16.0",
"typedFixtureAll17CellsNonFormula": true,
"norwegianPreserved": true,
"beforeValue": 2,
"afterTitle": "'=1+1",
"beforeFormula": true
},
"libreOffice": "Unavailable; not runtime-tested"
},
"rawArtifacts": [
{
"path": ".artifacts\\b05\\before.trx",
"sha256": "7c2e14872cebf6cd57ac22b9dba65bdd78909ec1a690f001483db1cb8002b68a"
},
{
"path": ".artifacts\\b05\\after.trx",
"sha256": "dc707e7e533b68e81b7dec0a81b20d90e66423ab315ff877d10525567b7aa781"
},
{
"path": ".artifacts\\b05\\backend.trx",
"sha256": "cba13821abdc4f38f51285a5b4dc8171239c24d699bfb24f29bf8f99ec1b0d57"
},
{
"path": ".artifacts\\b05\\frontend.json",
"sha256": "6e9b59bde603784b9bb9945e1463e1e066f313dc8fb3ea0a24d5a229804b0b9f"
},
{
"path": ".artifacts\\b05\\browser.json",
"sha256": "f4da84c36d73b6edd0e68116fc8aedd4a5c132285807cc7a42f8963c7cb6db6e"
},
{
"path": ".artifacts\\b05\\rate-limits.json",
"sha256": "81b05cee7468e2afab5b364c90bee10e3b588dad8d50414a8a6edf9dd63b28ed"
},
{
"path": ".artifacts\\b05\\pdf-admission.json",
"sha256": "4d567517777037f1dc45a261ef5392348af4acd2d6ea8b47530c7940109027ff"
},
{
"path": ".artifacts\\b05\\release-api.log",
"sha256": "ac70f0ed302111ed18456885e702a4707eeea66c6c8aaebcb6485fe0df3bbfdc"
},
{
"path": ".artifacts\\b05\\release-ui.log",
"sha256": "97d12bc08f21f0a0c1620482239965b5a6d0671a40782074c32b9ae2c8a6fc8f"
},
{
"path": ".artifacts\\b05\\lint.log",
"sha256": "33237f0ac9684aca5331e14fa4337efc24c4c03d39e589fd0fbca54f627a9483"
},
{
"path": ".artifacts\\b05\\typescript.log",
"sha256": "2f9960647abadefd054152a9566e4e6557a55383e98627aed742b93edebb16dd"
},
{
"path": ".artifacts\\b05\\diff-check.log",
"sha256": "4be06aeae2b435b624173459707d759d86b8e0dcb15f711722fd5b93eb1979de"
}
]
}
@@ -0,0 +1,5 @@
Company,CompanyLocation,CompanySource,JobTitle,Status,DateApplied,Location,Salary,SalaryMin,SalaryMax,SalaryCurrency,SalaryPeriod,NextAction,FollowUpAt,JobUrl,Notes,CoverLetterText
'=1+1,"' +SUM(1,2)",' -2+3,'@SUM(A1:A2),"'
=1+1",2026-09-09T12:30:00.0000000Z,'​=1+1,'-750,-750.50,1200.75,'+NOK,'@year,'=1+1,2026-09-10T12:30:00.0000000Z,'+1,"'=SUM(1,2)
æøå","'=1+1
ÆØÅ"
1 Company CompanyLocation CompanySource JobTitle Status DateApplied Location Salary SalaryMin SalaryMax SalaryCurrency SalaryPeriod NextAction FollowUpAt JobUrl Notes CoverLetterText
2 '=1+1 ' +SUM(1,2) ' -2+3 '@SUM(A1:A2) ' =1+1 2026-09-09T12:30:00.0000000Z '​=1+1 '-750 -750.50 1200.75 '+NOK '@year '=1+1 2026-09-10T12:30:00.0000000Z '+1 '=SUM(1,2) æøå '=1+1 ÆØÅ
@@ -0,0 +1,84 @@
geo $realip_remote_addr $ingress_peer_trusted {
default 0;
192.0.2.1/32 1;
2001:db8::1/128 1;
}
real_ip_header X-Forwarded-For;
real_ip_recursive off;
set_real_ip_from 192.0.2.1/32;
set_real_ip_from 2001:db8::1/128;
server {
listen 80 default_server;
server_name "";
location = /health {
access_log off;
default_type text/plain;
return 200 "ok\n";
}
location / {
return 444;
}
}
server {
listen 80;
server_name jobs.example.test;
if ($ingress_peer_trusted = 0) { return 403; }
if ($http_x_forwarded_proto != "https") { return 400; }
if ($http_x_forwarded_for = "") { return 400; }
if ($http_x_forwarded_for ~ ",") { return 400; }
# A malformed address is not forwarded verbatim: realip leaves the socket IP intact.
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri /index.html;
}
location = /health {
proxy_pass http://backend-web:8080/health;
proxy_http_version 1.1;
proxy_set_header Host jobs.example.test;
proxy_set_header X-Real-IP $remote_addr;
# realip resolves one sanitized address only from an explicitly trusted socket peer.
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host "";
proxy_set_header Forwarded "";
}
location = /ready {
proxy_pass http://backend-web:8080/ready;
proxy_http_version 1.1;
proxy_set_header Host jobs.example.test;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host "";
proxy_set_header Forwarded "";
}
location /api/ {
proxy_pass http://backend-web:8080;
proxy_http_version 1.1;
proxy_set_header Host jobs.example.test;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host "";
proxy_set_header Forwarded "";
}
}
@@ -0,0 +1,176 @@
{
"date": "2026-09-09",
"ticket": "B06",
"status": "Implemented; full local and production verification pending",
"effectiveCompose": {
"after": {
"services": [
{
"service": "ai-service",
"ports": null,
"networks": [
"ai_internal"
]
},
{
"service": "backend",
"ports": null,
"networks": [
"ai_internal",
"default",
"shared_services",
"web_proxy"
]
},
{
"service": "frontend",
"ports": [
{
"mode": "ingress",
"target": 80,
"published": "3000",
"protocol": "tcp"
}
],
"networks": [
"shared_services",
"web_proxy"
]
},
{
"service": "ollama",
"ports": null,
"networks": [
"ai_internal"
]
}
],
"frontendMode": "proxy",
"frontendPeers": "192.0.2.10/32",
"backendEnvironment": "Production",
"webProxy": {
"name": "jobtracker_web_proxy",
"ipam": {
"config": [
{
"subnet": "172.31.250.0/29"
}
]
},
"internal": true
}
},
"before": {
"services": [
{
"service": "ai-service",
"ports": null,
"networks": [
"ai_internal"
]
},
{
"service": "backend",
"ports": null,
"networks": [
"ai_internal",
"default",
"shared_services",
"web_proxy"
]
},
{
"service": "frontend",
"ports": [
{
"mode": "ingress",
"target": 80,
"published": "3000",
"protocol": "tcp"
}
],
"networks": [
"shared_services",
"web_proxy"
]
},
{
"service": "ollama",
"ports": null,
"networks": [
"ai_internal"
]
}
],
"frontendMode": null,
"frontendPeers": null,
"backendEnvironment": null,
"webProxy": {
"name": "jobtracker_web_proxy",
"ipam": {
"config": [
{
"subnet": "172.31.250.0/29"
}
]
},
"internal": true
}
}
},
"inputs": "Explicit synthetic env file; no production env inspected",
"nginxGeneration": {
"scope": "Real entrypoint generation/guards; nginx -t replaced because runtime unavailable",
"cases": [
{
"case": "missing peers",
"exit": 1
},
{
"case": "trust-all IPv4",
"exit": 1
},
{
"case": "trust-all IPv6",
"exit": 1
},
{
"case": "broad peer net",
"exit": 1
},
{
"case": "directive injection",
"exit": 1
},
{
"case": "direct HTTPS",
"exit": 1
},
{
"case": "proxy HTTP",
"exit": 1
},
{
"case": "trusted production",
"exit": 0
},
{
"case": "direct development",
"exit": 0
}
]
},
"topology": {
"actualTraefikProven": false,
"reason": "Docker engine pipe absent; Docker Desktop startup crashed on inaccessible dockerInference socket",
"actualNginxRuntimeProven": false,
"status": "Blocked before creating resources"
},
"production": {
"tls": "Not inspected",
"dns": "Not inspected",
"firewall": "Not inspected",
"peerAddresses": "Unknown; not guessed",
"deployed": false
}
}
@@ -0,0 +1,96 @@
{
"command": [
"docker",
"compose",
"--env-file",
".artifacts/b06/compose.env",
"-f",
"docker-compose.yml",
"--profile",
"bundled-ollama",
"config",
"--format",
"json"
],
"input": "Synthetic test env, not deployed .env; peer 192.0.2.10/32 is NOT an observed Traefik peer",
"services": {
"ai-service": {
"ports": [],
"expose": [
"8001"
],
"networks": {
"ai_internal": null
}
},
"backend": {
"ports": [],
"expose": [
"8080"
],
"networks": {
"ai_internal": null,
"default": null,
"shared_services": null,
"web_proxy": {
"aliases": [
"backend-web"
]
}
}
},
"frontend": {
"ports": [
{
"mode": "ingress",
"target": 80,
"published": "3000",
"protocol": "tcp"
}
],
"expose": [
"80"
],
"networks": {
"shared_services": null,
"web_proxy": null
}
},
"ollama": {
"ports": [],
"expose": [
"11434"
],
"networks": {
"ai_internal": null
}
}
},
"networks": {
"ai_internal": {
"name": "jobtracker_ai_internal",
"driver": "bridge",
"ipam": {}
},
"default": {
"name": "jobtracker_default",
"ipam": {}
},
"shared_services": {
"name": "jobtracker_shared",
"ipam": {},
"external": true
},
"web_proxy": {
"name": "jobtracker_web_proxy",
"ipam": {
"config": [
{
"subnet": "172.31.250.0/29"
}
]
},
"internal": true
}
}
}
@@ -0,0 +1,805 @@
{
"ticket": "B06",
"utc": "2026-09-09T16:06:49.668967+00:00",
"status": "Implementation complete; full local runtime and production verification incomplete; F04 open",
"public": {
"utc": "2026-09-09T10:43:53.552659+00:00",
"hostname": "jobs.cesnimda.uk",
"dns_addresses": [
"109.189.21.248"
],
"certificate": {
"verified": true,
"peer": [
"109.189.21.248",
443
],
"tls": "TLSv1.3",
"certificate": {
"subject": [
[
[
"commonName",
"jobs.cesnimda.uk"
]
]
],
"issuer": [
[
[
"countryName",
"US"
]
],
[
[
"organizationName",
"Let's Encrypt"
]
],
[
[
"commonName",
"YR2"
]
]
],
"version": 3,
"serialNumber": "060998FB27348950371ABE6EE336566BDEFE",
"notBefore": "Aug 16 20:35:58 2026 GMT",
"notAfter": "Nov 14 20:35:57 2026 GMT",
"subjectAltName": [
[
"DNS",
"jobs.cesnimda.uk"
]
],
"caIssuers": [
"http://yr2.i.lencr.org/"
],
"crlDistributionPoints": [
"http://yr2.c.lencr.org/127.crl"
]
}
},
"requests": [
{
"name": "public_https",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"https://jobs.cesnimda.uk/api/auth/config"
],
"exit": 0,
"headers": [
"HTTP/1.1 200 OK",
"Content-Type: application/json; charset=utf-8",
"Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()",
"Referrer-Policy: same-origin",
"Strict-Transport-Security: max-age=63072000; includeSubDomains; preload",
"X-Content-Type-Options: nosniff",
"X-Frame-Options: SAMEORIGIN"
],
"metadata": {
"http_code": 200,
"remote_ip": "109.189.21.248",
"remote_port": 443,
"local_ip": "192.168.50.2",
"ssl_verify_result": 0,
"time_total": 0.172905,
"exitcode": 0
},
"stderr": ""
},
{
"name": "public_http",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://jobs.cesnimda.uk/api/auth/config"
],
"exit": 0,
"headers": [
"HTTP/1.1 301 Moved Permanently",
"Location: https://jobs.cesnimda.uk:444/api/auth/config",
"Content-Length: 17"
],
"metadata": {
"http_code": 301,
"remote_ip": "109.189.21.248",
"remote_port": 80,
"local_ip": "192.168.50.2",
"ssl_verify_result": 0,
"time_total": 0.023086,
"exitcode": 0
},
"stderr": ""
},
{
"name": "public_https_forged_forwarding",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"https://jobs.cesnimda.uk/api/auth/config",
"--header",
"X-Forwarded-For: 198.51.100.10",
"--header",
"X-Forwarded-Proto: http",
"--header",
"X-Forwarded-Host: attacker.example.test"
],
"exit": 0,
"headers": [
"HTTP/1.1 200 OK",
"Content-Type: application/json; charset=utf-8",
"Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()",
"Referrer-Policy: same-origin",
"Strict-Transport-Security: max-age=63072000; includeSubDomains; preload",
"X-Content-Type-Options: nosniff",
"X-Frame-Options: SAMEORIGIN"
],
"metadata": {
"http_code": 200,
"remote_ip": "109.189.21.248",
"remote_port": 443,
"local_ip": "192.168.50.2",
"ssl_verify_result": 0,
"time_total": 0.173702,
"exitcode": 0
},
"stderr": ""
},
{
"name": "direct_3000_109.189.21.248_none",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:3000/api/auth/config",
"--header",
"Host: jobs.cesnimda.uk"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.040384,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:3000 after 2040 ms: Could not connect to server"
},
{
"name": "direct_3000_109.189.21.248_xff",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:3000/api/auth/config",
"--header",
"Host: jobs.cesnimda.uk",
"--header",
"X-Forwarded-For: 198.51.100.10"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.049992,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:3000 after 2049 ms: Could not connect to server"
},
{
"name": "direct_3000_109.189.21.248_proto",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:3000/api/auth/config",
"--header",
"Host: jobs.cesnimda.uk",
"--header",
"X-Forwarded-Proto: https"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.041284,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:3000 after 2041 ms: Could not connect to server"
},
{
"name": "direct_3000_109.189.21.248_host",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:3000/api/auth/config",
"--header",
"Host: attacker.example.test"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.053169,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:3000 after 2053 ms: Could not connect to server"
},
{
"name": "direct_3000_109.189.21.248_combined",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:3000/api/auth/config",
"--header",
"Host: jobs.cesnimda.uk",
"--header",
"X-Forwarded-For: 198.51.100.10",
"--header",
"X-Forwarded-Proto: https",
"--header",
"X-Forwarded-Host: attacker.example.test"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.042874,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:3000 after 2042 ms: Could not connect to server"
},
{
"name": "direct_3000_109.189.21.248_malformed_chain",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:3000/api/auth/config",
"--header",
"Host: jobs.cesnimda.uk",
"--header",
"X-Forwarded-For: not-an-ip, 198.51.100.10",
"--header",
"X-Forwarded-Proto: https"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.042874,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:3000 after 2042 ms: Could not connect to server"
},
{
"name": "direct_api_109.189.21.248_5202",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:5202/health",
"--header",
"Host: jobs.cesnimda.uk"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.043141,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:5202 after 2043 ms: Could not connect to server"
},
{
"name": "direct_api_109.189.21.248_8080",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"http://109.189.21.248:8080/health",
"--header",
"Host: jobs.cesnimda.uk"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.040558,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to 109.189.21.248:8080 after 2040 ms: Could not connect to server"
}
],
"vantage": "Connor Windows workstation; external independence/NAT hairpin not established",
"limitations": [
"No assertion of Traefik identity or upstream header values from public status alone",
"Connection failure does not identify which firewall/NAT/listener rejected it"
]
},
"publicFollowup": [
{
"name": "observed_http_redirect_target",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"https://jobs.cesnimda.uk:444/api/auth/config"
],
"exit": 7,
"headers": [],
"metadata": {
"http_code": 0,
"remote_ip": "",
"remote_port": -1,
"local_ip": "",
"ssl_verify_result": 0,
"time_total": 2.063806,
"exitcode": 7
},
"stderr": "curl: (7) Failed to connect to jobs.cesnimda.uk:444 after 2063 ms: Could not connect to server"
},
{
"name": "https_forged_host",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"https://jobs.cesnimda.uk/api/auth/config",
"--header",
"Host: attacker.example.test"
],
"exit": 0,
"headers": [
"HTTP/1.1 421 Misdirected Request",
"Content-Type: text/plain; charset=utf-8",
"X-Content-Type-Options: nosniff",
"Content-Length: 20"
],
"metadata": {
"http_code": 421,
"remote_ip": "109.189.21.248",
"remote_port": 443,
"local_ip": "192.168.50.2",
"ssl_verify_result": 0,
"time_total": 0.041514,
"exitcode": 0
},
"stderr": ""
},
{
"name": "https_malformed_chain",
"command": [
"curl.exe",
"--noproxy",
"*",
"--connect-timeout",
"4",
"--max-time",
"8",
"--silent",
"--show-error",
"--dump-header",
"-",
"--output",
"NUL",
"--write-out",
"\nB06_META %{json}\n",
"https://jobs.cesnimda.uk/api/auth/config",
"--header",
"X-Forwarded-For: not-an-ip, 198.51.100.10",
"--header",
"X-Forwarded-Proto: https"
],
"exit": 0,
"headers": [
"HTTP/1.1 200 OK",
"Content-Type: application/json; charset=utf-8",
"Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()",
"Referrer-Policy: same-origin",
"Strict-Transport-Security: max-age=63072000; includeSubDomains; preload",
"X-Content-Type-Options: nosniff",
"X-Frame-Options: SAMEORIGIN"
],
"metadata": {
"http_code": 200,
"remote_ip": "109.189.21.248",
"remote_port": 443,
"local_ip": "192.168.50.2",
"ssl_verify_result": 0,
"time_total": 0.037985,
"exitcode": 0
},
"stderr": ""
}
],
"dns": [
{
"Query": "A",
"Records": [
{
"Name": "jobs.cesnimda.uk",
"Type": 1,
"IPAddress": "109.189.21.248",
"NameHost": null,
"TTL": 208
}
]
},
{
"Query": "AAAA",
"Records": [
{
"Name": "cesnimda.uk",
"Type": 6,
"IPAddress": null,
"NameHost": null,
"TTL": 1708
}
]
},
{
"Query": "CNAME",
"Records": [
{
"Name": "jobs.cesnimda.uk",
"Type": 5,
"IPAddress": null,
"NameHost": "cesnimda.uk",
"TTL": 300
}
]
}
],
"authoritativeDns": [
{
"Server": "oaklyn.ns.cloudflare.com",
"Query": "A",
"Records": [
{
"Name": "jobs.cesnimda.uk",
"Type": 1,
"IPAddress": "109.189.21.248",
"NameHost": null,
"TTL": 300
}
]
},
{
"Server": "oaklyn.ns.cloudflare.com",
"Query": "AAAA",
"Records": [
{
"Name": "cesnimda.uk",
"Type": 6,
"IPAddress": null,
"NameHost": null,
"TTL": 1800
}
]
},
{
"Server": "oaklyn.ns.cloudflare.com",
"Query": "CNAME",
"Records": [
{
"Name": "jobs.cesnimda.uk",
"Type": 5,
"IPAddress": null,
"NameHost": "cesnimda.uk",
"TTL": 300
}
]
},
{
"Server": "thaddeus.ns.cloudflare.com",
"Query": "A",
"Records": [
{
"Name": "jobs.cesnimda.uk",
"Type": 1,
"IPAddress": "109.189.21.248",
"NameHost": null,
"TTL": 300
}
]
},
{
"Server": "thaddeus.ns.cloudflare.com",
"Query": "AAAA",
"Records": [
{
"Name": "cesnimda.uk",
"Type": 6,
"IPAddress": null,
"NameHost": null,
"TTL": 1800
}
]
},
{
"Server": "thaddeus.ns.cloudflare.com",
"Query": "CNAME",
"Records": [
{
"Name": "jobs.cesnimda.uk",
"Type": 5,
"IPAddress": null,
"NameHost": "cesnimda.uk",
"TTL": 300
}
]
}
],
"dockerStart": {
"command": [
"C:/Users/Connor/AppData/Local/Programs/DockerDesktop/resources/bin/docker.exe",
"desktop",
"start",
"--detach"
],
"exit": 0,
"stdout": "\u00e2\u0153\u201c Starting Docker Desktop\n",
"stderr": ""
},
"dockerEngine": {
"exit": null,
"timeoutSeconds": 10,
"command": [
"docker",
"version",
"--format",
"{{json .Server}}"
],
"utc": "2026-09-09T10:48:29.844623+00:00"
},
"dockerFailure": {
"message": "starting services: initializing Inference manager: listening on unix://C:/Users/Connor/AppData/Local/Docker/run/dockerInference: remove C:/Users/Connor/AppData/Local/Docker/run/dockerInference: The file cannot be accessed by the system. (listener: The filename, directory name, or volume label syntax is incorrect.)",
"socketObserved": {
"length": 0,
"attributes": [
"Archive",
"ReparsePoint"
],
"lastWriteDate": "2026-08-24",
"reparseQueryExit": 1,
"reparseQueryError": 1920
},
"gracefulStop": "Did not complete; waiting command interrupted. Desktop/backend processes remained. No forced process termination or socket/data changes."
},
"windowsWorkstation": {
"listeners": {
"LocalAddress": "127.0.0.1",
"LocalPort": 8080,
"OwningProcess": 17996
},
"port8080Process": "steamwebhelper; unrelated to Jobjakt",
"firewallProfiles": [
{
"Name": "Domain",
"Enabled": 1,
"DefaultInboundAction": 0,
"DefaultOutboundAction": 0
},
{
"Name": "Private",
"Enabled": 1,
"DefaultInboundAction": 0,
"DefaultOutboundAction": 0
},
{
"Name": "Public",
"Enabled": 1,
"DefaultInboundAction": 0,
"DefaultOutboundAction": 0
}
],
"productionHost": false
},
"sshDiscovery": {
"configExists": false,
"nonSecretRepoSources": "Only PROD_HOST/PROD_USER/PROD_SSH_KEY secret references found; no unambiguous alias/user",
"sshConnectionAttempted": false,
"credentialsAccessed": false
},
"runtimeTopologyStarted": false,
"observedTraefikPeer": null,
"actualBackendClientIp": null,
"applicationConfigurationChangesThisFollowup": []
}
@@ -0,0 +1,81 @@
"""Bounded, read-only B06 observations; no credentials, cookies or response bodies retained."""
import concurrent.futures
import datetime
import json
from pathlib import Path
import socket
import ssl
import subprocess
OUT = Path(__file__).resolve().parent
HOST = "jobs.cesnimda.uk" # .env.example canonical production hostname
SAFE_HEADERS = {"server", "location", "content-type", "content-length", "strict-transport-security",
"x-content-type-options", "x-frame-options", "referrer-policy", "permissions-policy"}
def request(name, url, headers=()):
command = ["curl.exe", "--noproxy", "*", "--connect-timeout", "4", "--max-time", "8",
"--silent", "--show-error", "--dump-header", "-", "--output", "NUL",
"--write-out", "\nB06_META %{json}\n", url]
for header in headers:
command.extend(["--header", header])
result = subprocess.run(command, capture_output=True, text=True, timeout=12)
raw_headers, _, metadata = result.stdout.partition("B06_META ")
safe = []
for line in raw_headers.splitlines():
if line.startswith("HTTP/") or line.partition(":")[0].lower() in SAFE_HEADERS:
safe.append(line)
try:
info = json.loads(metadata)
meta = {key: info.get(key) for key in ("http_code", "remote_ip", "remote_port", "local_ip",
"ssl_verify_result", "time_total", "exitcode")}
except ValueError:
meta = {}
return {"name": name, "command": command, "exit": result.returncode, "headers": safe,
"metadata": meta, "stderr": result.stderr.strip()}
def certificate():
try:
context = ssl.create_default_context()
with socket.create_connection((HOST, 443), timeout=8) as tcp:
with context.wrap_socket(tcp, server_hostname=HOST) as tls:
return {"verified": True, "peer": tls.getpeername(), "tls": tls.version(),
"certificate": tls.getpeercert()}
except Exception as error:
return {"verified": False, "error": str(error)}
if __name__ == "__main__":
addresses = sorted({item[4][0] for item in socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)})
cases = [
("public_https", f"https://{HOST}/api/auth/config", []),
("public_http", f"http://{HOST}/api/auth/config", []),
("public_https_forged_forwarding", f"https://{HOST}/api/auth/config",
["X-Forwarded-For: 198.51.100.10", "X-Forwarded-Proto: http", "X-Forwarded-Host: attacker.example.test"]),
]
for address in addresses:
literal = f"[{address}]" if ":" in address else address
for name, headers in [
("none", []),
("xff", ["X-Forwarded-For: 198.51.100.10"]),
("proto", ["X-Forwarded-Proto: https"]),
("host", ["Host: attacker.example.test"]),
("combined", ["X-Forwarded-For: 198.51.100.10", "X-Forwarded-Proto: https",
"X-Forwarded-Host: attacker.example.test"]),
("malformed_chain", ["X-Forwarded-For: not-an-ip, 198.51.100.10", "X-Forwarded-Proto: https"]),
]:
actual = headers if name == "host" else [f"Host: {HOST}"] + headers
cases.append((f"direct_3000_{address}_{name}", f"http://{literal}:3000/api/auth/config", actual))
for port in (5202, 8080):
cases.append((f"direct_api_{address}_{port}", f"http://{literal}:{port}/health", [f"Host: {HOST}"]))
# Three simultaneous harmless GETs at most; no login, mutations or quota exhaustion.
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as pool:
observations = list(pool.map(lambda args: request(*args), cases))
report = {"utc": datetime.datetime.now(datetime.timezone.utc).isoformat(), "hostname": HOST,
"dns_addresses": addresses, "certificate": certificate(), "requests": observations,
"vantage": "Connor Windows workstation; external independence/NAT hairpin not established",
"limitations": ["No assertion of Traefik identity or upstream header values from public status alone",
"Connection failure does not identify which firewall/NAT/listener rejected it"]}
(OUT / "public-observations.json").write_text(json.dumps(report, indent=2), encoding="utf-8")
print(json.dumps(report, indent=2))
@@ -0,0 +1,152 @@
{
"ticket": "B06 runtime follow-up",
"utc": "2026-09-09T16:06:49.668967+00:00",
"backend": {
"total": "166",
"executed": "166",
"passed": "166",
"failed": "0",
"error": "0",
"timeout": "0",
"aborted": "0",
"inconclusive": "0",
"passedButRunAborted": "0",
"notRunnable": "0",
"notExecuted": "0",
"disconnected": "0",
"warning": "0",
"completed": "0",
"inProgress": "0",
"pending": "0"
},
"http": {
"productionHttp": {
"startTime": "2026-09-09T10:47:16.476Z",
"duration": 7559.485,
"expected": 6,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"b04Http": {
"startTime": "2026-09-09T10:47:36.514Z",
"duration": 13004.1,
"expected": 9,
"skipped": 0,
"unexpected": 0,
"flaky": 0
}
},
"compose": {
"passed": 3,
"adversarialMutations": 17,
"preflightExit": 0
},
"runtimeTopology": "Blocked: Docker engine unavailable",
"priorBroaderEvidence": "b06-test-results.json; not rerun/relabelled",
"sourceHashes": {
"docker-compose.yml": "4ba32b2a61989fc068001addfc11cea3f04eaf1fa06baa2c26981b02ed75f526",
"docker-compose.dev.yml": "93795a046410680fe580e2e2a0e475847852675f747a8d0fef43f71a05255f02",
"job-tracker-ui/nginx.conf.template": "fbf478ccf84d7abad36155f56b3c06b0428b9c255cbca3c57473312d391435cc",
"job-tracker-ui/configure-nginx-origin.sh": "142a4f5d2cb348b636eda7602d17d4a7313fa22644933008b7fee8b094110b20",
"JobTrackerApi/Program.cs": "bbf8bdf2fd1d4af671ed81230265c66ab54cce6ca9bd5895f067753850fb7d14",
"JobTrackerApi/Services/ForwardedProxyConfiguration.cs": "7f514586a082b5004056ae4e02afbd083bce4ec4181dd516cc7fe5ef454eacf4",
"scripts/validate-ingress.py": "4872155c960a583cf646e1d82397617febf39c0ff3d71dcb62dcf672eeaa02bf"
},
"rawArtifacts": {
"compose-effective.json": {
"sha256": "f2df4491f8cdea58b45d9dffa1e7ad275bf3a52586788e455a88dff304dcdbbb",
"bytes": 9992
},
"compose-summary.json": {
"sha256": "104b5fcd0d69eaa54933785bbbb10c60f37460746e4f4fdb6c992bb7c06db9ec",
"bytes": 1849
},
"config-tests.log": {
"sha256": "303a0b2b8dbd504e7349cb2a51bd4300e1d5a2b1f4752afc7757a788e88a2748",
"bytes": 106
},
"dns-authoritative.json": {
"sha256": "cef242601f48748fc04624c0359e318a28b5b8737134bd4997fc4d1d1bfe0522",
"bytes": 1547
},
"dns-nameservers.json": {
"sha256": "46bef28f0faea3fdc350361b4281cb2202b2ddee3e1c4f53beaba309204e33c8",
"bytes": 243
},
"dns.json": {
"sha256": "fb8ab0cb3ca931e1b7dd421ab1110d94283563123f0ab4408db0d0656005941a",
"bytes": 644
},
"docker-engine.json": {
"sha256": "681f367adebe6b1660900483fd08169b6950ee13e21255de3dac5bd37b8967c8",
"bytes": 185
},
"docker-engine.log": {
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"bytes": 0
},
"docker-start.json": {
"sha256": "282494220ad25c8baa73b7e56fd9b2abf5ac7d7129514d507e3facbb8d9abe29",
"bytes": 249
},
"ingress-api-stderr.log": {
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"bytes": 0
},
"ingress-api.json": {
"sha256": "069f35cc5661df4f95b65da1c02b7bd4d48dab214de9a1517f20591f4c367540",
"bytes": 10052
},
"preflight.log": {
"sha256": "a6908efb401b7502ed125ce099b0394160aa3d1f50cd97bdb476a779af849fd0",
"bytes": 101
},
"probe.py": {
"sha256": "b5ad60d09f7710eab5a7d389e53387efd190b2f16c312abad1f4b5e0fbea6ad8",
"bytes": 4393
},
"public-followup.json": {
"sha256": "4d0ea815c0e6faf86d15f42d05e460520b491c83a748a261473269319b586b02",
"bytes": 2912
},
"public-observations.json": {
"sha256": "ce15b075650f8897ccc5b9417989c08697677352b3063b23757c6578216b3852",
"bytes": 12591
},
"rate-limits-stderr.log": {
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"bytes": 0
},
"rate-limits.json": {
"sha256": "d69bdf0c86e2789470e1a6b653ffeb24f1d14a9e528d1b80bf5756190e32e6e9",
"bytes": 14395
},
"regressions.log": {
"sha256": "1d215cbb352a54d85f2f739dded31adf27d4ad8c6dc1e9aafe2e00628c2b77fb",
"bytes": 859
},
"regressions.trx": {
"sha256": "6a80d605d8766ae0f171159d2a4233171877e549008d67f2f13853911f2e9bee",
"bytes": 258140
},
"windows-firewall-profiles.json": {
"sha256": "00934da15a36b9e3e8e82eee6b061bb114dc4865bc5aad75afe37161a04abf01",
"bytes": 357
},
"windows-listeners.json": {
"sha256": "c7f2be7b50f66d49b821870224d53a668f1b37c2e40a90e6a2ed6875fdcb9345",
"bytes": 86
},
"diff-check.log": {
"sha256": "73f0da2f8d5f4b51e09c9fe9c9914808c601c29c79df39e22cc4d39c64d53c7b",
"bytes": 4026
}
},
"diffCheck": {
"exit": 0,
"notes": "Git LF-to-CRLF notices; no whitespace errors"
},
"probeSyntax": "passed",
"evidenceJson": "all three new JSON files parse"
}
@@ -0,0 +1,145 @@
{
"ticket": "B06",
"date": "2026-09-09",
"status": "Implementation present; local topology and production verification incomplete",
"results": {
"productionHttp": {
"passed": 6
},
"lint": {
"exit": 0
},
"focusedBackend": {
"passed": 30
},
"releaseApi": {
"warnings": 0,
"errors": 0,
"exit": 0
},
"b03Admission": {
"passed": 1
},
"shellSyntax": {
"exit": 0
},
"browser": {
"flaky": 0,
"passed": 18
},
"nginxGeneration": {
"passed": 9,
"nginxRuntimeCheck": false
},
"typeScript": {
"preExisting": "src/interview-prep.test.tsx(120,10): TS2571",
"exit": 1
},
"b04Http": {
"passed": 9
},
"releaseUi": {
"exit": 0
},
"frontend": {
"suites": 67,
"passed": 298
},
"backend": {
"skipped": 0,
"passed": 915,
"excluded": "One pre-existing external-DNS IMAP test, not authorized"
},
"config": {
"adversarialMutations": 17,
"passed": 3
},
"topology": {
"blocked": true,
"exit": 1,
"passed": false
}
},
"rawArtifacts": [
{
"path": ".artifacts\\b06\\compose-before.json",
"sha256": "75e54b0ea70449f558e39e71726a66d8b76fb37f202a831a6db61bfe26b33df5"
},
{
"path": ".artifacts\\b06\\compose-after.json",
"sha256": "c296d84614d30af6c86714816ba3cf13f6d99936115f41490700ec4329c1cbb4"
},
{
"path": ".artifacts\\b06\\config-before.log",
"sha256": "04faeccf7f7921071797f79c2598d4cb9b62abe002d2314a3ffaac7d0973b33a"
},
{
"path": ".artifacts\\b06\\config-after.log",
"sha256": "87b9200e68ab8f8a2c45b7a10aadb08566aca31868ef3b3bd940d5b5e6a8c7b8"
},
{
"path": ".artifacts\\b06\\focused.trx",
"sha256": "d5b8bdd96ab89fdd33d886baa386630f3848a6c4ffb140cd4428359988d21c0c"
},
{
"path": ".artifacts\\b06\\backend.trx",
"sha256": "0359405752d4892363a282cbaecac9cf762a6e789d1919c904016112036af212"
},
{
"path": ".artifacts\\b06\\ingress-api.json",
"sha256": "91eaeddf553e36f89e32a1c7a76e9ec5835f90436c398c1ddd53b1d322a3a4f1"
},
{
"path": ".artifacts\\b06\\rate-limits.json",
"sha256": "ad4bbd48cef90daf05c0760db496019f1835fbf216cc232f4dff28ba10d6718f"
},
{
"path": ".artifacts\\b06\\pdf-admission.json",
"sha256": "d685192c7943e0d72b01483610b1913285bad09ba60160c6e3bf3269703f6d89"
},
{
"path": ".artifacts\\b06\\frontend.json",
"sha256": "c02e5af87e6be0d679f0af44cdd5df7366554843e2d8c326ee32cfca50ce17b8"
},
{
"path": ".artifacts\\b06\\browser.json",
"sha256": "7b05ed5e7c7b3fd52201bfb845bae43887fde1da4fb510db0b39a6a869eb565b"
},
{
"path": ".artifacts\\b06\\release-api.log",
"sha256": "f46f190e97c022c0d1ecaae8de03680e267bd21b866cf722c76018f3ba3645ae"
},
{
"path": ".artifacts\\b06\\release-ui.log",
"sha256": "8c5a8f22d14fddb8969520e182f56c19e066350ae1830997b7be44ab8269164f"
},
{
"path": ".artifacts\\b06\\lint.log",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"path": ".artifacts\\b06\\typescript.log",
"sha256": "2f9960647abadefd054152a9566e4e6557a55383e98627aed742b93edebb16dd"
},
{
"path": ".artifacts\\b06\\shell-syntax.log",
"sha256": "66ae0a81de0ac43e2b0acc263c168c4716072368f3265699733e9054a03c94f4"
},
{
"path": ".artifacts\\b06\\render-probe.json",
"sha256": "e4a776186029656716786452a866ba510c4aa899f3a23917a38da0d74bda725e"
},
{
"path": ".artifacts\\b06\\nginx-proxy.conf",
"sha256": "2027619cf3294138bc272a7c2e25089bbe5465faee4c798cea763862c3ffc1d9"
},
{
"path": ".artifacts\\b06\\nginx-direct.conf",
"sha256": "7a9573711cd424cbc4544ef341717556a6d84e56cb0a0a277cf58b13d35946f0"
},
{
"path": ".artifacts\\b06\\topology.log",
"sha256": "100b36f3954f4c0823117c2cab42694135128dcac29f78097d0c696df2165312"
}
]
}
@@ -0,0 +1,8 @@
Traceback (most recent call last):
File "E:\Storage\Projects\Active\Job tracker\scripts\test-ingress-topology.py", line 126, in <module>
main()
File "E:\Storage\Projects\Active\Job tracker\scripts\test-ingress-topology.py", line 27, in main
docker("info", "--format", "{{.ServerVersion}}")
File "E:\Storage\Projects\Active\Job tracker\scripts\test-ingress-topology.py", line 18, in docker
raise RuntimeError(result.stderr.strip())
RuntimeError: failed to connect to the docker API at npipe:////./pipe/dockerDesktopLinuxEngine; check if the path is correct and if the daemon is running: open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.
@@ -0,0 +1,88 @@
[
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://10.1.2.3/",
"Calls": 0,
"Parser": "none",
"Error": "Local or private network URLs are not allowed."
},
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://[::ffff:10.1.2.3]/",
"Calls": 1,
"Parser": "universal",
"Error": "No JobPosting schema found."
},
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://169.254.169.254/",
"Calls": 0,
"Parser": "none",
"Error": "Local or private network URLs are not allowed."
},
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://[::ffff:169.254.169.254]/",
"Calls": 1,
"Parser": "universal",
"Error": "No JobPosting schema found."
},
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://192.168.1.1/",
"Calls": 0,
"Parser": "none",
"Error": "Local or private network URLs are not allowed."
},
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://[::ffff:192.168.1.1]/",
"Calls": 1,
"Parser": "universal",
"Error": "No JobPosting schema found."
},
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://[::1]/",
"Calls": 0,
"Parser": "none",
"Error": "Local or private network URLs are not allowed."
},
{
"probe": "URL guard with non-network HTTP fake",
"target": "http://[::ffff:127.0.0.1]/",
"Calls": 0,
"Parser": "none",
"Error": "Local or private network URLs are not allowed."
},
{
"probe": "actual PDF exporter with three inert child processes",
"concurrentLaunches": 3
},
{
"probe": "two preloaded real SQLite contexts",
"Name": "Writer B",
"Version": 2,
"historyVersions": [
1,
2,
2
]
},
{
"probe": "one transient database command failure",
"concurrency": 1,
"Failures": 1,
"hostStopping": true,
"hostedTaskFaulted": true,
"error": "TimeoutException"
},
{
"probe": "one transient database command failure",
"concurrency": 2,
"Failures": 1,
"hostStopping": false,
"hostedTaskFaulted": false,
"error": null
}
]
@@ -0,0 +1,421 @@
{
"date": "2026-09-07T20:47:58.493Z",
"syntheticDataRoot": "C:\\Users\\Connor\\AppData\\Local\\Temp\\jobjakt-independent-ju4FBt",
"observations": [
{
"caseName": "stale revision",
"firstRevision": 2,
"staleStatus": 200,
"resultingName": "Stale writer",
"resultingRevision": 3
},
{
"caseName": "document owner boundaries",
"results": [
{
"route": "",
"status": 404,
"body": "{\"type\":\"https://tools.ietf.org/html/rfc9110#section-15.5.5\",\"title\":\"Not Found\",\"status\":404,\"traceId\":\"0HNOD452KNGOS:0000000B\"}"
},
{
"route": "/preview",
"status": 404,
"body": "{\"type\":\"https://tools.ietf.org/html/rfc9110#section-15.5.5\",\"title\":\"Not Found\",\"status\":404,\"traceId\":\"0HNOD452KNGOS:0000000C\"}"
},
{
"route": "/versions",
"status": 200,
"body": "[]"
},
{
"route": "/export-pdf",
"status": 404
}
]
},
{
"caseName": "repeated POST with same key",
"ids": [
1,
2
],
"deduplicated": false
},
{
"caseName": "date round trip",
"input": "2026-03-29T09:00:00+02:00",
"createValue": "2026-03-29T09:00:00+02:00",
"reloadValue": "2026-03-29T09:00:00",
"start": "DTSTART:20260329T090000Z"
},
{
"caseName": "date round trip",
"input": "2026-03-29T07:00:00Z",
"createValue": "2026-03-29T07:00:00Z",
"reloadValue": "2026-03-29T07:00:00",
"start": "DTSTART:20260329T070000Z"
},
{
"caseName": "date round trip",
"input": "2026-03-29",
"createValue": "2026-03-29T00:00:00",
"reloadValue": "2026-03-29T00:00:00",
"start": "DTSTART:20260329T000000Z"
},
{
"caseName": "date round trip",
"input": "2026-10-25T02:30:00+02:00",
"createValue": "2026-10-25T02:30:00+02:00",
"reloadValue": "2026-10-25T02:30:00",
"start": "DTSTART:20261025T023000Z"
},
{
"caseName": "date round trip",
"input": "2026-10-25T02:30:00+01:00",
"createValue": "2026-10-25T02:30:00+01:00",
"reloadValue": "2026-10-25T02:30:00",
"start": "DTSTART:20261025T023000Z"
},
{
"caseName": "CSV arithmetic payload",
"containsUnneutralizedFormula": true
},
{
"caseName": "owner rate isolation",
"accountA": [
200,
200
],
"firstAccountB": 429
},
{
"caseName": "real UI cross-account stale form save",
"oldVisible": "A edit must never enter B account",
"saveStatus": 200,
"profileB": "A edit must never enter B account",
"profileA": "Private profile A"
},
{
"caseName": "builder axe light",
"width": 1440,
"height": 1000,
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"nodes": [
{
"target": [
".css-1guz6s > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-1d1pejv > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(2) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(4) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(6) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
}
]
},
{
"caseName": "builder axe light",
"width": 1440,
"height": 900,
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"nodes": [
{
"target": [
".css-1guz6s > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-1d1pejv > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(2) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(4) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(6) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
}
]
},
{
"caseName": "builder axe light",
"width": 375,
"height": 900,
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"nodes": [
{
"target": [
".css-1guz6s > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-1d1pejv > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(2) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(4) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-de8i06.MuiPaper-outlined.MuiPaper-rounded:nth-child(6) > .css-1wz1o3r.MuiStack-root > .css-w4rcel.MuiChip-colorSuccess.MuiChip-outlinedSuccess > .MuiChip-label.MuiChip-labelSmall.css-d6wmh0"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.29 (foreground color: #16a34a, background color: #ffffff, font size: 7.5pt (10px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
}
]
},
{
"caseName": "builder axe dark",
"width": 1440,
"height": 1000,
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"nodes": [
{
"target": [
".MuiButtonGroup-lastButton"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.66 (foreground color: #5b5bd6, background color: #0b0b0e, font size: 9.8pt (13px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"target": [
".MuiButton-sizeMedium"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.66 (foreground color: #5b5bd6, background color: #0b0b0e, font size: 10.5pt (14px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".MuiButton-text"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-1ebacnx > .MuiButton-outlinedSizeSmall.css-3r48dj.MuiButton-outlined"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".Mui-selected.MuiTab-root.MuiTab-textColorPrimary"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 10.5pt (14px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-va5cz9 > .MuiButton-outlinedSizeSmall.css-3r48dj.MuiButton-outlined"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "scrollable-region-focusable",
"impact": "serious",
"nodes": [
{
"target": [
".css-1yn80jq"
],
"summary": "Fix any of the following:\n Element should have focusable content\n Element should be focusable"
}
]
}
]
},
{
"caseName": "scroll region structure",
"tag": "DIV",
"tabIndex": -1,
"overflow": "auto",
"maxHeight": "860px",
"clientHeight": 860,
"scrollHeight": 868,
"previewPages": 1,
"frames": 1
},
{
"caseName": "builder axe dark",
"width": 1440,
"height": 900,
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"nodes": [
{
"target": [
".MuiButtonGroup-lastButton"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.66 (foreground color: #5b5bd6, background color: #0b0b0e, font size: 9.8pt (13px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"target": [
".MuiButton-sizeMedium"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.66 (foreground color: #5b5bd6, background color: #0b0b0e, font size: 10.5pt (14px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".MuiButton-text"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-1ebacnx > .MuiButton-outlinedSizeSmall.css-3r48dj.MuiButton-outlined"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".Mui-selected.MuiTab-root.MuiTab-textColorPrimary"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 10.5pt (14px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-va5cz9 > .MuiButton-outlinedSizeSmall.css-3r48dj.MuiButton-outlined"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "scrollable-region-focusable",
"impact": "serious",
"nodes": [
{
"target": [
".css-1yn80jq"
],
"summary": "Fix any of the following:\n Element should have focusable content\n Element should be focusable"
}
]
}
]
},
{
"caseName": "scroll region structure",
"tag": "DIV",
"tabIndex": -1,
"overflow": "auto",
"maxHeight": "774px",
"clientHeight": 774,
"scrollHeight": 868,
"previewPages": 1,
"frames": 1
},
{
"caseName": "builder axe dark",
"width": 375,
"height": 900,
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"nodes": [
{
"target": [
".MuiButtonGroup-lastButton"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.66 (foreground color: #5b5bd6, background color: #0b0b0e, font size: 9.8pt (13px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-a5lp7y > .MuiButton-text.MuiButton-textPrimary.MuiButton-textSizeSmall"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-1ebacnx > .MuiButton-text.MuiButton-textPrimary.MuiButton-textSizeSmall"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-1ebacnx > .MuiButton-outlined.MuiButton-outlinedPrimary.MuiButton-outlinedSizeSmall"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".Mui-selected.MuiTab-root.MuiTab-textColorPrimary"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 10.5pt (14px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"target": [
".css-va5cz9 > .MuiButton-outlined.MuiButton-outlinedPrimary.MuiButton-outlinedSizeSmall"
],
"summary": "Fix any of the following:\n Element has insufficient color contrast of 3.5 (foreground color: #5b5bd6, background color: #111116, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
}
]
}
]
}
@@ -0,0 +1,31 @@
{
"applicationCommit": "7d641edc7bca866ccf06012897ba1d107c07e59f",
"backendRuns": [
{
"artifact": "validation.trx",
"total": 70,
"passed": 70,
"failed": 0,
"start": "2026-09-07T17:59:12.5528301+02:00",
"finish": "2026-09-07T17:59:17.2551797+02:00",
"sha256": "8D27447E90FD7473BB47C9E4D1D57EF567A3F280BD8D547A1EF4072373FA4383"
},
{
"artifact": "security-validation.trx",
"total": 79,
"passed": 79,
"failed": 0,
"start": "2026-09-07T22:46:38.2482618+02:00",
"finish": "2026-09-07T22:46:44.9279673+02:00",
"sha256": "AE89D456BEF9BC418A0F8890DDC9C56857605434CB1536B79C94443576EBAF87"
}
],
"frontend": {
"artifact": "interview-jest.json",
"suites": 1,
"passed": 13,
"failed": 0,
"sha256": "2F201E9E1D95A1C676337FB36E991BC260EA1CD1C493E1063B3B039684F954ED"
},
"typecheck": "src/interview-prep.test.tsx(120,10): error TS2571: Object is of type 'unknown'."
}