diff --git a/docs/planning/implementation-notes.md b/docs/planning/implementation-notes.md index 1721430..2d1a4f1 100644 --- a/docs/planning/implementation-notes.md +++ b/docs/planning/implementation-notes.md @@ -67,6 +67,7 @@ Choices made while building Release 1 where the brief or the planning documents | 59 | **Interview times:** the hiring manager offers 1 to 5 future times on a submitted candidate (one open offer at a time); the recruiter confirms one, which creates the round with the normal rules (a submitted candidate moves to interviewing), or declines all. A time that has passed since is refused. The default round name is "Interview round N". | FR-HMP-06, decision 4. | `portal/extras.ts`, `portal/resolve-extras.ts` | | 60 | **A candidate's own updates:** a second submission while one is waiting replaces the fields it names. Accepting email, phone, compensation or work authorization makes a new approved version of the profile (the resume file is untouched) and so marks match analyses stale; availability goes to the candidate record. It needs a confirmed profile first (409 otherwise). The portal sign-in address does not change when an email is accepted. Activity log entries name the fields, never the values. | FR-CDP-04; profile fields come from the approved profile (T-2-08). | `portal/resolve-extras.ts` | | 61 | The end-to-end run found two real faults, now fixed: approving a draft did not refresh the rest of the screen (the profile still said "no version confirmed"; every query is now refreshed after an approval), and choosing today's date for a submission or a candidate decision early in the day was sent as noon UTC and refused as "in the future" (`lib/dates.ts` kept at the merge). Contact details (emails, phone numbers) are also taken out of pasted notes before they reach a model. | Found by walking the loop, not by unit tests. | `artifact-editor.tsx`, `lib/dates.ts` | +| 62 | **Goals built by hand (G#9, G#10, G#11):** no Build fleet or self-hosted runner is attached to this repository, so nothing merges or opens a PR for a goal on its own. For a goal built by hand: take it (`ibuild engine goal take`) before writing code so no second implementation starts, create its task, record the commit range, report each phase, and only then accept the goal. `goal land` and the armed accept assume a runner and a goal PR, and accepting a goal with no PR is refused. G#9 was built twice (PR #9 merged, PR #10 closed) because the goal showed no branch or PR in Build while an open PR existed on GitHub; check `gh pr list` for the goal number first. G#10 was accepted before it had a task, and Build cannot reopen an accepted goal, so its record was carried by G#11. | Keeps Build's goal and task records true to what shipped, and avoids duplicate work. | `ibuild engine goal take`, `ibuild engine create`, `ibuild engine goal accept`; PRs #9, #10, #11 | ## Running things