Files
jobtrackingapp/.gsd/state-manifest.json
T
2026-04-01 11:48:25 +02:00

1690 lines
73 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"version": 1,
"exported_at": "2026-03-28T22:06:02.266Z",
"milestones": [
{
"id": "M001",
"title": "M001: M001: Gmail and draft quality loop",
"status": "active",
"depends_on": [],
"created_at": "2026-03-28T22:02:57.775Z",
"completed_at": null,
"vision": "",
"success_criteria": [],
"key_risks": [],
"proof_strategy": [],
"verification_contract": "",
"verification_integration": "",
"verification_operational": "",
"verification_uat": "",
"definition_of_done": [],
"requirement_coverage": "",
"boundary_map_markdown": ""
},
{
"id": "M002",
"title": "",
"status": "active",
"depends_on": [],
"created_at": "2026-03-28T22:04:42.699Z",
"completed_at": null,
"vision": "",
"success_criteria": [],
"key_risks": [],
"proof_strategy": [],
"verification_contract": "",
"verification_integration": "",
"verification_operational": "",
"verification_uat": "",
"definition_of_done": [],
"requirement_coverage": "",
"boundary_map_markdown": ""
},
{
"id": "M003",
"title": "",
"status": "active",
"depends_on": [],
"created_at": "2026-03-28T22:04:42.699Z",
"completed_at": null,
"vision": "",
"success_criteria": [],
"key_risks": [],
"proof_strategy": [],
"verification_contract": "",
"verification_integration": "",
"verification_operational": "",
"verification_uat": "",
"definition_of_done": [],
"requirement_coverage": "",
"boundary_map_markdown": ""
},
{
"id": "M004",
"title": "",
"status": "active",
"depends_on": [],
"created_at": "2026-03-28T22:04:42.699Z",
"completed_at": null,
"vision": "",
"success_criteria": [],
"key_risks": [],
"proof_strategy": [],
"verification_contract": "",
"verification_integration": "",
"verification_operational": "",
"verification_uat": "",
"definition_of_done": [],
"requirement_coverage": "",
"boundary_map_markdown": ""
},
{
"id": "M005",
"title": "",
"status": "queued",
"depends_on": [],
"created_at": "2026-03-28T22:02:57.780Z",
"completed_at": null,
"vision": "Turn the current CV upload and tailoring surfaces into a robust canonical-profile pipeline: preserve raw uploads, extract a confidence-scored structured CV through a multi-pass process, let the user review/edit uncertain fields, generate job-specific tailored CV drafts separate from the master profile, and render previewable downloadable PDFs from selectable templates without crossing the manual-send or individual-first product boundaries.",
"success_criteria": [
"Uploading a CV preserves the original artifact, raw extracted text, normalized text, extraction metadata, and a canonical structured CV profile with field-level confidence/provenance.",
"The structured CV editor highlights uncertain extracted fields and supports review, edit, accept, and reprocess flows without destroying raw source data.",
"The app can generate and persist a job-specific tailored CV draft that is separate from both the master CV and the final PDF export.",
"At least one HTML/CSS-backed template can preview and export a tailored CV as a downloadable PDF; the renderer is deterministic and uses the same template for preview and export.",
"The PDF export flow remains individual-first and manual: users explicitly choose template/options and explicitly download the generated document.",
"Template controls support at least photo visibility, one-page vs two-page mode, accent color, section ordering, and bullet density on the tailored draft/render layer."
],
"key_risks": [
{
"risk": "Plain-text-only parsing will keep collapsing complex/two-column CVs into weak structure and reduce trust in the review surface.",
"whyItMatters": "If extraction quality is poor, every downstream draft/PDF feature is working from a broken model and the product feels unreliable."
},
{
"risk": "Tailored CV drafts may get tangled with the existing master CV text and per-job tailored text fields, creating unclear ownership and destructive overwrite risks.",
"whyItMatters": "Users need a stable master profile plus job-specific variants; mixing those layers will make regeneration and editing unsafe."
},
{
"risk": "PDF generation can drift from preview or become template-specific technical debt if rendering is not deterministic.",
"whyItMatters": "Users will not trust export if the downloaded PDF differs from what they reviewed, and adding templates later will become expensive."
},
{
"risk": "Extraction provenance/confidence can bloat the data model and UI if added without clear boundaries.",
"whyItMatters": "We need enough traceability for review and reprocessing, but not so much complexity that the editor becomes unusable."
}
],
"proof_strategy": [
{
"riskOrUnknown": "Can we represent canonical CV, extraction provenance, tailored drafts, and render options cleanly in the current data model?",
"retireIn": "M005/S01",
"whatWillBeProven": "Schema/API design plus persistence layer prove the project can store raw artifacts, extraction runs, canonical structured CV, and tailored draft data without collapsing existing profile flows."
},
{
"riskOrUnknown": "Can the extractor improve real-world OCR/PDF quality beyond the current 'General blob' fallback while remaining generic?",
"retireIn": "M005/S02",
"whatWillBeProven": "Multi-pass extraction plus review UX prove common CV uploads populate structured fields with confidence/provenance and support reprocessing."
},
{
"riskOrUnknown": "Can job-specific tailored drafts stay separate from master CV data while still reusing canonical profile content effectively?",
"retireIn": "M005/S03",
"whatWillBeProven": "Tailored draft model, generation endpoints, and edit/save flows prove job-specific variants are durable and safely editable."
},
{
"riskOrUnknown": "Can preview and PDF export share one deterministic renderer that supports templates and layout controls?",
"retireIn": "M005/S04",
"whatWillBeProven": "One end-to-end template proves preview == export and that PDF generation/download works from the tailored draft layer."
},
{
"riskOrUnknown": "Can multiple templates and user controls ship without making exports inconsistent or fragile?",
"retireIn": "M005/S05",
"whatWillBeProven": "Additional templates, render controls, and acceptance verification prove the system scales past a single hardcoded export."
}
],
"verification_contract": "Verification for this milestone must cover each layer independently and together: extraction pipeline tests for deterministic/layout/LLM repair behavior, persistence tests for artifacts/provenance/draft models, frontend review/edit tests for the structured editor and confidence surfaces, tailored draft generation tests, and deterministic renderer tests where preview and exported PDF are compared against the same source draft. Non-trivial slices must also prove that raw master CV data remains preserved and that no export flow silently overwrites the canonical profile.",
"verification_integration": "Integration verification must prove upload artifact → extracted text → structured profile → tailored draft → preview → PDF export works as one coherent pipeline. The job workspace must consume the tailored draft layer without regressing existing application-package and follow-up flows.",
"verification_operational": "Operational verification must prove reprocessing is safe and repeatable, extraction runs are versioned/auditable, stored artifacts are retrievable, and PDF generation failures surface actionable errors rather than silent corruption. Any background rendering service/process must expose clear failure state.",
"verification_uat": "UAT must show a user uploading a real CV, reviewing highlighted uncertain fields, generating a tailored CV for a chosen job, switching templates/options, previewing the result, and downloading a PDF that matches the preview.",
"definition_of_done": [
"A durable canonical CV extraction architecture exists with artifact preservation, extraction run history, and field-level provenance/confidence.",
"Users can review/edit extracted structured CV data and reprocess with a newer extractor without losing the original upload or current canonical state.",
"Tailored CV drafts are persisted per job and are clearly distinct from the master profile and the final exported document.",
"At least one template supports preview and PDF export from the tailored draft layer, with deterministic parity between preview and download.",
"Template controls are stored as render options and do not mutate the canonical profile.",
"Milestone-level verification and UAT evidence exist for the full upload → review → tailor → preview → export loop."
],
"requirement_coverage": "This milestone extends R003 by improving the quality and controllability of tailored CV output, remains constrained by R008/R015 because generation/export stay manual, and stays aligned with R009/R016 because the flow optimizes for one person's personal job search materials rather than recruiter/team workflows. It also surfaces a likely new requirement around deterministic document export from job-tailored drafts, to be formalized when execution starts.",
"boundary_map_markdown": "### Boundary map\n- **Canonical profile layer**: raw upload artifact, extracted text, normalized text, extraction metadata, provenance/confidence, and user-reviewed structured CV.\n- **Tailored draft layer**: job-specific editable CV draft derived from canonical profile + job context; separate from master profile and separate from final export artifact.\n- **Render/export layer**: deterministic HTML/CSS template rendering, preview generation, PDF output, and render options.\n- **Current profile compatibility layer**: existing `ProfileCvText` and `ProfileCvStructureJson` remain compatible during rollout.\n- **Not in scope**: autonomous application submission, autonomous outbound communication, recruiter/team collaboration features, replacing external CV design tools wholesale.\n- **External dependencies**: existing summarizer/OCR service, browser/PDF rendering runtime, local/remote file storage for artifacts.\n"
}
],
"slices": [
{
"milestone_id": "M001",
"id": "S01",
"title": "Smarter Gmail import and matching",
"status": "complete",
"risk": "high",
"depends": [],
"demo": "",
"created_at": "2026-03-28T22:02:57.776Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Finish S01 by turning the existing job-aware Gmail import flow into a live linked-thread continuity loop for one job workspace.",
"success_criteria": "",
"proof_level": "",
"integration_closure": "",
"observability_impact": "",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M001",
"id": "S02",
"title": "Stronger AI application package drafting",
"status": "complete",
"risk": "high",
"depends": [
"S01"
],
"demo": "",
"created_at": "2026-03-28T22:02:57.777Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Make the application package generator use imported job/correspondence context well enough that tailored CV, cover-letter, and recruiter-message drafts feel specific, credible, and worth starting from inside the job workspace.",
"success_criteria": "",
"proof_level": "",
"integration_closure": "",
"observability_impact": "",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M001",
"id": "S03",
"title": "Reply and follow-up drafting from real thread context",
"status": "complete",
"risk": "medium",
"depends": [
"S01",
"S02"
],
"demo": "",
"created_at": "2026-03-28T22:02:57.777Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Make follow-up drafting use imported correspondence and saved application material well enough that the job workspace can produce specific, trustworthy follow-up and reply drafts without crossing the manual-send boundary.",
"success_criteria": "",
"proof_level": "",
"integration_closure": "",
"observability_impact": "",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M001",
"id": "S04",
"title": "Daily control loop surfaces",
"status": "complete",
"risk": "medium",
"depends": [
"S01",
"S03"
],
"demo": "",
"created_at": "2026-03-28T22:02:57.777Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Make the job table, reminders view, and dashboard behave like one daily control loop so the user can scan what needs attention and jump directly into the right job workspace state.",
"success_criteria": "",
"proof_level": "",
"integration_closure": "",
"observability_impact": "",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M001",
"id": "S05",
"title": "End-to-end trust and workflow polish",
"status": "complete",
"risk": "low",
"depends": [
"S01",
"S02",
"S03",
"S04"
],
"demo": "",
"created_at": "2026-03-28T22:02:57.778Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Prove the full daily-use loop as one trustworthy workflow by tightening shared next-action/readiness signals, then validating overview → workspace → package → Gmail continuity → follow-up behavior without weakening the manual-send boundary.",
"success_criteria": "",
"proof_level": "",
"integration_closure": "",
"observability_impact": "",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M001",
"id": "S06",
"title": "Live environment stabilization and integrated acceptance rerun",
"status": "complete",
"risk": "high",
"depends": [
"S05"
],
"demo": "",
"created_at": "2026-03-28T22:02:57.778Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Live environment is repeatably startable and preflighted, seeded with acceptance-ready data, and the integrated daily loop is re-verified with a recorded artifact proving the manual-send boundary and individual-first workflow.",
"success_criteria": "",
"proof_level": "",
"integration_closure": "",
"observability_impact": "",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M001",
"id": "S07",
"title": "Daily-loop UAT artifact closure",
"status": "complete",
"risk": "medium",
"depends": [
"S06"
],
"demo": "",
"created_at": "2026-03-28T22:02:57.778Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Publish the executed daily-loop UAT closure artifact proving one seeded job stays coherent across /jobs, the job workspace, /reminders, and /dashboard using the existing S06 acceptance runner.",
"success_criteria": "",
"proof_level": "",
"integration_closure": "",
"observability_impact": "",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M005",
"id": "S01",
"title": "Canonical CV data model and artifact pipeline",
"status": "pending",
"risk": "high",
"depends": [],
"demo": "After this slice, a CV upload persists original artifact + extraction run metadata + canonical structured profile shell, and the system can reprocess against stored source data instead of requiring a re-upload.",
"created_at": "2026-03-28T22:04:42.691Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Introduce the persistence and API foundations for artifact-preserving multi-pass CV extraction.",
"success_criteria": "- Upload pipeline stores original file metadata, extracted text, normalized text, extractor version, and run status.\n- Canonical structured CV model can store field-level confidence/provenance without breaking current profile flows.\n- Reprocess endpoint/command can re-run extraction from stored artifacts.\n- Existing profile CV upload/parse flows remain backward-compatible.",
"proof_level": "Foundational schema/API proof with focused backend tests and no-regression verification on current profile flows.",
"integration_closure": "The new canonical model coexists with existing ProfileCvText/ProfileCvStructureJson while introducing extraction-run persistence and future migration seams.",
"observability_impact": "Adds explicit extraction-run status, version, and failure surfaces for debugging document ingestion.",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M005",
"id": "S02",
"title": "Multi-pass extraction and review UX",
"status": "pending",
"risk": "high",
"depends": [
"S01"
],
"demo": "After this slice, uploading a noisy PDF populates the structured CV editor with confidence/provenance markers, reviewable fields, and a reprocess action instead of mostly falling into General.",
"created_at": "2026-03-28T22:04:42.691Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Implement the smarter universal extractor and the user review loop around uncertain fields.",
"success_criteria": "- Pass A/B/C/D extraction pipeline is implemented with generic heuristics, layout grouping inputs where available, LLM normalization, and validation/repair.\n- Structured editor surfaces confidence/provenance and visually flags uncertain fields.\n- User can accept/edit fields and save the canonical profile.\n- Reprocessing produces a new extraction run without destroying accepted canonical data until the user chooses to apply it.",
"proof_level": "Backend/frontend extraction proof with OCR-like regression fixtures plus structured-editor review tests.",
"integration_closure": "The profile page consumes canonical extraction runs cleanly and no longer depends on raw text-only section blobs for structured editing.",
"observability_impact": "Adds per-field extraction method/confidence and review-state visibility.",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M005",
"id": "S03",
"title": "Tailored CV draft layer",
"status": "pending",
"risk": "medium",
"depends": [
"S02"
],
"demo": "After this slice, a job can have its own editable tailored CV draft generated from the canonical profile without mutating the master CV or raw source text.",
"created_at": "2026-03-28T22:04:42.691Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Create the per-job tailored CV draft model and generation/edit/save flow.",
"success_criteria": "- Tailored CV drafts persist separately from master profile and existing raw CV text.\n- Generation uses canonical structured profile first, with raw-text fallback where needed.\n- Users can edit and save tailored drafts per job.\n- Existing application-package flows integrate or coexist cleanly with the new draft layer.",
"proof_level": "Job-scoped generation proof with backend draft tests and workspace UI save/regeneration coverage.",
"integration_closure": "The job workspace gains a stable tailored CV draft layer that can later feed export without regressing existing drafting features.",
"observability_impact": "Adds explicit draft generation/source-version metadata and regeneration failure surfaces.",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M005",
"id": "S04",
"title": "Template preview and first PDF export",
"status": "pending",
"risk": "medium",
"depends": [
"S03"
],
"demo": "After this slice, the user can choose an ATS Minimal template, preview the tailored CV exactly as rendered, and download a matching PDF.",
"created_at": "2026-03-28T22:04:42.691Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Ship the first deterministic HTML/CSS renderer with preview and PDF download.",
"success_criteria": "- One HTML/CSS template renders tailored draft data deterministically.\n- Preview and PDF use the same renderer/path.\n- User can explicitly download a generated PDF.\n- PDF export failures show actionable error states.\n- Export remains manual and individual-first.",
"proof_level": "End-to-end render/export proof with renderer tests and browser/UAT evidence that preview matches the downloaded PDF path.",
"integration_closure": "The job workspace can hand off tailored draft data into preview/export without mutating canonical profile or outbound communication flows.",
"observability_impact": "Adds render/export job status and error detail surfaces.",
"sequence": 0,
"replan_triggered_at": null
},
{
"milestone_id": "M005",
"id": "S05",
"title": "Template library and layout controls",
"status": "pending",
"risk": "medium",
"depends": [
"S04"
],
"demo": "After this slice, the user can switch among ATS Minimal, Modern Professional, and Compact Technical templates and control photo visibility, page length, accent color, section order, and bullet density before export.",
"created_at": "2026-03-28T22:04:42.691Z",
"completed_at": null,
"full_summary_md": "",
"full_uat_md": "",
"goal": "Expand export flexibility while keeping rendering deterministic and draft-driven.",
"success_criteria": "- Three initial templates are supported.\n- Layout controls are persisted on the tailored draft/render-options layer.\n- Users can preview template/control changes before export.\n- Section ordering and density controls do not corrupt the canonical profile.\n- UAT proves the full upload → review → tailor → preview → export loop.",
"proof_level": "Product-level proof with multi-template rendering verification and end-to-end UAT.",
"integration_closure": "The export system scales beyond one hardcoded template while preserving the same draft model and preview/export contract.",
"observability_impact": "Adds template/render-option visibility to preview/export diagnostics.",
"sequence": 0,
"replan_triggered_at": null
}
],
"tasks": [
{
"milestone_id": "M001",
"slice_id": "S01",
"id": "T01",
"title": "Add linked Gmail thread refresh to the backend contract",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.777Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"JobTrackerApi/Controllers/GmailController.cs",
"JobTrackerApi/Services/GmailOAuthService.cs",
"JobTrackerApi.Tests/GmailControllerTests.cs",
"JobTrackerApi/Program.cs"
],
"verify": "`dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter GmailControllerTests`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S01",
"id": "T02",
"title": "Surface live Gmail thread continuity in the job workspace",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.777Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"job-tracker-ui/src/components/Correspondence.tsx",
"job-tracker-ui/src/types.ts",
"job-tracker-ui/src/correspondence-gmail-import.test.tsx",
"job-tracker-ui/src/components/JobDetailsDialog.tsx"
],
"verify": "`CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/correspondence-gmail-import.test.tsx`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S02",
"id": "T01",
"title": "Strengthen application-package context assembly and backend draft tests",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.777Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"JobTrackerApi/Controllers/JobApplicationsController.cs",
"JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs"
],
"verify": "`dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsApplicationPackageTests`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S02",
"id": "T02",
"title": "Make the job workspace save and present the application package as real working material",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.777Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"job-tracker-ui/src/components/JobDetailsDialog.tsx",
"job-tracker-ui/src/types.ts",
"job-tracker-ui/src/job-details-generated-drafts.test.tsx"
],
"verify": "`CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/job-details-generated-drafts.test.tsx`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S03",
"id": "T01",
"title": "Strengthen follow-up draft context assembly and backend reply/follow-up tests",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.777Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"JobTrackerApi/Controllers/JobApplicationsController.cs",
"JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs"
],
"verify": "`dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsFollowUpDraftTests`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S03",
"id": "T02",
"title": "Make the follow-up workspace show thread-grounded draft state without autonomous sending",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.777Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"job-tracker-ui/src/components/JobDetailsDialog.tsx",
"job-tracker-ui/src/types.ts",
"job-tracker-ui/src/job-details-followup-drafts.test.tsx"
],
"verify": "`CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/job-details-followup-drafts.test.tsx`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S04",
"id": "T01",
"title": "Turn reminders and dashboard into actionable entry surfaces",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"job-tracker-ui/src/components/DashboardView.tsx",
"job-tracker-ui/src/components/RemindersView.tsx",
"job-tracker-ui/src/App.tsx"
],
"verify": "`CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S04",
"id": "T02",
"title": "Make the job table expose the right next action and prove the daily loop",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"job-tracker-ui/src/components/JobTable.tsx",
"job-tracker-ui/src/daily-control-loop.test.tsx"
],
"verify": "`CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S05",
"id": "T01",
"title": "Centralize workflow trust signals across overview and readiness surfaces",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"JobTrackerApi/Controllers/JobApplicationsController.cs",
"JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs",
"job-tracker-ui/src/types.ts",
"job-tracker-ui/src/jobWorkflowSignals.ts",
"job-tracker-ui/src/components/JobTable.tsx",
"job-tracker-ui/src/components/DashboardView.tsx",
"job-tracker-ui/src/components/RemindersView.tsx",
"job-tracker-ui/src/workflow-trust-signals.test.tsx"
],
"verify": "`dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsWorkflowSignalsTests` and `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/workflow-trust-signals.test.tsx`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S05",
"id": "T02",
"title": "Add integrated trust-loop proof and workspace polish",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"job-tracker-ui/src/components/JobDetailsDialog.tsx",
"job-tracker-ui/src/components/Correspondence.tsx",
"job-tracker-ui/src/end-to-end-trust-loop.test.tsx",
"job-tracker-ui/src/daily-control-loop.test.tsx",
".gsd/milestones/M001/slices/S05/S05-UAT.md"
],
"verify": "`CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/end-to-end-trust-loop.test.tsx`, `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/correspondence-gmail-import.test.tsx src/job-details-generated-drafts.test.tsx src/job-details-followup-drafts.test.tsx src/daily-control-loop.test.tsx`, and `CI=true npm --prefix job-tracker-ui run build`",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S06",
"id": "T01",
"title": "Validated and recorded the live API/auth preflight gate, including README runbook guidance and negative-path shell coverage.",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"scripts/s06-preflight.sh",
"README.md",
"job-tracker-ui/src/api.ts",
"JobTrackerApi/appsettings.Development.json"
],
"verify": "bash scripts/s06-preflight.sh",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S06",
"id": "T02",
"title": "Seeded acceptance-ready job data through the live API with deterministic rerun-safe ids and readiness output.",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"scripts/s06-acceptance-data.sh",
"scripts/s06-preflight.sh",
"README.md"
],
"verify": "bash scripts/s06-acceptance-data.sh",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S06",
"id": "T03",
"title": "Added a repeatable live acceptance runner and recorded real S06 browser evidence for the manual-send boundary and daily loop.",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"scripts/s06-acceptance-run.sh",
"docs/s06-acceptance-run.md",
"scripts/s06-preflight.sh",
"scripts/s06-acceptance-data.sh",
"job-tracker-ui/src/end-to-end-trust-loop.test.tsx"
],
"verify": "bash scripts/s06-acceptance-run.sh && test -s docs/s06-acceptance-run.md",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S07",
"id": "T01",
"title": "Added docs/s07-uat.md to close S07 with imported acceptance-run evidence for the seeded daily-loop job.",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"docs/s07-uat.md",
"docs/s06-acceptance-run.md"
],
"verify": "test -s docs/s07-uat.md && grep -q \"S06 Acceptance Backend Engineer\" docs/s07-uat.md",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S07",
"id": "T02",
"title": "Re-ran the acceptance flow and refreshed the S07 UAT closure with current browser evidence, manual-send-boundary proof, and the Gmail continuity limitation.",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.778Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"scripts/s06-preflight.sh",
"scripts/s06-acceptance-run.sh",
"docs/s06-acceptance-run.md",
"docs/s07-uat.md"
],
"verify": "bash scripts/s06-preflight.sh && bash scripts/s06-acceptance-run.sh && test -s docs/s06-acceptance-run.md && grep -q \"manual-send boundary\" docs/s07-uat.md",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M001",
"slice_id": "S07",
"id": "T03",
"title": "Re-ran the focused daily-loop UI regressions, repaired the local CRA dependency state, and recorded the passing deterministic coverage in docs/s07-uat.md.",
"status": "complete",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": "2026-03-28T22:02:57.779Z",
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "",
"estimate": "",
"files": [
"job-tracker-ui/src/daily-control-loop.test.tsx",
"job-tracker-ui/src/workflow-trust-signals.test.tsx",
"docs/s07-uat.md"
],
"verify": "CI=true npm --prefix job-tracker-ui test -- --runInBand --watch=false src/daily-control-loop.test.tsx src/workflow-trust-signals.test.tsx && grep -q \"UI regression results\" docs/s07-uat.md",
"inputs": [],
"expected_output": [],
"observability_impact": "",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S01",
"id": "T01",
"title": "Add canonical CV artifact and extraction persistence model",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Design and implement persistence models for uploaded CV artifacts, extraction runs, field provenance/confidence payloads, and the canonical CV profile wrapper. Wire EF/Core bootstrap changes and ensure the schema can coexist with current profile fields during rollout.",
"estimate": "1.5d",
"files": [
"JobTrackerApi/Data/JobTrackerContext.cs",
"Models/ApplicationUser.cs",
"Models/StructuredCvProfile.cs",
"Models/* new cv extraction models",
"JobTrackerApi/Program.cs"
],
"verify": "dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter ProfileCvControllerTests",
"inputs": [
"Existing ProfileCvText/ProfileCvStructureJson flow",
"Current profile upload/parse endpoints"
],
"expected_output": [
"JobTrackerApi/Models/* canonical CV persistence types",
"Data/JobTrackerContext.cs updates",
"JobTrackerApi bootstrap/schema changes",
"migration/bootstrap coverage or auto-create logic"
],
"observability_impact": "Adds extraction-run status/version/error fields for later debugging.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S01",
"id": "T02",
"title": "Refactor profile CV endpoints around canonical extraction runs",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Refactor the profile CV controller/service layer so upload stores artifact + extraction run metadata, parse/rebuild use a canonical extraction pipeline entry point, and reprocess-from-stored-artifact is possible without re-upload. Preserve backward compatibility in API responses while adding richer metadata.",
"estimate": "1.5d",
"files": [
"JobTrackerApi/Controllers/ProfileCvController.cs",
"JobTrackerApi/Services/* cv extraction services",
"JobTrackerApi.Tests/ProfileCvControllerTests.cs"
],
"verify": "dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter ProfileCvControllerTests",
"inputs": [
"S01/T01 persistence model"
],
"expected_output": [
"Refactored upload/parse/reprocess endpoints",
"canonical extraction service boundary",
"backward-compatible response contract"
],
"observability_impact": "Ensures upload/reprocess failures surface structured status and messages.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S01",
"id": "T03",
"title": "Capture canonical CV model context",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Document the canonical CV lifecycle and record milestone context so later slices can build on a stable vocabulary: artifact, extraction run, canonical profile, provenance/confidence, tailored draft, render options.",
"estimate": "0.5d",
"files": [
".gsd/milestones/M005/M005-CONTEXT.md"
],
"verify": "Artifact saved with milestone context reviewed for terminology consistency",
"inputs": [
"S01/T01 design",
"S01/T02 API contract"
],
"expected_output": [
"M005 context artifact",
"updated roadmap-consistent terminology for later slices"
],
"observability_impact": "Improves future-agent understanding of extraction state boundaries.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S02",
"id": "T01",
"title": "Build pass A/B/C/D extraction pipeline",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Implement multi-pass extraction orchestration: deterministic field detection, layout/structure grouping hooks, LLM normalization, and validation/repair. Persist confidence, source snippets, and extraction method per field. Keep the current generic fallback behavior as the lowest-priority safety net.",
"estimate": "2d",
"files": [
"JobTrackerApi/Services/* cv extraction pipeline",
"JobTrackerApi/Controllers/ProfileCvController.cs",
"Models/StructuredCvProfile.cs",
"Models/StructuredCvProfileJson.cs",
"JobTrackerApi.Tests/ProfileCvControllerTests.cs"
],
"verify": "dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter ProfileCvControllerTests",
"inputs": [
"S01 canonical extraction service boundary",
"existing OCR/text extraction support"
],
"expected_output": [
"Extraction pipeline service(s)",
"field-level provenance/confidence payloads",
"improved OCR/PDF regression coverage"
],
"observability_impact": "Field-level extraction methods and confidence become inspectable/debuggable.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S02",
"id": "T02",
"title": "Add structured review UX with confidence and reprocess controls",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Extend the profile UI to render provenance/confidence for structured fields, highlight uncertain values, expose reprocess controls, and support user review/edit/accept flows without losing the current raw text view.",
"estimate": "2d",
"files": [
"job-tracker-ui/src/pages/ProfilePage.tsx",
"job-tracker-ui/src/profileCv.ts",
"job-tracker-ui/src/i18n/translations.ts",
"job-tracker-ui/src/profile-page.test.tsx"
],
"verify": "cd job-tracker-ui && CI=true ./node_modules/.bin/react-scripts test --runInBand --watch=false src/profile-page.test.tsx",
"inputs": [
"S02/T01 field confidence payloads",
"existing structured editor UI"
],
"expected_output": [
"Profile structured editor with uncertainty UI",
"reprocess trigger in profile workflow",
"save/apply UX for canonical profile review"
],
"observability_impact": "Users can see why a field was extracted and which values need review.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S02",
"id": "T03",
"title": "Expose extraction run history",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Add a lightweight extraction-run history/read model so the latest run and prior runs can be inspected or compared during debugging and support. Keep the first UI surface minimal but useful.",
"estimate": "1d",
"files": [
"JobTrackerApi/Controllers/ProfileCvController.cs",
"JobTrackerApi.Tests/ProfileCvControllerTests.cs",
"job-tracker-ui/src/pages/ProfilePage.tsx"
],
"verify": "Focused backend/frontend tests proving latest/prior run metadata can be read",
"inputs": [
"S02/T01 persisted extraction runs"
],
"expected_output": [
"extraction-run history endpoint/read model",
"basic UI or API-level access to run history"
],
"observability_impact": "Makes reprocessing and extraction regressions diagnosable without database spelunking.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S03",
"id": "T01",
"title": "Add tailored CV draft model and persistence",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Design and implement the tailored CV draft persistence model, including job linkage, source canonical-profile version, chosen template id, editable content blocks, and render options JSON. Keep it clearly separate from existing tailored CV text/package fields.",
"estimate": "1.5d",
"files": [
"Models/* tailored cv draft models",
"JobTrackerApi/Data/JobTrackerContext.cs",
"JobTrackerApi/Program.cs",
"JobTrackerApi.Tests/* tailored draft tests"
],
"verify": "dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsApplicationPackageTests",
"inputs": [
"M005/S01 canonical profile model",
"existing JobApplications package fields"
],
"expected_output": [
"TailoredCvDraft model + persistence",
"job linkage and source-version tracking",
"backward-compatible coexistence with existing package fields"
],
"observability_impact": "Adds generation timestamps/source-version metadata for debugging stale drafts.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S03",
"id": "T02",
"title": "Add tailored CV draft generation and save endpoints",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Add backend generation/edit/save endpoints for job-scoped tailored CV drafts that prefer canonical structured profile content but can still fall back to raw CV text when needed. Ensure regeneration does not silently destroy manual edits without an explicit user action.",
"estimate": "2d",
"files": [
"JobTrackerApi/Controllers/JobApplicationsController.cs",
"JobTrackerApi/Services/* tailored cv draft generation",
"JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs"
],
"verify": "dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsApplicationPackageTests",
"inputs": [
"S03/T01 tailored draft model",
"existing job package generation logic"
],
"expected_output": [
"Job-scoped tailored CV draft endpoints",
"generation/regeneration semantics",
"manual edit preservation rules"
],
"observability_impact": "Draft generation failures include source-version/context information.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S03",
"id": "T03",
"title": "Add tailored CV draft workspace UX",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Extend the job workspace UI so users can generate, edit, save, and regenerate a tailored CV draft in a dedicated layer without confusing it with the master CV or other package artifacts.",
"estimate": "2d",
"files": [
"job-tracker-ui/src/components/JobDetailsDialog.tsx",
"job-tracker-ui/src/job-details-generated-drafts.test.tsx",
"job-tracker-ui/src/i18n/translations.ts"
],
"verify": "cd job-tracker-ui && CI=true ./node_modules/.bin/react-scripts test --runInBand --watch=false src/job-details-generated-drafts.test.tsx",
"inputs": [
"S03/T02 draft endpoints",
"existing package workspace UI"
],
"expected_output": [
"Workspace tailored CV draft editor",
"explicit regenerate/save flows",
"clear distinction from master profile"
],
"observability_impact": "Shows source-version/regeneration state to the user when draft data is stale or regenerated.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S04",
"id": "T01",
"title": "Build ATS Minimal renderer",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Implement an ATS Minimal HTML/CSS CV renderer driven entirely by the tailored draft model and render options. The same template must support browser preview and PDF output.",
"estimate": "2d",
"files": [
"job-tracker-ui/src/cv-templates/* or shared renderer files",
"JobTrackerApi or UI-side render contract code",
"tests for renderer mapping"
],
"verify": "Focused renderer/unit tests plus deterministic HTML output snapshot checks",
"inputs": [
"M005/S03 tailored draft model",
"template/render option contract"
],
"expected_output": [
"ATS Minimal HTML/CSS renderer",
"template data-mapping layer",
"render snapshot/contract coverage"
],
"observability_impact": "Renderer failures can identify missing/invalid draft sections or option payloads.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S04",
"id": "T02",
"title": "Add preview and PDF export pipeline",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Add preview and PDF export endpoints/workflow. Use one deterministic rendering path for preview and Playwright/Chromium-backed PDF generation, with stored/exportable artifacts and explicit manual download action.",
"estimate": "2d",
"files": [
"JobTrackerApi/Controllers/* cv export endpoints",
"JobTrackerApi/Services/* pdf export service",
"job-tracker-ui/src/components/JobDetailsDialog.tsx or dedicated preview UI"
],
"verify": "End-to-end verification that preview request succeeds and PDF export returns a downloadable file",
"inputs": [
"S04/T01 renderer",
"browser/PDF runtime availability"
],
"expected_output": [
"preview endpoint/view",
"PDF export endpoint/service",
"downloadable PDF artifact"
],
"observability_impact": "Export status, duration, and failure messages are visible for support/debugging.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S04",
"id": "T03",
"title": "Verify preview/export parity",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Add targeted browser/UAT verification that preview and downloaded PDF correspond to the same draft/template and that export stays manual.",
"estimate": "1d",
"files": [
"job-tracker-ui browser verification artifacts",
".gsd milestone UAT artifacts"
],
"verify": "Browser/UAT flow: generate draft → preview ATS Minimal → download PDF → confirm parity evidence",
"inputs": [
"S04/T02 working export flow"
],
"expected_output": [
"browser/UAT artifact for preview vs export parity",
"debug bundle or acceptance notes"
],
"observability_impact": "Gives durable proof that preview/export parity holds in a real browser pass.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S05",
"id": "T01",
"title": "Add template library beyond ATS Minimal",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Add Modern Professional and Compact Technical templates on top of the shared draft/render contract, keeping preview/export parity and minimizing template-specific branching in core code.",
"estimate": "2d",
"files": [
"job-tracker-ui/src/cv-templates/*",
"renderer tests"
],
"verify": "Renderer tests cover ATS Minimal, Modern Professional, and Compact Technical",
"inputs": [
"M005/S04 renderer contract"
],
"expected_output": [
"Two additional HTML/CSS templates",
"shared render contract exercised by all templates",
"template coverage tests"
],
"observability_impact": "Template id and render diagnostics make template-specific failures traceable.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S05",
"id": "T02",
"title": "Add template-level layout controls",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Implement persisted layout controls: show/hide photo, one-page vs two-page mode, accent color, section ordering, and bullet density. Ensure controls live on the tailored draft/render-options layer and never mutate the canonical profile.",
"estimate": "2d",
"files": [
"job-tracker-ui/src/components/JobDetailsDialog.tsx or dedicated export controls",
"JobTrackerApi tailored draft endpoints/models",
"job-tracker-ui tests"
],
"verify": "Focused frontend/backend tests for persisted render options and preview updates",
"inputs": [
"M005/S03 tailored draft persistence",
"M005/S04 renderer"
],
"expected_output": [
"render options UI + persistence",
"section ordering controls",
"density/page/photo toggles"
],
"observability_impact": "Render options become inspectable and debuggable when previews/exported PDFs differ from expectation.",
"full_plan_md": "",
"sequence": 0
},
{
"milestone_id": "M005",
"slice_id": "S05",
"id": "T03",
"title": "Run full CV-to-PDF acceptance loop",
"status": "pending",
"one_liner": "",
"narrative": "",
"verification_result": "",
"duration": "",
"completed_at": null,
"blocker_discovered": false,
"deviations": "",
"known_issues": "",
"key_files": [],
"key_decisions": [],
"full_summary_md": "",
"description": "Run milestone-level acceptance on the whole loop using a real CV/job pair: upload, review uncertain fields, generate tailored draft, switch templates/options, preview, export, and confirm download path.",
"estimate": "1d",
"files": [
".gsd/milestones/M005/slices/S05/S05-UAT.md",
".gsd milestone summaries"
],
"verify": "Browser/UAT evidence for the full end-to-end CV intelligence/export workflow",
"inputs": [
"All prior M005 slices"
],
"expected_output": [
"M005 slice summary/UAT evidence",
"acceptance checklist with screenshots/artifacts"
],
"observability_impact": "Produces durable acceptance proof and highlights remaining trust gaps for later milestones.",
"full_plan_md": "",
"sequence": 0
}
],
"decisions": [
{
"seq": 1,
"id": "D001",
"when_context": "M001",
"scope": "scope",
"decision": "Product entry point",
"choice": "External job discovery, then import into the app",
"rationale": "The user finds jobs on job sites first; the app begins when a role is imported.",
"revisable": "No",
"made_by": "collaborative",
"superseded_by": null
},
{
"seq": 2,
"id": "D002",
"when_context": "M001",
"scope": "pattern",
"decision": "AI action model",
"choice": "Assistive drafting and analysis only; no autonomous sending",
"rationale": "The user wants AI help but explicitly does not want auto-send or auto-apply behavior.",
"revisable": "No",
"made_by": "collaborative",
"superseded_by": null
},
{
"seq": 3,
"id": "D003",
"when_context": "M001",
"scope": "scope",
"decision": "Primary user",
"choice": "Individual job seeker",
"rationale": "The product is designed for individuals managing their own search, not recruiter or team workflows.",
"revisable": "Yes — if product direction changes later",
"made_by": "collaborative",
"superseded_by": null
},
{
"seq": 4,
"id": "D004",
"when_context": "M001",
"scope": "pattern",
"decision": "Daily navigation hierarchy",
"choice": "Job table first, then follow-up/dashboard, then individual job workspace",
"rationale": "The user explicitly described this as the intended control flow for daily use.",
"revisable": "Yes — if real usage disproves the hierarchy",
"made_by": "collaborative",
"superseded_by": null
},
{
"seq": 5,
"id": "D005",
"when_context": "M001",
"scope": "roadmap",
"decision": "First milestone focus",
"choice": "Prioritize Gmail import quality and AI draft quality before broader expansion",
"rationale": "The user identified Gmail import and AI drafts as the weakest current areas and the first bar for daily use.",
"revisable": "Yes — if execution proves another blocker is more fundamental",
"made_by": "collaborative",
"superseded_by": null
},
{
"seq": 6,
"id": "D006",
"when_context": "M001/S02",
"scope": "workspace-persistence",
"decision": "How the saved application answer draft should persist inside the job workspace before a dedicated field exists",
"choice": "Store the application answer draft in a replaceable notes block and make SaveApplicationDrafts overwrite notes when notes are explicitly provided",
"rationale": "The existing append-only notes behavior made the Tailored CV workspace untrustworthy because repeated saves duplicated the application answer indefinitely. A replaceable notes block preserves current schema compatibility while giving the workspace a stable saved/read-back loop for later slices.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 7,
"id": "D007",
"when_context": "M001/S01",
"scope": "gmail-continuity",
"decision": "What “good Gmail import” now means for M001",
"choice": "Treat Gmail import as full-thread continuity: the user must be able to import the whole relevant thread, and already-linked Gmail threads must refresh automatically so later inbound messages and user-sent replies appear on the job without manual re-import. This supersedes the narrower one-time-import interpretation inside D005s Gmail-import focus.",
"rationale": "The user explicitly asked whether the app can bring the whole email thread and automatically show their reply later without re-pulling/importing again. That changes the trust bar from “find and import the right message” to “keep the linked thread current over time,” while still preserving the no-auto-send boundary from D002.",
"revisable": "Yes — if Gmail API or product constraints later require a different sync model",
"made_by": "human",
"superseded_by": null
},
{
"seq": 8,
"id": "D008",
"when_context": "M001/S01 planning",
"scope": "gmail-sync",
"decision": "How linked Gmail threads stay current in S01",
"choice": "Use a job-scoped refresh flow over already-imported Gmail thread IDs, triggered from the job workspace/API, instead of building inbox-wide Gmail watch/history cursor infrastructure in M001.",
"rationale": "The codebase already persists ExternalThreadId per correspondence and lacks Gmail history/watch infrastructure. Fetching known linked threads for one job keeps scope bounded, fits the single-user workspace model, supports duplicate-safe import of new inbound and sent replies, and creates a trustworthy continuity loop without adding brittle webhook/cursor state before the milestone proves value.",
"revisable": "Yes — if real usage shows job-scoped pull refresh is too slow or misses important continuity cases.",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 9,
"id": "D009",
"when_context": "M001/S01 closure",
"scope": "gmail-matching",
"decision": "Where Gmail candidate aggregation and ranking logic should live for job-aware import",
"choice": "Keep Gmail query-hit aggregation, dedupe, matched-query traces, and ranking reasons in the backend contract instead of recreating that logic in the React workspace.",
"rationale": "The correspondence workspace needs explanatory candidate ranking plus duplicate visibility, and putting the logic in the API keeps one source of truth for scoring/import state while preventing browser-side heuristic drift.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 10,
"id": "D010",
"when_context": "M001/S03 closeout",
"scope": "followup-drafting",
"decision": "How follow-up grounding should be exposed to the workspace",
"choice": "Return explicit follow-up grounding fields (`contextSummary`, `contextSignals`, `threadSubject`, and last-correspondence metadata) from the backend DTO instead of making the React workspace infer them client-side.",
"rationale": "The slice needed draft trust, not just draft text. Putting grounding signals in the API contract gives the UI a durable explanation surface, keeps thread/package inference in one place with generation logic, and makes backend/frontend tests assert the same source of truth.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 11,
"id": "D011",
"when_context": "M001/S05 planning",
"scope": "workflow-trust",
"decision": "How S05 should represent daily-loop readiness and next-action state across overview surfaces",
"choice": "Introduce explicit workflow trust/action signals from the backend/UI contract and reuse them across the table, dashboard, reminders, and shared workspace instead of continuing to infer behavior from free-form `followUpReason` strings or raw `notes` presence in each component.",
"rationale": "S05 is an end-to-end polish slice where the remaining risk is fragmented trust, not missing subsystems. Centralizing workflow signals avoids heuristic drift between overview surfaces, respects the saved application-answer notes-block constraint, and gives the final integrated regression one source of truth for R010 while preserving the explicit manual-send boundary required by R008.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 12,
"id": "D012",
"when_context": "M001/S05",
"scope": "workspace-observability",
"decision": "Where linked Gmail thread continuity status should be exposed in the final trust loop",
"choice": "Show linked-thread refresh state directly in the correspondence workspace, including linked thread count and last refresh outcome, instead of hiding continuity feedback inside the Gmail import modal only.",
"rationale": "The end-to-end trust loop depends on users being able to verify that already-linked Gmail threads stay current without re-importing. Surfacing continuity state in the main workspace keeps the job timeline trustworthy, supports final UAT, and avoids making thread refresh feel like a hidden one-off import behavior.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 13,
"id": "D013",
"when_context": "M001/S06/T02",
"scope": "seeding",
"decision": "How acceptance-ready job data is created for S06 live reruns",
"choice": "Seed the acceptance fixture through the live companies/jobapplications/correspondence API plus the dedicated tailored-cv, application-drafts, and followup endpoints, using deterministic company/title/thread/message identifiers for idempotent reruns.",
"rationale": "The slice goal is a repeatable live environment check, so seeding through the same HTTP contract the UI uses proves the real backend surface, keeps package/readiness behavior aligned with production code paths, and avoids brittle direct DB mutations or duplicate correspondence on reruns.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 14,
"id": "D014",
"when_context": "M001/S06/T03",
"scope": "acceptance-run",
"decision": "How the S06 live acceptance runner should authenticate seeding and protected UI verification without requiring manual token export every rerun.",
"choice": "Allow the S06 acceptance runner to mint a localhost-only admin JWT from the checked-in dev JWT settings plus the local SQLite admin record when AUTH_TOKEN is missing.",
"rationale": "The current DB snapshot contains an admin user but the placeholder development password is not reliable, and the tasks verification command must stay repeatable. A localhost-only signed JWT fallback keeps the run fully local, avoids secret prompts, does not print token material, and still exercises the real protected API/UI paths.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 15,
"id": "D015",
"when_context": "M001/S06",
"scope": "environment",
"decision": "S06 preflight auth handling",
"choice": "Treat /api/auth/config reachability plus an auth-limited /api/admin/system probe as a guided partial-pass, and never echo bearer tokens in preflight output.",
"rationale": "S06 needs a repeatable go/no-go gate before browser UAT. The live stack can be healthy even when admin-only diagnostics require an extra token, so the preflight should fail hard only for unreachable/malformed API responses while still surfacing clear AUTH_TOKEN guidance and protecting secrets on shared terminals.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
},
{
"seq": 16,
"id": "D016",
"when_context": "M001/S07",
"scope": "uat-artifact",
"decision": "How S07 daily-loop closure should capture acceptance evidence",
"choice": "Keep docs/s06-acceptance-run.md as the canonical execution log and use S07 closure artifacts to summarize/import the cross-surface proof rather than duplicating raw runner output.",
"rationale": "S07's job is to prove one seeded job stays coherent across /jobs, workspace, /reminders, and /dashboard while preserving the manual-send boundary. Reusing the S06 runner output as the canonical source keeps reruns idempotent, prevents drift between generated logs and human summary text, and gives downstream slices one stable place for detailed evidence plus one concise dependency summary.",
"revisable": "Yes",
"made_by": "agent",
"superseded_by": null
}
],
"verification_evidence": []
}