{"v":{"id":180,"url":"https:\/\/www-s01.apinet.com\/codeforge\/api\/v1\/repos\/apiintl\/hhmanager\/issues\/127","html_url":"https:\/\/www-s01.apinet.com\/codeforge\/apiintl\/hhmanager\/issues\/127","number":127,"user":{"id":1,"login":"charles","login_name":"","source_id":0,"full_name":"Charles Willgren","email":"charles@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,"title":"[P3] One CLI pipeline to import, validate and publish forms, interviews and releases from repo files","body":"**Background.** Forms V2 is the new paperwork system for client visits. Each visit type (e.g. Start of Care) is a \"release\" built from several pieces: form definitions, placements (where each answer prints on the PDF), the shared data pool, prefills, and the interview (questions, order, branching). From 29 Sep 2026 most of that is **built by AI from the command line**, and people check it. Item **P3** in `docs\/ActionItems.md` (\u00a76, tooling).\n\n## The problem\nToday's tools assumed office staff would build and publish on screen:\n- `seed-form-v2-workflow.php` never publishes.\n- `form-publish.php` publishes definitions and maps but deliberately **not interviews or releases** (\"the office's decision\").\n- The steps are separate scripts (`import-forms.php`, `form-overlay-propose.php`, `form-attest-propose.php`, `seed-form-v2-workflow.php`, `form-publish.php`) with no single chain.\n\n## What to do\nOne pipeline over the files in the repo: interviews (`docs\/form-v2-interviews\/`), definitions (`docs\/forms\/`), shared pool, placements (`docs\/form-placements\/`), prefills.\n\n**import \u2192 validate \u2192 publish a new version \u2192 assemble a release \u2192 (optionally) activate**\n\n- Dry run by default, `--apply` to write.\n- Idempotent: an unchanged file creates no new version.\n- Same checks as the screens, and a refusal is printed, never forced.\n- Missing today: publishing an interview, assembling and publishing a release, the one command that runs the chain.\n\n## Related\nP4 (#128, where a person must sign off), P5 (#129, files are the source of truth), P6 (#130, pre-publish check).","ref":"","assets":[],"labels":[{"id":33,"name":"action","exclusive":false,"is_archived":false,"color":"d97706","description":"Action item tracked on the Connect dashboard","url":"https:\/\/www-s01.apinet.com\/codeforge\/api\/v1\/repos\/apiintl\/hhmanager\/labels\/33"},{"id":10,"name":"area:forms","exclusive":false,"is_archived":false,"color":"1d76db","description":"Forms engine, packets, review\/approval","url":"https:\/\/www-s01.apinet.com\/codeforge\/api\/v1\/repos\/apiintl\/hhmanager\/labels\/10"},{"id":1,"name":"feature","exclusive":false,"is_archived":false,"color":"0e8a16","description":"New user-facing capability","url":"https:\/\/www-s01.apinet.com\/codeforge\/api\/v1\/repos\/apiintl\/hhmanager\/labels\/1"}],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":3,"created_at":"2026-10-01T10:02:17-05:00","updated_at":"2026-10-05T15:41:55-05:00","closed_at":"2026-10-05T15:41:55-05:00","due_date":null,"pull_request":null,"repository":{"id":27,"name":"hhmanager","owner":"apiintl","full_name":"apiintl\/hhmanager"},"pin_order":0}}