Files
jobtrackingapp/docs/audits/audit-progress.md
T
2026-08-09 13:24:26 +02:00

18 KiB
Raw Blame History

JobTracker full-application audit progress

Audit started: 2026-08-02

Overall status: Complete to all safe/local evidence boundaries; blocked checks are explicitly recorded.

Scope: repository-wide implementation, user-journey, security, privacy, supply-chain, reliability, testing, performance, and documentation audit. Application code and configuration are read-only for this audit.

Phase 1 — Repository discovery

Status: Complete

Work completed

  • Captured initial Git status.
  • Located and read the repository AGENTS.md.
  • Began inventorying tracked source, documentation, configuration, generated output, archived material, vendor code, and auxiliary tools.
  • Read current README, architecture, roadmap, TODO/blocker, environment, deployment, backup, release, package, container, CI, and AI-sidecar material.
  • Traced executable entry points, authentication/authorization setup, EF ownership model, frontend routing, hosted workers, storage, integrations, and deployment topology.
  • Compared documentation with the current source and classified ignored/generated/vendored paths.
  • Searched production source for unfinished-code markers.

Commands executed

  • git status --short --branch
  • rg --files -g AGENTS.md -g '!**/node_modules/**' -g '!**/bin/**' -g '!**/obj/**'
  • Get-ChildItem -Force | Select-Object Mode,Length,LastWriteTime,Name
  • rg --files -g '!**/node_modules/**' -g '!**/bin/**' -g '!**/obj/**' -g '!**/.git/**' | Measure-Object | Select-Object -ExpandProperty Count
  • Get-Content -Raw -LiteralPath AGENTS.md
  • Repository documentation, directory, CI-workflow, and tracked-file listings using rg, Get-ChildItem, and git ls-files.
  • git status --short --ignored | Select-Object -First 250
  • rg -n -i ... '(TODO|FIXME|HACK|temporary|placeholder|\\bstub\\b|not implemented|NotImplementedException)' ...
  • Targeted line-numbered inspection of Program.cs, JobTrackerContext.cs, controllers, services, models, frontend routes/auth/API client, package manifests, Dockerfiles, Compose, nginx, CI, and the AI sidecar.

Evidence collected

  • Initial branch: release-readiness tracking origin/release-readiness.
  • Pre-existing worktree changes: deleted .agent.md; untracked AGENTS.md.
  • Initial top-level component and documentation listings.
  • docs/audits/evidence/repository-inventory.md.

Findings recorded

  • Documentation drift identified; detailed finding IDs will be assigned after cross-phase validation.

Checks that remain

  • Validate build/test/tooling baseline and confirm whether documentation claims still hold.

Blockers and limitations

  • No Phase 1 blocker. Ignored local copies and generated output were excluded from handwritten-code review.

Next phase

  • Phase 2 — build and verification baseline.

Phase 2 — Build and verification baseline

Status: Complete

Work completed

  • Classified planned commands as non-destructive; builds/tests may update ignored build output and local package caches only.
  • Restored/validated declared dependencies without changing manifests or lockfiles.
  • Built the .NET solution and frontend production export.
  • Ran backend, frontend, AI-sidecar, and isolated Chromium suites.
  • Ran TypeScript and formatting checks without rewriting source.
  • Validated Compose, migration/model state, Dockerfiles, dependencies, and tracked-secret patterns.

Commands executed

  • Exact commands and results are recorded in docs/audits/verification-log.md (V-001 through V-027).

Evidence collected

  • Build/test outputs above plus the verification log.
  • Current tracked tree and reachable-history secret-pattern scans with values suppressed.

Findings recorded

  • Standalone TypeScript check failure, formatting-baseline failure, npm advisories, Python advisory volume, tracked expired token artifact, and reproducibility gaps require cross-phase validation and finding IDs.

Checks that remain

  • Container image CVE scanning was unavailable locally.
  • Advisory applicability and severity need source-path review.

Blockers and limitations

  • gitleaks, trivy, and hadolint unavailable.
  • Production/remote CI status is outside this local audit; no production system was contacted.

Next phase

  • Phase 3 — architecture, backend, frontend, and data review.

Phase 3 — Architecture and code-quality audit

Status: Complete

Work completed

  • Traced controller/service/data paths for jobs, career profiles, CVs, application workspaces, correspondence, attachments, AI, identity, rules, exports, and backups.
  • Reviewed frontend routing, API-client use, state/error/empty flows, forms, persistence, rendering, responsiveness, and accessibility affordances.
  • Executed default-SQLite paths identified as risky by source inspection.

Commands executed

  • Targeted rg, Get-Content, EF model/migration inspection, and disposable endpoint/worker checks V-031 through V-033.

Evidence collected

  • evidence/runtime-evidence.md, evidence/two-user-isolation.md, and line-numbered source locations used in the main report.

Findings recorded

  • Confirmed default-SQLite API failures, ambiguous routes, inert tenant-scoped workers, non-atomic attachment/file operations, and client-only notification preferences.

Checks that remain

  • Manual browser-dependent UX/accessibility checks remain blocked.

Blockers and limitations

  • No MariaDB server was available, so provider parity beyond source/migration inspection is unverified.

Next phase

  • Phase 4 — hands-on user journeys.

Phase 4 — Hands-on user journey audit

Status: Complete to the available evidence boundary

Work completed

  • Ran isolated Chromium coverage for login, manual saved-job creation, Career Workspace shell, and anonymous public-CV/PDF.
  • Used two synthetic accounts for empty-account, ownership, job, correspondence, CV, workspace, attachment, settings, and admin API checks.
  • Classified every discovered workflow in user-journey-audit.md.

Commands executed

  • V-026 and V-030 through V-040 in verification-log.md.

Evidence collected

  • evidence/browser-evidence.md, evidence/runtime-evidence.md, and evidence/two-user-isolation.md.

Findings recorded

  • Core Career/Application Workspace failures and accessibility/browser-regression gaps.

Checks that remain

  • Manual viewport, keyboard, console/network, slow-network, multi-tab, and failure-injection journeys.

Blockers and limitations

  • Mandatory in-app browser client missing; no permitted fallback and no screenshots.
  • Real email/OAuth/AI/billing services intentionally not contacted.

Next phase

  • Phase 5 — threat model and security audit.

Phase 5 — Threat model and security audit

Status: Complete

Work completed

  • Modelled assets, roles, entry points, trust boundaries, flows, attacker capabilities, abuse cases, mitigations, and high-risk paths.
  • Reviewed authentication, authorization/IDOR, sessions, OAuth/OIDC, CSRF/XSS/SSRF, uploads, CORS/headers, secrets, rate limiting, containers, and AI boundaries.
  • Performed two-user direct-ID and live logout/verification lifecycle checks.

Commands executed

  • V-031 and V-035 through V-037, secret scans, source searches, and official Microsoft identity-documentation lookup.

Evidence collected

  • security-threat-model.md, two-user matrix, runtime evidence, and filenames-only secret evidence.

Findings recorded

  • Microsoft identity binding, host-derived recovery links, verification/session gaps, parser advisories, and lower-severity SSRF/rendering hardening.

Checks that remain

  • External-provider exploit reproduction was not safe/in scope; prerequisites remain explicit.

Blockers and limitations

  • No aggressive testing, production contact, real provider tokens, or real email.

Next phase

  • Phase 6 — technical privacy assessment.

Phase 6 — Technical privacy assessment

Status: Complete

Work completed

  • Traced identity, profile/CV, job, correspondence, attachment, provider token, AI, document, log, backup, export, and deletion lifecycles.
  • Separated technical controls from legal-policy questions.

Commands executed

  • Targeted owner/entity/file/export/delete/provider/AI source inspection.

Evidence collected

  • Privacy sections in the main report and threat model.

Findings recorded

  • Incomplete admin deletion/export and missing per-user global AI control/provider-recipient explanation.

Checks that remain

  • Production retention, logs, backups, processor contracts, and legal basis require operator/legal evidence.

Blockers and limitations

  • Technical assessment only; production/provider contracts not accessed.

Next phase

  • Phase 7 — dependencies and supply chain.

Phase 7 — Dependencies and supply chain

Status: Complete

Work completed

  • Audited advisories, deprecations, version drift, locks, Docker bases, CI actions, remote installers, and licence/SBOM controls.
  • Re-read advisory descriptions against actual upload/model paths.

Commands executed

  • V-020 through V-025, V-028/V-029, V-041/V-042, and Dockerfile/CI inspection.

Evidence collected

  • evidence/dependency-evidence.md.

Findings recorded

  • Reachable document-parser denial of service, moderate React Router advisories, and reproducibility/provenance gaps.

Checks that remain

  • Container package CVEs and full licence compatibility need dedicated scanners/legal review.

Blockers and limitations

  • Trivy/gitleaks/hadolint unavailable; no dependency upgraded.

Next phase

  • Phase 8 — reliability, deployment, and recovery.

Phase 8 — Reliability, deployment, and recovery

Status: Complete

Work completed

  • Reviewed Compose/Dockerfiles, health/startup, shutdown, resources, migrations/reconciliation, deploy/rollback, logging, metrics, workers, partial failure, and backups.
  • Rehearsed SQLite database and full-data-root restoration with disposable data.

Commands executed

  • V-016/V-017/V-023 through V-025/V-033/V-034 plus deployment-source inspection.

Evidence collected

  • Restore results in evidence/runtime-evidence.md.

Findings recorded

  • SQLite restore passes; files/keys/config are separate; MariaDB needs external backup; no RPO/RTO or routine restore proof; workers fail silently; startup reconciler is risky complexity.

Checks that remain

  • MariaDB restore, production rollback, restart/resource pressure, and monitoring delivery.

Blockers and limitations

  • No production deployment, registry, remote host, or MariaDB instance used.

Next phase

  • Phase 9 — testing assessment.

Phase 9 — Testing assessment

Status: Complete

Work completed

  • Mapped backend, frontend, Python, and browser tests to core journeys and observed defects.
  • Reviewed determinism, isolation, authorization, failure paths, accessibility, and CI gates.

Commands executed

  • V-010/V-012/V-014/V-026 plus test-file and CI-workflow inventories.

Evidence collected

  • Test mapping in the main and journey reports.

Findings recorded

  • Missing route-table, default-SQLite HTTP, worker-context, account-lifecycle, accessibility, and Python CI gates.

Checks that remain

  • Remote CI execution status was not queried.

Blockers and limitations

  • Raw line coverage was not used as proof of quality.

Next phase

  • Phase 10 — performance assessment.

Phase 10 — Performance assessment

Status: Complete to safe-local scope

Work completed

  • Measured warm local API latency and aggregate export size; inspected pagination, query patterns, upload buffering, worker sequencing, and admin N+1 behaviour.
  • Separated measured results, clear inefficiencies, measurement-needed risks, and optional optimisation.

Commands executed

  • V-038/V-039 and query-loop/pagination inspection.

Evidence collected

  • evidence/runtime-evidence.md performance table.

Findings recorded

  • Small-data timings healthy; pre-limit buffering clearly inefficient; larger-data/browser capacity unverified.

Checks that remain

  • Production-like transfer, memory, query counts, AI latency, email throughput, and large datasets.

Blockers and limitations

  • No load test; browser performance tooling blocked.

Next phase

  • Phase 11 — documentation and developer experience.

Phase 11 — Documentation and developer experience

Status: Complete

Work completed

  • Compared feature/setup/architecture/migration/test/deploy/API claims with source and runtime; evaluated clean onboarding.

Commands executed

  • Phase 1 documentation inventory plus toolchain/build/runtime verification.

Evidence collected

  • Repository inventory and main-report documentation section.

Findings recorded

  • Obsolete CRA README, unsupported PostgreSQL advice, stale API architecture, no global.json, incomplete environment reference, and stale CI comments.

Checks that remain

  • Operator-only documentation may exist outside the repository.

Blockers and limitations

  • External documentation not accessed.

Next phase

  • Phase 12 — sceptical validation.

Phase 12 — Sceptical validation

Status: Complete

Work completed

  • Re-read every Critical/High candidate end to end, searched mitigations, repeated safe reproductions, checked prerequisites, and merged/downgraded overlap.
  • Separated parser reachability from fixed-model loader advisories.
  • Confirmed no cross-user disclosure in meaningful two-user results.

Commands executed

  • V-031 through V-043, official Microsoft identity guidance lookup, source rereads, and final cleanup/status checks.

Evidence collected

  • All deliverables and evidence under docs/audits/.

Findings recorded

  • No Critical finding. High findings retain explicit prerequisites; unperformed external exploits remain labelled unverified.

Checks that remain

  • Only blocked/production/external checks listed in the reports.

Blockers and limitations

  • Missing browser client, no MariaDB, no container CVE scanner, no production/provider access.

Next phase

  • Stop after delivery and await remediation approval.

Post-audit programme execution — POL-002

Status: Implemented; browser/production verification incomplete (2026-08-03).

Work completed

  • Revalidated AI privacy/provider paths and implemented server-persisted AI opt-out plus explicit external-processing consent.
  • Added independent backend/sidecar administrator gates and a deny-by-default permission header at the shared /cv/* boundary.
  • Added Settings UI, additive migration, architecture/verification documentation and synthetic-only tests.

Commands and evidence

  • Verification-log entries V-089 through V-095.
  • docs/verification/pol-002-ai-privacy.md and docs/audits/evidence/pol-002/README.md.

Findings / limitations

  • No production, paid provider, real private data or browser was used.
  • Historical EF-only clean SQLite migration remains blocked before the new migration; the new SQL/defaults and model snapshot pass inspection.
  • AI-001/002 must add durable policy snapshots, actual provider/reason recording and bounded local-first fallback before rollout.

Next phase

  • AI-001 durable AI queue/worker admission, reusing OPS-001A/B/C.

Post-audit programme execution — AI-001

Status: Implemented; real-handler/browser/production verification incomplete (2026-08-03).

  • Work completed: shared Pro/privacy admission, bounded capacity/priority, typed default-off worker, owner/policy recheck, heartbeat/timeout/retry/cancellation integration and configuration.
  • Commands/evidence: verification-log V-096/V-097; docs/verification/ai-001-durable-ai-queue.md.
  • Findings: no new schema/raw private queue payload; multi-replica capacity needs a future database reservation; actual 202 producers and provider controls remain AI-003/004 and AI-002.
  • Blockers: browser, MariaDB and production unavailable; worker intentionally off.
  • Next phase: AI-002 Ollama adapter and central local-first routing.

Post-audit programme execution — AI-002

Status: Implemented; browser/model/provider/production verification incomplete (2026-08-09).

  • Work completed: revalidated every AI endpoint/caller; replaced direct configured-provider dispatch with one sequential local-first router; added task/consent/config/prompt-cost gates, bounded circuit/health state, typed sanitized failures and actual provider/model/route persistence for AI history and durable operations.
  • Commands/evidence: verification-log V-098V-100; docs/verification/ai-002-provider-routing.md; docs/audits/evidence/ai-002/README.md.
  • Findings: no schema/dependency change and no provider race. New durable tasks fail safe to local until allowlisted. Per-request prompt ceiling exists, but complete monthly cross-feature accounting remains incomplete. Circuit state is process-local for the current single-sidecar design.
  • Checks that remain: real AI-003/004 handlers/producers; selected-model benchmark; browser disclosure; MariaDB; controlled synthetic external fallback; production health/restart/canary/rollback.
  • Blockers and limitations: no browser, production access, model benchmark or provider authority/configuration; no real/private input used.
  • Next phase: AI-003 Strategy Snapshot durable-operation migration.

Post-audit programme execution — AI-003

Status: Implemented; browser/model/MariaDB/restart/production verification incomplete (2026-08-09).

  • Work completed: replaced synchronous Focus Plan generation with a typed strategy.snapshot producer/handler on the shared durable queue; GET is cache-only; added owner-scoped rehydration, one bounded structured model request, full-response validation, idempotent active work, resume lookup, provenance and explicit UI queue/cancel/retry/failure/completion states.
  • Commands/evidence: verification-log V-101V-103; docs/verification/ai-003-strategy-snapshot-queue.md; docs/audits/evidence/ai-003/README.md; commit a621226.
  • Findings: root code path was four sequential model calls in an HTTP GET, sometimes alongside candidate fit. Authorization/tenant filters existed. No schema/dependency change was needed. Strategy remains local-only and the worker remains default-off.
  • Checks that remain: real browser responsive/theme/keyboard/refresh checks; selected-model timeout/quality; MariaDB; real restart recovery; production telemetry/canary/rollback; cross-feature usage accounting.
  • Blockers and limitations: browser policy, production access and model/MariaDB environments unavailable; fake model/synthetic data only.
  • Next phase: AI-004 CV-processing 504 durable-operation migration.