{"v":[{"id":861,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/76#issuecomment-861","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/76","user":{"id":3,"login":"connect-bot","login_name":"","source_id":0,"full_name":"","email":"connect-bot@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/68a2723f7ad70dee2e1415be7488d84b","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/connect-bot","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-10-01T08:49:35-05:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"connect-bot"},"original_author":"","original_author_id":0,"body":"**Charles W.** _(via Connect)_\n<!-- connect:user=1 -->\n\nThis is a test comment.","assets":[{"id":3,"name":"photo-20261001-131430-1.jpg","size":223494,"download_count":4,"created_at":"2026-10-01T13:14:31-05:00","uuid":"fc4ae3b8-8e92-4711-beed-c73428143432","browser_download_url":"https:\/\/www-s01.apinet.com\/codeforge\/attachments\/fc4ae3b8-8e92-4711-beed-c73428143432","type":"attachment"}],"created_at":"2026-10-01T13:14:30-05:00","updated_at":"2026-10-01T13:14:31-05:00"},{"id":866,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/132#issuecomment-866","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/132","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"Done in 6c07bb9: the idle sign-out is now 15 minutes (was 3). It is one constant, `SESSION_IDLE_TIMEOUT` in `code\/functions_auth.inc.php`. The browser countdown reads its remaining time from `\/do\/sessionCheck`, so the \"Stay Signed In\" warning still appears with 1 minute remaining (after 14 minutes of inactivity). The 12-hour absolute limit is unchanged.\n\nTakes effect once deployed. Note: 3 minutes was the documented HIPAA automatic-logoff setting, so any policy document that states 3 minutes should be updated to say 15.","assets":[],"created_at":"2026-10-01T13:45:51-05:00","updated_at":"2026-10-01T13:48:15-05:00"},{"id":874,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/82#issuecomment-874","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/82","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"## Proposal: use a local copy of the NPPES file, not the live API\n\nCMS publishes the whole NPI registry as a free download (https:\/\/download.cms.gov\/nppes\/NPI_Files.html): a **full file each month**, a **weekly update file**, and a **monthly list of deactivated NPIs**. We can load it into our own table and search that table, so a visit never calls out to anything.\n\n**Import** (`scripts\/import-npi.php`, run on a monthly timer, then weekly for updates):\n- Stream the CSV inside the zip. The full file is about 9 GB with 300+ columns, so read it row by row and keep only what we use.\n- Keep **individuals** (entity type 1) whose practice location is in **Texas**, plus **organisations** (entity type 2) with a pharmacy taxonomy (`3336*`), which covers E1 as well.\n- Columns to keep: NPI, last\/first\/middle name, credential, primary taxonomy (shown as specialty), practice address, city, ZIP, phone, fax, deactivation date.\n- Upsert by NPI. Mark deactivated NPIs inactive rather than deleting them, so an old visit still resolves to the doctor it named.\n- New table `npi_provider` via `migrations\/`. It holds only public data, so it is stored in plaintext with no PHI. Index it on (last name, first name) and ZIP.\n\n**Lookup** (`\/do\/npiSearch`, gated like the visit screens):\n- Staff type a last name and optionally a first name, and can narrow by city or ZIP. We return up to about 20 matches showing name, credential, specialty and city. Staff pick one, address and phone fill in, and staff can still edit them.\n- Searching by name alone isn't precise enough for common surnames. Narrowing by city or ZIP fixes that. Defaulting to the client's own ZIP would also work, and it is safe because the search stays on our server.\n- Store the **NPI** with the answer, not just the address text, so we can trace which record was picked.\n\n**Why a download beats the API:** nothing about the client, not even the doctor's name, leaves our server. Production needs no outbound access at visit time. Search speed doesn't depend on CMS being up. The weekly update file keeps us at most a week behind the registry.\n\nThe open question for the customer still applies: if they keep their own list of doctors, we could load it into the same table as an extra source.","assets":[],"created_at":"2026-10-01T15:22:54-05:00","updated_at":"2026-10-01T15:22:54-05:00"},{"id":875,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/99#issuecomment-875","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/99","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"## Proposal: use the same NPI download as #82\n\nPharmacies are already in the NPPES file proposed in #82: organisations (entity type 2) with a pharmacy taxonomy (`3336*`). The import keeps them in the same `npi_provider` table, so we need no second source and no second import.\n\n**Where the answer comes from, in order:**\n1. **On file.** If the client's last visit recorded a pharmacy, start with that one already selected. VESTA as a source is still the open question for the customer.\n2. **Look it up.** Staff type part of the name. Results are limited to the **client's ZIP or city** first, because a name like \"Walgreens\" or \"CVS\" matches hundreds of stores and only the location tells them apart. Each match shows the name, street address and phone.\n3. Staff pick one. Name and phone fill in, and both can still be edited.\n\n**Details:**\n- Also import the NPPES \"other name\" file, so a store's DBA name (e.g. \"CVS Pharmacy #1234\") can be searched as well as its legal company name.\n- Show the pharmacies this agency has picked before at the top of the results. That gives the requested drop-down of known pharmacies with no separate list to maintain.\n- Store the pharmacy's **NPI** with the answer, as for the doctor.\n- The search runs against our own table, so nothing about the client leaves our server.\n\n**Still needed from the customer:** does VESTA or their own records already hold each client's pharmacy? If so, we prefill from that and use the lookup only when nothing is on file.","assets":[],"created_at":"2026-10-01T15:24:26-05:00","updated_at":"2026-10-01T15:24:26-05:00"},{"id":877,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/99#issuecomment-877","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/99","user":{"id":3,"login":"connect-bot","login_name":"","source_id":0,"full_name":"","email":"connect-bot@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/68a2723f7ad70dee2e1415be7488d84b","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/connect-bot","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-10-01T08:49:35-05:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"connect-bot"},"original_author":"","original_author_id":0,"body":"**Charles W.** _(via Connect)_\n<!-- connect:user=1 -->\n\nVESTA does not record (and thus does not export) any pharmacy information. We'll need to record it in our member record (after being accepted by office review) and prefill any future forms from that.","assets":[],"created_at":"2026-10-01T15:59:22-05:00","updated_at":"2026-10-01T15:59:22-05:00"},{"id":878,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77#issuecomment-878","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"## Where a shared question is worded differently on each form\n\n19 interview questions fill more than one form. **8 of them are worded differently from form to form**; these are the ones the customer needs to decide on. The other 11 (advance directives, release of records, unable-to-sign reason, rights reviewed) read the same on both consents and on Private Pay, so they need no decision.\n\n| Question on screen today | Wording on each form |\n|---|---|\n| Client's sex | Client Information Sheet: **\"Gender\"** \u00b7 Emergency\/Disaster Form, PAS Service Plan: **\"Sex\"** |\n| Emergency priority class | Client Information Sheet: **\"Classification\"** \u00b7 Emergency\/Disaster Form: **\"What category describes your special needs?\"** |\n| First emergency contact: name | Client Information Sheet: **\"First Emergency Contact \u2014 Contact Person\"** \u00b7 Emergency\/Disaster Form: **\"In case of emergency contact \u2014 Name\"** |\n| First emergency contact: relationship | Client Information Sheet: **\"First Emergency Contact \u2014 Relation\"** \u00b7 Emergency\/Disaster Form: **\"Relationship\"** |\n| First emergency contact: phone | Client Information Sheet: **\"First Emergency Contact \u2014 Phone Number\"** \u00b7 Emergency\/Disaster Form: **\"Phone Number\"** |\n| Level of supervision (RN or non-RN) | PAS Service Plan: **\"Plan of Supervision\"** \u00b7 Form 3040: **\"Level of Supervision\"** |\n| Tasks in the service plan | PAS Service Plan: **\"Service Plan Tasks\"** \u00b7 Coordination of Care: **\"Tasks provided\"** |\n| Other task in the service plan | PAS Service Plan: **\"Service Plan \u2014 Other\"** \u00b7 Coordination of Care: **\"Other (specify)\"** |\n\n### Two things make the decision harder\n\n- **Some wordings don't stand on their own.** \"Phone Number\", \"Relationship\" and \"Classification\" only make sense next to the rest of the paper form. The Emergency\/Disaster Form's wording also reads as a different question from the Client Information Sheet's. So \"one form wins\" would need a rule like \"use the Client Information Sheet's wording, which is the most complete\". Showing each form's wording could be confusing here.\n- **Wording that matches can still be a fragment.** The medical power of attorney's phone line is just **\"Phone\"** on all three forms. \"Which directives\" and \"Reviewed and acknowledged\" also only make sense next to the paragraph above them. Showing the form's wording as the label works there only if the surrounding paper text (already shown underneath) stays visible.\n\n### Source\n\nThe wordings come from the field labels in our form definitions (`docs\/forms\/*.json`), which were transcribed from the paper forms, and the list of shared questions from `FORM_V2_SHARED_ELEMENTS` in `code\/form_v2_shared.inc.php`. They should match the paper closely but may not be exact, so check them against the paper before sending this to the customer.","assets":[],"created_at":"2026-10-01T18:08:58-05:00","updated_at":"2026-10-01T18:08:58-05:00"},{"id":879,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77#issuecomment-879","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"## Most of this change does not wait on the customer\n\nThe customer's decision above covers only the **8 shared questions** whose wording differs between forms. In the SOC\/AO interview, **250 questions belong to a single form**, so they can simply take that form's printed wording as their label. That work can go ahead now.\n\nThe example the customer raised is one of these. It is on the PAS Service Plan only (`form.pas-eval-service-plan.duplicate_phc`):\n\n| | Form wording | Our interview today (`docs\/form-v2-interviews\/SOC_AO.json`) |\n|---|---|---|\n| Question | \"Do these services appear to duplicate PHC services?\" | \"Do any of those services overlap with what our attendant will do?\" |\n| Follow-up | \"Comments\" | \"Explain the overlap.\" |\n\nThe follow-up box has the same problem: the form calls it \"Comments\".\n\n**Keep the explanations when the labels change:**\n- The form's own instruction (\"If yes, notify the individual's DADS caseworker before requesting prior approval\u2026\") is already shown under the question and stays there (FormsV2Plan \u00a74.1.2).\n- Our plain-English help line (\"Your judgement: would the client be getting the same help twice?\") can stay as a hint below the form's wording. That way the label matches the paper without losing the explanation.","assets":[],"created_at":"2026-10-01T18:12:22-05:00","updated_at":"2026-10-01T18:12:22-05:00"},{"id":921,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/105#issuecomment-921","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/105","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):** this probably gives us the mapping.\n\n> Opposite Answers:\n> Is a change in tasks or hours, or should services end? Yes, No\n> Is the service plan enough to meet clients needs? No, Yes\n\nIn the interview that is `form.forms-3040.change_needed` \u2194 `form.forms-3040.service_plan_adequate`. These are likely Q3b and Q7. Check against the paper before building.\n\nSnag: `service_plan_adequate` has a third option, \"Does not apply\", which has no opposite. Decide whether it goes away once the answer is derived.\n\nDon't mix this up with H6 (#96), \"Does the client need the services?\" (`continues_to_need_services`). That one is a separate always-Yes default.","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":923,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/103#issuecomment-923","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/103","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):** the frequency is a drop-down with three values, and each task has a default.\n\n> How often: Drop Down QD - Every Day, QW - Every week, PRN - As Needed\n\n| Task | Default |\n|---|---|\n| Bathing, Dressing, Exercising, Feeding\/Eating, Grooming\/Shaving\/Oral Care, Routine Hair\/Skin Care, Toileting, Transfer, Ambulation, Cleaning, Walking, Meal Preparation, Assist w\/ Self-Admin Med | QD |\n| Laundry, Shopping | QW |\n| Escort | PRN |\n| Blank \"other\" row | drop-down (QD, QW, PRN) |\n\nToday `form.forms-3040.task_*_freq` is **free text** (\"daily, 3 times a week\"). So:\n1. Make it a choice of QD \/ QW \/ PRN, with the defaults above, and only for tasks in the client's VESTA list (S4 #89 \/ A4 #108).\n2. Add the blank \"other\" task row, with its name typed in and its frequency from the drop-down.\n3. Still to ask: with sensible defaults, do we still need to *refuse* QW on a QD task, or is the default enough?","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":926,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/106#issuecomment-926","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/106","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):** the exact value to fill.\n\n> Who should the attendant report them to? \u2026 autofill it to the Agency \"Legacy Home Health Agency & main phone number\" Form 3040 Check Off 10-4\n\n* Name: the agency name.\n* Phone: the agency's **main** number. The fact we have is `agency_phone_24h`. Ask whether \"main\" is a different number, and if it is, add it as a system fact.\n* \"Check Off 10-4\" looks like the paper's item number. Record it for G2 (#78).\n\nThe question above it, \"Which health problems must the attendant report?\", is now A7 (#138).","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":929,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/109#issuecomment-929","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/109","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):**\n\n> Attendants and supervision: Attendant A-C - Pull from Service Plan?\n\nThis partly answers the question: Attendants A\u2013C on the 3040 come from the service plan (the *Attendants and their hours* step \/ `schedule.attendant_*`). It still has a question mark, so confirm it with the customer.","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":930,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/95#issuecomment-930","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/95","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):** the format.\n\n> Change of Tasks, Hours, or Services Ending: Template Elements Notes and Fill in Blanks\n\nSo the answer is a structured template (elements, plus notes and fill-in blanks), not free text. We still need the template's actual elements from the customer.\n\nAlso related: the Yes\/No on this question is the opposite of \"Is the service plan enough\u2026\" (A1, #105).","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":932,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/112#issuecomment-932","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/112","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):**\n\n> Drop down with who's signing for Client\n\nThe question of who signs for the client, and on what authority (`shared.release.authority`, \"If someone is signing for the client, what gives them the right to?\"), should be a **drop-down**, not typed. Get the list from the customer (POA, MPOA, guardian, parent\u2026). The POA choice is then what opens the follow-up question this issue is about. Hiding all of it when the client signs is W1 (#111).","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":934,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/90#issuecomment-934","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/90","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):**\n\n> Other care the client receives <-> Service plan\n\nThe service plan's \"other services\" and the *Other care the client receives* step (Coordination of Care) are the same information. Filed as K2 (#140): derive the service plan line from Coordination of Care, so \"no providers entered\" answers what prints here.","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":936,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/97#issuecomment-936","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/97","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):** confirmed. \"Does the client's schedule vary week to week? No\", answered automatically. The schedule note next to it is H9 (#139).","assets":[],"created_at":"2026-10-02T09:06:26-05:00","updated_at":"2026-10-02T09:06:26-05:00"},{"id":938,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/102#issuecomment-938","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/102","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):** \"Task Guide - Review Needed\". Still undecided on their side.","assets":[],"created_at":"2026-10-02T09:06:27-05:00","updated_at":"2026-10-02T09:06:27-05:00"},{"id":939,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/107#issuecomment-939","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/107","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**From Frank's notes of the on-site meeting (29 Sep):**\n\n> Is this only an orientation or is no attendant assigned yet? Review needed\n\nThis is `form.forms-3040.satisfaction_na_note`. It gates every per-attendant satisfaction and task-performance question, so the decision here changes how much of the 3040 is asked at an SOC.","assets":[],"created_at":"2026-10-02T09:06:27-05:00","updated_at":"2026-10-02T09:06:27-05:00"},{"id":940,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77#issuecomment-940","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"## Built on dev (5 Oct 2026). The customer decision is still open\n\n**What changed on the visit screen**\n- Each question is now called what the paper form calls it (taken from the field labels in our form definitions). Our plain-English wording is kept underneath it as an \"Ask: \u2026\" line, so the supervisor still has something natural to read out.\n- **276 of the 316** SOC\/AO questions now carry the form's wording. 16 of those (Form 3040 items 4, 5, 8, 9, 10-5, 10-6, 3B) were set to the paper's exact text, because the definition had shortened it.\n- Example: the PAS Service Plan question now reads **\"Do these services appear to duplicate PHC services?\"**, with \"Ask: Do any of those services overlap with what our attendant will do?\" below it.\n\n**Still waiting on the customer: 40 questions where the forms word it differently**\n- The 8 shared questions in the table above.\n- The client's details that print on many forms. For example, the client's name is worded 14 different ways (\"Individual's Name (please print)\", \"Client Name\", \"Patient Name\"\u2026). The same goes for date of birth, Medicaid number, phone, address and physician.\n- The schedule cells (the ISP says \"Sun\", the 3040 says \"Sunday\").\n\nUntil the customer decides, these keep our wording. The \u24d8 panel on each one lists every form's own wording (\"On this form: 'Gender'\"). Once they decide, the change is a rule in one place (`form_v2_paper_wording()`), not 40 edits.\n\n**Not changed:** the wording of answer *choices* (e.g. \"In person\" \/ \"By telephone\"). Should those go back to the paper's too? That's a question for the customer as well.\n\nTechnical: FormsV2Plan \u00a74.1.3, Changelog 2026-10-05. Interview file key `say` is new and documented in `docs\/form-v2-interviews\/README.md`.","assets":[],"created_at":"2026-10-05T09:24:16-05:00","updated_at":"2026-10-05T09:24:16-05:00"},{"id":941,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/78#issuecomment-941","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/78","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"## Built on dev (5 Oct 2026)\n\n**Only Form 3040 prints question numbers.** I checked every Start of Care blank: the Client Information Sheet, both consents, Coordination of Care, the Emergency\/Disaster plan, 2-1-1, the PAS Service Plan, the Task Guide, Things You May Not Do, the Transfer form, Private Pay and the H2076. None of the others numbers its questions, so for those forms no number is shown, and none is made up.\n\n**On the 3040** the numbers are items 1, 2A, 2B, 2C, 3A, 3B, 4\u20139 and 10-1 to 10-7. They are recorded for all 96 of its numbered fields. The visit screen shows them beside the question, e.g. **\"Form 3040, item 8\"**. The form itself calls them \"items\" (\"items 4 and\/or 5\"). A question that fills several numbered forms would show each one.\n\n**How it's stored:** a `numbering` block in `docs\/form-placements\/forms-3040.json`, carried into the form's map, so the numbers are pinned with the paper. A new revision of the form can renumber it. The Form Explorer shows the number on each box row. Still to do: the data-element list (R1).\n\nTechnical: FormsV2Plan \u00a74.1.3, Changelog 2026-10-05.","assets":[],"created_at":"2026-10-05T09:24:16-05:00","updated_at":"2026-10-05T09:24:16-05:00"},{"id":942,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77#issuecomment-942","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/77","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"## Answer choices now match the form too (5 Oct 2026, dev)\n\nDecided: choices say what the form says. **\"HDM\"**, not \"Home-delivered meals\". The same goes for DME, DAHS, N\/A, RN \/ Non-RN, NON HCBS, Family Residence, and so on.\n\n- 252 reworded choices were removed from the SOC\/AO interview, so the form's wording shows through.\n- The same rule as the question labels applies: a choice uses the form's wording wherever every form that offers it agrees.\n\n**Three choice lists still keep our wording, because the forms disagree.** These join the 40 questions waiting on the customer:\n- **Emergency priority class:** the Client Information Sheet has a one-line choice (\"Class 1: Bed confined \/ services may not be postponed\"). The disaster plan has a paragraph for each class.\n- **Sex:** the ISP prints \"M\" \/ \"F\", the other forms \"Male\" \/ \"Female\".\n- **Service tasks:** the ISP prints numbered bilingual codes (\"1 - Bathing \/ Ba\u00f1ar\"), the Coordination of Care plain names (\"Bathing\").","assets":[],"created_at":"2026-10-05T09:45:05-05:00","updated_at":"2026-10-05T09:45:05-05:00"},{"id":943,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/127#issuecomment-943","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/127","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**Built (2026-10-05), not yet committed.**\n\n`scripts\/form-v2-pipeline.php --interview=SOC_AO_V2` (or `--packet=SOC_AO`) runs the whole chain:\n\n- **Import.** The packet's form definitions, placements and signing lines go through the existing importers. The interview comes from `docs\/form-v2-interviews\/`. The import is idempotent: a file that already matches the draft or the published version writes nothing. An interview draft edited on screen is not overwritten unless `--replace` is given.\n- **Publish.** `form_v2_pipeline_run()` publishes the definitions, then the maps, then the interview (through the editor's gate), then a release (`SOC_AO-20261005`, numbered if the code is taken). All of it is one transaction, using the screens' own publishers. It commits only if nothing was refused and the #130 check passes on the release it produced.\n- **Modes.** The default is a dry run: the chain runs and is rolled back, so the output is the actual release rather than a prediction. `--import` writes drafts only. `--apply --as=EMAIL` publishes.\n- **Activation.** `--activate=9,10` activates afterwards. It is refused on production (see #128).\n- **Idempotent.** If the content is the same as the last release, no new release is made.\n\nReview page: `\/admin\/form-v2-publish` (see #130).\n\nTwo limits:\n- The placement proposer reads the *published* definition. A form that gains a new field therefore needs its definition published before its placement can be proposed. The pipeline refuses this case and names it; it does not guess.\n- Packets are not imported or published by the chain. They keep `import-form-packets.php --publish`.\n\nAlso fixed: `form-publish.php` judged a later form's map against the *old* definition when it published several forms in one run, because of a per-request cache.","assets":[],"created_at":"2026-10-05T10:06:03-05:00","updated_at":"2026-10-05T10:06:03-05:00"},{"id":946,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/130#issuecomment-946","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/130","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**Built (2026-10-05), not yet committed.**\n\n`form_v2_publish_check()` (pure, `code\/form_v2_review.inc.php`) is built on the Form Explorer's model, and three places read it: the Explorer's **Gaps** tab, the CLI (#127) and the new review page. A publish is refused unless all nine checks pass:\n\n1. publish rules\n2. required boxes are asked\n3. every box is filled, or blank for a written reason\n4. no orphan questions\n5. every branch reachable\n6. bindings\n7. paper coverage\n8. every shared answer has a ruling\n9. **every form prints a proof**, using the same rule a kept form uses\n\nThe Gaps tab does not render proofs, so it shows that check as \"not run\", which never counts as a pass.\n\n**Review page `\/admin\/form-v2-publish`** (menu: *Publish an Interview*) shows:\n- the verdict and the check;\n- what publishing does;\n- what changed: questions new, reworded (old and new side by side), moved, asked under another condition or removed, plus changes to the forms and placements;\n- every question in full;\n- one **Publish all of this** button (needs the Approve right).\n\nThe page is a rollback rehearsal of the real publish. The button sends the reviewed release's fingerprint, and the publish refuses if anything changed in between. It never activates.\n\nSOC_AO rehearses clean today: 316 questions, all nine checks pass.\n\nTests: `test-form-v2-review.php` (51) and `test-form-v2-pipeline-state.php` (19).","assets":[],"created_at":"2026-10-05T10:06:03-05:00","updated_at":"2026-10-05T10:06:03-05:00"},{"id":948,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/127#issuecomment-948","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/127","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**Update: the \"new field\" limitation is gone.**\n\nThe placement and signing-line proposers now read the definition *about to be* published: each form's newest draft wherever it differs from the published version. `--published` restores the old reading.\n\nSo a field added to a form gets its boxes in the same `--import`, and the one-button publish carries the form and its placement together. Publishing still judges each map against the definition published at that moment, which in the pipeline is the one it has just published.\n\nProved on dev:\n- I added a tick box to a draft of *Things Your Attendant May Not Do*.\n- One rehearsal published the definition (\"New field\") and the map (\"Now printed\").\n- The check refused only because the interview didn't ask the new field yet, which is correct.\n\nThe test drafts were removed afterwards. The regression is pinned in `test-form-v2-pipeline-state.php`, which now has 24 checks.","assets":[],"created_at":"2026-10-05T10:12:28-05:00","updated_at":"2026-10-05T10:12:28-05:00"},{"id":949,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/129#issuecomment-949","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/129","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**Decision: remove the edit screens.** The files are the source of truth, and a correction is a file change.\n\n**Done (2026-10-05):**\n* `\/admin\/form-v2-workflows` (Visit Interviews) and `\/admin\/form-v2-maps` (Form Placement) are off the menu and unrouted (both now 404). They are kept for reference in `archive\/form-v2-editors\/`, with a README covering why and how to bring one back.\n* Their 15 endpoints moved there too: `formV2Workflow{Create,Get,List,NewDraft,Preview,Publish,SaveDraft}`, `formV2Map{Get,List,NewDraft,Preview,Publish,SaveDraft,SuggestSignings}`, and `formV2ReleasePublish` (assembling a release by hand, which the pipeline replaced).\n* **Two things on the interview screen were not editing**, so they stayed live on a new page, `\/admin\/form-v2-releases` (**Paperwork in Use**):\n  * **choosing a release for each agency** (#128). The CLI's `--activate` is refused on production, so without this page nothing could put a release in use;\n  * **retiring an interview, or bringing one back.**\n* Publish an Interview, the Explorer's Gaps tab and `form-v2-pipeline.php` now point there. The library functions are unchanged.\n\nThe route is now: files \u2192 Form Explorer (check) \u2192 Publish an Interview \u2192 Paperwork in Use.","assets":[],"created_at":"2026-10-05T10:24:08-05:00","updated_at":"2026-10-05T10:24:08-05:00"},{"id":952,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/126#issuecomment-952","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/126","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**Status, 2026-10-05: mostly done by #127\/#130. Two pieces are still open.**\n\nThe **Publish an Interview** page (`\/admin\/form-v2-publish`) already shows what changed between what you are about to publish and the latest release:\n* **Questions:** new, reworded (old and new wording side by side), moved, removed, or asked under a different condition, with an \"Only what changed\" filter (`form_v2_workflow_diff()`).\n* **Forms:** for each form, changes to the definition and to where answers print (`form_v2_form_def_diff()`, `form_v2_map_diff()`).\n* **The release as a whole:** `form_v2_release_compare()` now has a screen.\n\nThat covers \"draft beside published\". It sits on the Publish page rather than the Form Explorer, which is where the review happens.\n\n**Still open:**\n1. **Compare any two releases after they are published** (for example \"what changed between the 1 Oct and 5 Oct releases\"). Today you only see a comparison at publish time. The natural place is beside each release on the new **Paperwork in Use** page (`\/admin\/form-v2-releases`, #129).\n2. **Link each change to the issue that asked for it.** Releases carry free-text notes, and nothing ties a change to an issue. The links could come from the release notes, or from the commit that changed the prepared file.\n\nSmaller point: a prefill change shows up through the question and placement diffs, but it is not called out as a prefill change of its own.","assets":[],"created_at":"2026-10-05T10:32:13-05:00","updated_at":"2026-10-05T10:32:13-05:00"},{"id":954,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/129#issuecomment-954","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/129","user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@noreply.www-s01.apinet.com","avatar_url":"https:\/\/www-s01.apinet.com\/codeforge\/avatars\/d3c894f7297c5a18eb3f6ac837c335b11a00aa9cc0961323771632b1e2d61bb2","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/charles","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2025-12-08T10:03:41-06:00","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"charles"},"original_author":"","original_author_id":0,"body":"**Follow-up: the Form Editor is archived too.** `\/admin\/forms-edit` was still live and on the menu in production after the archive deploy. Form definitions are files in `docs\/forms\/`, so the same drift applies.\n\n* The page and its eight endpoints (`formCreate`, `formImport`, `formDef{NewDraft,SaveDraft,Publish,Archive,Get,List}`) moved, unrouted, to `archive\/form-editor\/`, with a README.\n* **Import** with `scripts\/import-forms.php`.\n* **Publish** with `scripts\/form-v2-pipeline.php` or `\/admin\/form-v2-publish` for a form in a visit type, and `scripts\/form-publish.php --forms=CODE --apply --as=EMAIL` for any other form. All three use the same publish gate the editor used.\n\nNot changed: the Visit Packets editor (`\/admin\/form-packets`). It is off the menu but still reachable by URL, and packet definitions are files in `docs\/form-packets\/`.","assets":[],"created_at":"2026-10-05T10:34:31-05:00","updated_at":"2026-10-05T10:34:31-05:00"}]}