{"v":[{"id":639,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/40#issuecomment-639","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/40","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":"Closing: the `apiapp\/` Flutter app has been discontinued, so whether to make it a submodule or fold it in is moot. Forms V2 is a web-only build (docs\/FormsV2Plan.md \u00a73.2). The directory is still untracked in this working tree. Archive or delete it on purpose rather than leaving it there by accident.","assets":[],"created_at":"2026-10-01T09:15:05-05:00","updated_at":"2026-10-01T09:15:05-05:00"},{"id":640,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/41#issuecomment-640","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/41","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":"Closing: the `apiapp\/` Flutter app has been discontinued, so no Android release build will be made. Forms V2 is a web-only build (docs\/FormsV2Plan.md \u00a73.2). If a native app is ever started again, release signing has to be settled before the first store upload.","assets":[],"created_at":"2026-10-01T09:15:05-05:00","updated_at":"2026-10-01T09:15:05-05:00"},{"id":641,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/42#issuecomment-641","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/42","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":"Closing: the `apiapp\/` Flutter app has been discontinued, so there is no native device layer to harden. Forms V2 is a web-only build and online-only (docs\/FormsV2Plan.md \u00a73.2). The findings here are worth re-reading if a native app is ever started again.","assets":[],"created_at":"2026-10-01T09:15:05-05:00","updated_at":"2026-10-01T09:15:05-05:00"},{"id":642,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/43#issuecomment-642","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/43","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":"Closing: the `apiapp\/` Flutter app has been discontinued, so there will be no device release for calls or push to be part of. Email and text alerts through the `notify\/*` subscriptions are unaffected. Any app-side call\/push wiring that is still left in this repo can be deleted as dead code.","assets":[],"created_at":"2026-10-01T09:15:05-05:00","updated_at":"2026-10-01T09:15:05-05:00"},{"id":643,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/46#issuecomment-643","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/46","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":"Closing: the `apiapp\/` Flutter app has been discontinued, so none of its flavors (H, B or C) will be built. Forms V2 is a web-only build (docs\/FormsV2Plan.md \u00a73.2).","assets":[],"created_at":"2026-10-01T09:15:05-05:00","updated_at":"2026-10-01T09:15:05-05:00"},{"id":644,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/47#issuecomment-644","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/47","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":"Closing: the `apiapp\/` Flutter app has been discontinued. Field staff start a visit from the web app (`\/visits-v2`) under Forms V2, so a native home screen is no longer needed.","assets":[],"created_at":"2026-10-01T09:15:05-05:00","updated_at":"2026-10-01T09:15:05-05:00"},{"id":645,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/21#issuecomment-645","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/21","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":"Closing: this design depends on the API HHP app, meaning the `apiapp\/` Flutter app (device binding, biometric gate and the prompt UI), and that app has been discontinued. `push` stays out of `AUTH_FACTOR_BUILT`, so the chooser never offers it. If phone approval comes back with a different app, the safety rules above (number matching, rate limit, audited denial, short expiry, the verdict coming only from the device) still apply.","assets":[],"created_at":"2026-10-01T09:15:05-05:00","updated_at":"2026-10-01T09:15:05-05:00"},{"id":646,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/4#issuecomment-646","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/4","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":"Closing as superseded by Forms V2. This issue asked for a printable view of a V1 `form_instance`. V2 instead renders each form onto its original paper from a published placement map and keeps the result in the encrypted document store (`code\/form_v2_artifact.inc.php`, docs\/FormsV2Plan.md \u00a79). No V1 visit was ever started for a real client, so a V1 print path would have nothing to print.","assets":[],"created_at":"2026-10-01T09:15:06-05:00","updated_at":"2026-10-01T09:15:06-05:00"},{"id":647,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/55#issuecomment-647","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/55","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":"Closing as superseded by Forms V2. Under V2, the form catalogue is the original paper plus a placement map (`docs\/form-placements\/`) and a prepared interview (`docs\/form-v2-interviews\/`), not hand-authored V1 definitions, and page-tagging the ISP for V1 packets no longer unblocks anything. What remains is tracked in docs\/FormsV2Plan.md (\u00a79, and the missing-originals row of its blocker table).","assets":[],"created_at":"2026-10-01T09:15:06-05:00","updated_at":"2026-10-01T09:15:06-05:00"},{"id":658,"html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/49#issuecomment-658","pull_request_url":"","issue_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/49","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":"Fixed 2026-10-01 by retiring the Forms V1 runtime, and by making the guard fail closed.\n\n* **The hole is gone.** Every endpoint that could reach a `fk_hh_member = 0` instance has been deleted: `formSessionAcquire`, `formSync`, `formFile`, `formAmend`, `formSessionRelease`\/`Break`, `formInstanceGet`\/`Answers`\/`Void`, and the rest of the V1 fill, sync and review runtime. Visits are Forms V2 now.\n* **The rule is fixed where it lived.** `hh_member_pk_in_scope()` (`code\/functions_hhm.inc.php`) now returns **false** for a pk of 0 or less. It used to return true. Every V2 caller already refused a zero itself, so V2 behaves the same. `scripts\/test-access-hygiene.php` now asserts this so it cannot quietly flip back.\n* **When staff or HR forms arrive**, a document about somebody who is not a client needs its own scope rule, for example the attendant's once the attendant record (RolesPlan \u00a77) exists. It must not be an exemption in the client rule. CLAUDE.md says so in the Permissions section.\n\nThe V1 tables (`form_instance` and the others) are kept, with any rows in them, and nothing reads them. Dropping them is a separate decision.\n\nStatus: the change is in the working tree and **not yet committed**. It has been applied to the local dev database only. The production deploy steps are in the docs\/Changelog.md entry for 2026-10-01.","assets":[],"created_at":"2026-10-01T09:52:49-05:00","updated_at":"2026-10-01T09:52:49-05:00"},{"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"}]}