diff --git a/.gsd/doctor-history.jsonl b/.gsd/doctor-history.jsonl index 9dcb9ed..621b864 100644 --- a/.gsd/doctor-history.jsonl +++ b/.gsd/doctor-history.jsonl @@ -2,3 +2,4 @@ {"ts":"2026-03-24T08:25:41.311Z","ok":true,"errors":0,"warnings":7,"fixes":3,"codes":["state_file_stale","gitignore_missing_patterns","env_env_file","provider_key_missing","delimiter_in_title"],"issues":[{"severity":"warning","code":"state_file_stale","message":"STATE.md is stale — shows \"planning\" but derived state is \"executing\"","unitId":"project"},{"severity":"warning","code":"gitignore_missing_patterns","message":"5 critical GSD runtime pattern(s) missing from .gitignore: .gsd/activity/, .gsd/runtime/, .gsd/auto.lock, .gsd/gsd.db, .gsd/completed-units.json","unitId":"project"},{"severity":"warning","code":"env_env_file","message":".env.example exists but no .env or .env.local found — Copy .env.example to .env and fill in values","unitId":"environment"},{"severity":"warning","code":"provider_key_missing","message":"OpenAI — not configured — Set OPENAI_API_KEY or run /gsd keys","unitId":"project"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M002 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M002"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M003 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M003"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M004 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M004"}],"fixDescriptions":["rebuilt STATE.md from derived state","added missing GSD runtime patterns to .gitignore","updated /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/STATE.md"],"summary":"Clean · 3 fixed · STATE.md is stale — shows \"planning\" but derived state is \"executing\""} {"ts":"2026-03-24T11:07:25.707Z","ok":true,"errors":0,"warnings":8,"fixes":4,"codes":["gitignore_missing_patterns","env_env_file","provider_key_missing","task_summary_without_done_checkbox","delimiter_in_title"],"issues":[{"severity":"warning","code":"gitignore_missing_patterns","message":"1 critical GSD runtime pattern(s) missing from .gitignore: .gsd/gsd.db","unitId":"project"},{"severity":"warning","code":"env_env_file","message":".env.example exists but no .env or .env.local found — Copy .env.example to .env and fill in values","unitId":"environment"},{"severity":"warning","code":"provider_key_missing","message":"OpenAI — not configured — Set OPENAI_API_KEY or run /gsd keys","unitId":"project"},{"severity":"warning","code":"task_summary_without_done_checkbox","message":"Task T02 has a summary but is not marked done in the slice plan","unitId":"M001/S01/T02"},{"severity":"warning","code":"task_summary_without_done_checkbox","message":"Task T03 has a summary but is not marked done in the slice plan","unitId":"M001/S01/T03"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M002 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M002"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M003 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M003"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M004 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M004"}],"fixDescriptions":["added missing GSD runtime patterns to .gitignore","marked T02 done in /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/milestones/M001/slices/S01/S01-PLAN.md","marked T03 done in /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/milestones/M001/slices/S01/S01-PLAN.md","updated /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/STATE.md"],"summary":"Clean · 4 fixed · 1 critical GSD runtime pattern(s) missing from .gitignore: .gsd/gsd.db"} {"ts":"2026-03-24T11:11:32.760Z","ok":true,"errors":0,"warnings":8,"fixes":3,"codes":["state_file_stale","gitignore_missing_patterns","env_env_file","provider_key_missing","task_done_must_haves_not_verified","delimiter_in_title"],"issues":[{"severity":"warning","code":"state_file_stale","message":"STATE.md is stale — shows \"summarizing\" but derived state is \"executing\"","unitId":"project"},{"severity":"warning","code":"gitignore_missing_patterns","message":"1 critical GSD runtime pattern(s) missing from .gitignore: .gsd/gsd.db","unitId":"project"},{"severity":"warning","code":"env_env_file","message":".env.example exists but no .env or .env.local found — Copy .env.example to .env and fill in values","unitId":"environment"},{"severity":"warning","code":"provider_key_missing","message":"OpenAI — not configured — Set OPENAI_API_KEY or run /gsd keys","unitId":"project"},{"severity":"warning","code":"task_done_must_haves_not_verified","message":"Task T03 has 3 must-haves but summary addresses only 2","unitId":"M001/S01/T03"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M002 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M002"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M003 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M003"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M004 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M004"}],"fixDescriptions":["rebuilt STATE.md from derived state","added missing GSD runtime patterns to .gitignore","updated /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/STATE.md"],"summary":"Clean · 3 fixed · STATE.md is stale — shows \"summarizing\" but derived state is \"executing\""} +{"ts":"2026-03-24T11:14:31.380Z","ok":true,"errors":0,"warnings":9,"fixes":4,"codes":["orphaned_completed_units","gitignore_missing_patterns","env_env_file","provider_key_missing","task_file_not_in_plan","task_summary_without_done_checkbox","delimiter_in_title"],"issues":[{"severity":"warning","code":"orphaned_completed_units","message":"1 completed-unit key(s) reference missing artifacts: execute-task/M001/S01/T01","unitId":"project"},{"severity":"warning","code":"gitignore_missing_patterns","message":"1 critical GSD runtime pattern(s) missing from .gitignore: .gsd/gsd.db","unitId":"project"},{"severity":"warning","code":"env_env_file","message":".env.example exists but no .env or .env.local found — Copy .env.example to .env and fill in values","unitId":"environment"},{"severity":"warning","code":"provider_key_missing","message":"OpenAI — not configured — Set OPENAI_API_KEY or run /gsd keys","unitId":"project"},{"severity":"warning","code":"task_summary_without_done_checkbox","message":"Task T01 has a summary but is not marked done in the slice plan","unitId":"M001/S01/T01"},{"severity":"warning","code":"task_summary_without_done_checkbox","message":"Task T02 has a summary but is not marked done in the slice plan","unitId":"M001/S01/T02"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M002 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M002"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M003 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M003"},{"severity":"warning","code":"delimiter_in_title","message":"Milestone M004 title contains em/en dash (— or –), which conflict with GSD state document delimiters. Rename the milestone to remove these characters to prevent state corruption.","unitId":"M004"}],"fixDescriptions":["added missing GSD runtime patterns to .gitignore","marked T01 done in /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/milestones/M001/slices/S01/S01-PLAN.md","marked T02 done in /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/milestones/M001/slices/S01/S01-PLAN.md","updated /home/pi/development/JobTracker/.gsd/worktrees/M001/.gsd/STATE.md"],"summary":"Clean · 4 fixed · 1 completed-unit key(s) reference missing artifacts: execute-task/M001/S01/T01"} diff --git a/.gsd/milestones/M001/slices/S01/S01-PLAN.md b/.gsd/milestones/M001/slices/S01/S01-PLAN.md index ac2d02d..5d4b38c 100644 --- a/.gsd/milestones/M001/slices/S01/S01-PLAN.md +++ b/.gsd/milestones/M001/slices/S01/S01-PLAN.md @@ -39,13 +39,13 @@ S01 still owns active requirement **R002** and materially supports **R010**. The ## Tasks -- [ ] **T01: Add linked Gmail thread refresh to the backend contract** `est:4h` +- [x] **T01: Add linked Gmail thread refresh to the backend contract** `est:4h` - Why: R002 is still unmet until the app can turn a one-time import into continuing thread history for the same job. - Files: `JobTrackerApi/Controllers/GmailController.cs`, `JobTrackerApi/Services/GmailOAuthService.cs`, `JobTrackerApi.Tests/GmailControllerTests.cs`, `JobTrackerApi/Program.cs` - Do: Add a job-scoped refresh path that reads already-linked `ExternalThreadId` values for one owned job, fetches messages for those known Gmail threads, imports only unseen message ids into the same job, updates refresh timestamps/status, and exposes a clear duplicate-safe result contract. Follow D008: use bounded refresh over known imported thread ids rather than inbox-wide Gmail watch/history infrastructure. - Verify: `dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter GmailControllerTests` - Done when: the API can refresh linked Gmail threads for one job, import new inbound or sent replies without duplicate re-imports, and tests prove success, duplicate-only, disconnected, and invalid-job cases. -- [ ] **T02: Surface live Gmail thread continuity in the job workspace** `est:3h` +- [x] **T02: Surface live Gmail thread continuity in the job workspace** `est:3h` - Why: The slice is only complete when the user can see the linked thread stay current inside the real `Correspondence` workspace flow. - 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` - Do: Wire the workspace to call the new linked-thread refresh contract automatically when appropriate for already-linked threads, show refresh/loading/freshness state in the Gmail area and correspondence list, and prove in the React test that a newly synced Gmail reply appears on the job without using the import action again.