procesio-cli 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. procesio_cli/__init__.py +18 -0
  2. procesio_cli/_cli.py +71 -0
  3. procesio_cli/agents/__init__.py +0 -0
  4. procesio_cli/agents/_lib/__init__.py +0 -0
  5. procesio_cli/agents/_lib/actiondef.py +24 -0
  6. procesio_cli/agents/_lib/errors.py +40 -0
  7. procesio_cli/agents/_lib/reversibility.py +236 -0
  8. procesio_cli/agents/_lib/toolrunner.py +141 -0
  9. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PLAYBOOK.md +62 -0
  10. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PROCESIO-INTEROP.md +76 -0
  11. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-TROUBLESHOOTING.md +60 -0
  12. procesio_cli/agents/connector-builder/README.md +51 -0
  13. procesio_cli/agents/connector-builder/agent.yaml +61 -0
  14. procesio_cli/agents/connector-builder/context.py +19 -0
  15. procesio_cli/agents/connector-builder/handlers/__init__.py +1 -0
  16. procesio_cli/agents/connector-builder/handlers/checklist.py +71 -0
  17. procesio_cli/agents/connector-builder/handlers/guidance.py +37 -0
  18. procesio_cli/agents/connector-builder/handlers/nextstep.py +221 -0
  19. procesio_cli/agents/connector-builder/handlers/status.py +35 -0
  20. procesio_cli/agents/connector-builder/knowledge.py +47 -0
  21. procesio_cli/agents/connector-builder/main.py +93 -0
  22. procesio_cli/agents/connector-builder/tests/conftest.py +95 -0
  23. procesio_cli/agents/connector-builder/tests/test_cba_agent.py +148 -0
  24. procesio_cli/agents/orchestrator/__init__.py +0 -0
  25. procesio_cli/agents/orchestrator/bootstraplib.py +166 -0
  26. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/00-INDEX.md +60 -0
  27. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/01-PROCESSES.md +230 -0
  28. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/02-FORMS.md +287 -0
  29. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/03-INTEGRATIONS.md +384 -0
  30. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/04-DATABASE.md +293 -0
  31. procesio_cli/agents/procesio/PROCESIO-API-RELIABILITY-DOCTRINE.md +113 -0
  32. procesio_cli/agents/procesio/PROCESIO-BEST-PRACTICES.md +316 -0
  33. procesio_cli/agents/procesio/PROCESIO-BUILD-AND-TEST-PLAYBOOK.md +217 -0
  34. procesio_cli/agents/procesio/PROCESIO-DATASTORE.md +72 -0
  35. procesio_cli/agents/procesio/PROCESIO-ENVIRONMENTS.md +62 -0
  36. procesio_cli/agents/procesio/PROCESIO-SCHEDULING.md +47 -0
  37. procesio_cli/agents/procesio/PROCESIO-VISUAL-ORGANIZATION.md +175 -0
  38. procesio_cli/agents/procesio/README.md +97 -0
  39. procesio_cli/agents/procesio/__init__.py +0 -0
  40. procesio_cli/agents/procesio/agent.yaml +73 -0
  41. procesio_cli/agents/procesio/audit.py +226 -0
  42. procesio_cli/agents/procesio/checklist.py +135 -0
  43. procesio_cli/agents/procesio/context.py +19 -0
  44. procesio_cli/agents/procesio/handlers/__init__.py +0 -0
  45. procesio_cli/agents/procesio/handlers/audit.py +39 -0
  46. procesio_cli/agents/procesio/handlers/checklist.py +34 -0
  47. procesio_cli/agents/procesio/handlers/guidance.py +36 -0
  48. procesio_cli/agents/procesio/handlers/status.py +33 -0
  49. procesio_cli/agents/procesio/handlers/verify.py +39 -0
  50. procesio_cli/agents/procesio/knowledge.py +115 -0
  51. procesio_cli/agents/procesio/main.py +89 -0
  52. procesio_cli/agents/procesio/tests/__init__.py +0 -0
  53. procesio_cli/agents/procesio/tests/conftest.py +62 -0
  54. procesio_cli/agents/procesio/tests/test_audit.py +91 -0
  55. procesio_cli/agents/procesio/tests/test_checklist.py +28 -0
  56. procesio_cli/agents/procesio/tests/test_guidance.py +78 -0
  57. procesio_cli/agents/procesio/tests/test_manifest_sync.py +48 -0
  58. procesio_cli/agents/procesio/tests/test_verify.py +134 -0
  59. procesio_cli/agents/procesio/tests/test_workspace_scope.py +97 -0
  60. procesio_cli/agents/procesio/verifylib.py +222 -0
  61. procesio_cli/dashboard/README.md +117 -0
  62. procesio_cli/dashboard/__init__.py +18 -0
  63. procesio_cli/dashboard/serve.py +98 -0
  64. procesio_cli/dashboard/server/__init__.py +1 -0
  65. procesio_cli/dashboard/server/config_schemas.py +92 -0
  66. procesio_cli/dashboard/server/google.py +103 -0
  67. procesio_cli/dashboard/server/handler.py +160 -0
  68. procesio_cli/dashboard/server/inventory.py +213 -0
  69. procesio_cli/dashboard/server/jobs.py +118 -0
  70. procesio_cli/dashboard/server/llmtest.py +181 -0
  71. procesio_cli/dashboard/server/procesio_env.py +94 -0
  72. procesio_cli/dashboard/server/routes.py +74 -0
  73. procesio_cli/dashboard/server/runner.py +150 -0
  74. procesio_cli/dashboard/server/security.py +29 -0
  75. procesio_cli/dashboard/server/setup.py +211 -0
  76. procesio_cli/dashboard/server/validate.py +152 -0
  77. procesio_cli/dashboard/tests/conftest.py +16 -0
  78. procesio_cli/dashboard/tests/test_dashboard.py +225 -0
  79. procesio_cli/dashboard/tests/test_procesio_env.py +159 -0
  80. procesio_cli/dashboard/web/actions.js +274 -0
  81. procesio_cli/dashboard/web/api.js +79 -0
  82. procesio_cli/dashboard/web/app.js +385 -0
  83. procesio_cli/dashboard/web/copilot.js +72 -0
  84. procesio_cli/dashboard/web/google.js +121 -0
  85. procesio_cli/dashboard/web/index.html +67 -0
  86. procesio_cli/dashboard/web/procesio_env.js +187 -0
  87. procesio_cli/dashboard/web/styles.css +207 -0
  88. procesio_cli/registry.py +370 -0
  89. procesio_cli/scripts/build-router.py +249 -0
  90. procesio_cli/scripts/build-tool-skill.py +202 -0
  91. procesio_cli/scripts/check-requirements.py +131 -0
  92. procesio_cli/scripts/check-skill-governance.py +174 -0
  93. procesio_cli/scripts/evaluate-skill-routing.py +217 -0
  94. procesio_cli/scripts/evaluate-skills.py +316 -0
  95. procesio_cli/scripts/get-skill.py +122 -0
  96. procesio_cli/scripts/list-skills.py +68 -0
  97. procesio_cli/scripts/list-tools.py +73 -0
  98. procesio_cli/scripts/run-agent.py +59 -0
  99. procesio_cli/scripts/run-tool.py +123 -0
  100. procesio_cli/scripts/secret_scan.py +584 -0
  101. procesio_cli/scripts/set-credential.py +126 -0
  102. procesio_cli/scripts/validate-skills.py +530 -0
  103. procesio_cli/skills/PORTFOLIO.md +134 -0
  104. procesio_cli/skills/__init__.py +6 -0
  105. procesio_cli/skills/agent-skill-engineer/SKILL.md +226 -0
  106. procesio_cli/skills/agent-skill-engineer/evals/evals.json +422 -0
  107. procesio_cli/skills/agent-skill-engineer/references/authoring-standard.md +178 -0
  108. procesio_cli/skills/agent-skill-engineer/references/decision-framework.md +107 -0
  109. procesio_cli/skills/agent-skill-engineer/references/domain-evidence-protocol.md +248 -0
  110. procesio_cli/skills/agent-skill-engineer/references/evaluation-standard.md +191 -0
  111. procesio_cli/skills/agent-skill-engineer/references/expert-lenses.md +167 -0
  112. procesio_cli/skills/agent-skill-engineer/references/field-gate-standard.md +231 -0
  113. procesio_cli/skills/agent-skill-engineer/references/optimization-protocol.md +233 -0
  114. procesio_cli/skills/agent-skill-engineer/references/optimizer-contract.md +268 -0
  115. procesio_cli/skills/agent-skill-engineer/references/portability-standard.md +99 -0
  116. procesio_cli/skills/agent-skill-engineer/references/research-basis.md +128 -0
  117. procesio_cli/skills/agent-skill-engineer/references/review-standard.md +143 -0
  118. procesio_cli/skills/agent-skill-engineer/scripts/audit_skill.py +959 -0
  119. procesio_cli/skills/agent-skill-engineer/scripts/optimize_skill.py +891 -0
  120. procesio_cli/skills/agent-skill-engineer/scripts/scaffold_skill.py +397 -0
  121. procesio_cli/skills/evals/baseline-catalog.json +14 -0
  122. procesio_cli/skills/evals/baseline-routing-v2.json +38 -0
  123. procesio_cli/skills/evals/baseline.json +37 -0
  124. procesio_cli/skills/evals/behavioral.json +367 -0
  125. procesio_cli/skills/evals/field-boundary-development-v1.json +126 -0
  126. procesio_cli/skills/evals/field-closeout-correction-development-v1.json +23 -0
  127. procesio_cli/skills/evals/field-closeout-development-v1.json +89 -0
  128. procesio_cli/skills/evals/portfolio-pressure-training-v1.json +83 -0
  129. procesio_cli/skills/evals/routing.json +363 -0
  130. procesio_cli/skills/evals/validation-baseline.json +4 -0
  131. procesio_cli/skills/procesio-cli/SKILL.md +134 -0
  132. procesio_cli/skills/procesio-cli/evals/evals.json +111 -0
  133. procesio_cli/skills/procesio-cli/evals/workflows.json +16 -0
  134. procesio_cli/skills/procesio-cli/references/connector-lifecycle.md +47 -0
  135. procesio_cli/skills/procesio-cli/references/credentials-admin.md +113 -0
  136. procesio_cli/skills/procesio-cli/references/data-verification.md +71 -0
  137. procesio_cli/skills/procesio-cli/references/documents-files.md +44 -0
  138. procesio_cli/skills/procesio-cli/references/form-e2e.md +57 -0
  139. procesio_cli/skills/procesio-cli/references/operation-contract.md +138 -0
  140. procesio_cli/skills/procesio-cli/references/process-debugging.md +65 -0
  141. procesio_cli/skills/procesio-cli/references/process-lifecycle.md +88 -0
  142. procesio_cli/skills/procesio-cli/references/schedules-webhooks.md +58 -0
  143. procesio_cli/skills/procesio-cli/references/transport-environments.md +53 -0
  144. procesio_cli/skills/procesio-cli-maintainer/SKILL.md +84 -0
  145. procesio_cli/skills/procesio-cli-maintainer/evals/evals.json +116 -0
  146. procesio_cli/skills/procesio-cli-maintainer/references/change-contract.md +34 -0
  147. procesio_cli/skills/procesio-cli-maintainer/references/mcp-compatibility.md +13 -0
  148. procesio_cli/skills/procesio-cli-maintainer/references/skill-authoring.md +51 -0
  149. procesio_cli/skills/procesio-platform-advisor/SKILL.md +82 -0
  150. procesio_cli/skills/procesio-platform-advisor/evals/evals.json +116 -0
  151. procesio_cli/skills/procesio-platform-advisor/references/capability-map.md +22 -0
  152. procesio_cli/skills/procesio-platform-advisor/references/fit-framework.md +35 -0
  153. procesio_cli/skills/procesio-platform-advisor/references/freshness-policy.md +25 -0
  154. procesio_cli/skills/procesio-platform-advisor/references/sizing-method.md +70 -0
  155. procesio_cli/skills/procesio-platform-advisor/scripts/estimate_capacity.py +99 -0
  156. procesio_cli/skills/procesio-setup/SKILL.md +180 -0
  157. procesio_cli/skills/sql-server-optimizer/SKILL.md +86 -0
  158. procesio_cli/skills/sql-server-optimizer/evals/evals.json +116 -0
  159. procesio_cli/skills/sql-server-optimizer/references/db-context.md +44 -0
  160. procesio_cli/skills/sql-server-optimizer/references/generic-mode.md +32 -0
  161. procesio_cli/skills/sql-server-optimizer/references/procesio-mode.md +40 -0
  162. procesio_cli/skills/sql-server-optimizer/references/sql-rules.md +43 -0
  163. procesio_cli/skills/sql-server-optimizer/scripts/export-indexes.sql +178 -0
  164. procesio_cli/skills/sql-server-optimizer/scripts/export-procs-and-functions.sql +118 -0
  165. procesio_cli/skills/sql-server-optimizer/scripts/export-tables.sql +367 -0
  166. procesio_cli/skills/tests/__init__.py +0 -0
  167. procesio_cli/skills/tests/test_agent_skill_engineer.py +240 -0
  168. procesio_cli/skills/tests/test_auth_failure_stop.py +25 -0
  169. procesio_cli/skills/tests/test_capacity_estimator.py +85 -0
  170. procesio_cli/skills/tests/test_field_boundary_learning.py +100 -0
  171. procesio_cli/skills/tests/test_field_closeout_learning.py +123 -0
  172. procesio_cli/skills/tests/test_field_gate_standard.py +76 -0
  173. procesio_cli/skills/tests/test_operational_playbooks.py +51 -0
  174. procesio_cli/skills/tests/test_portfolio_pressure_training.py +35 -0
  175. procesio_cli/skills/tests/test_process_lifecycle_single_run.py +25 -0
  176. procesio_cli/skills/tests/test_skill_evaluator.py +67 -0
  177. procesio_cli/skills/tests/test_skill_optimizer.py +473 -0
  178. procesio_cli/skills/tests/test_skill_portfolio_review.py +70 -0
  179. procesio_cli/skills/tests/test_skill_release_binding.py +204 -0
  180. procesio_cli/skills/tests/test_skill_routing.py +74 -0
  181. procesio_cli/skills/tests/test_skill_scaffold_v2.py +116 -0
  182. procesio_cli/skills/tests/test_validate_skills.py +115 -0
  183. procesio_cli/tools/__init__.py +0 -0
  184. procesio_cli/tools/_lib/README.md +119 -0
  185. procesio_cli/tools/_lib/__init__.py +0 -0
  186. procesio_cli/tools/_lib/accounting.py +120 -0
  187. procesio_cli/tools/_lib/contacts.py +544 -0
  188. procesio_cli/tools/_lib/creds.py +83 -0
  189. procesio_cli/tools/_lib/creds_backends.py +578 -0
  190. procesio_cli/tools/_lib/dbprofiles.py +147 -0
  191. procesio_cli/tools/_lib/dbquery.py +286 -0
  192. procesio_cli/tools/_lib/dbschema.py +225 -0
  193. procesio_cli/tools/_lib/io.py +54 -0
  194. procesio_cli/tools/_lib/manifest.py +297 -0
  195. procesio_cli/tools/_lib/skill_release.py +127 -0
  196. procesio_cli/tools/_lib/skill_resources.py +118 -0
  197. procesio_cli/tools/_lib/userdata.py +228 -0
  198. procesio_cli/tools/_lib/webserialize/__init__.py +16 -0
  199. procesio_cli/tools/_lib/webserialize/admin.py +61 -0
  200. procesio_cli/tools/_lib/webserialize/client.py +264 -0
  201. procesio_cli/tools/_lib/webserialize/config.py +96 -0
  202. procesio_cli/tools/_lib/webserialize/errors.py +27 -0
  203. procesio_cli/tools/_lib/webserialize/framing.py +45 -0
  204. procesio_cli/tools/_lib/webserialize/registry.py +47 -0
  205. procesio_cli/tools/_lib/webserialize/runtime.py +61 -0
  206. procesio_cli/tools/_lib/webserialize/server.py +510 -0
  207. procesio_cli/tools/_lib/websession.py +194 -0
  208. procesio_cli/tools/connector-builder/CONNECTOR-BUILDER-API-NOTES.md +91 -0
  209. procesio_cli/tools/connector-builder/README.md +101 -0
  210. procesio_cli/tools/connector-builder/SKILL.md +248 -0
  211. procesio_cli/tools/connector-builder/__init__.py +7 -0
  212. procesio_cli/tools/connector-builder/actiondef.py +24 -0
  213. procesio_cli/tools/connector-builder/client.py +251 -0
  214. procesio_cli/tools/connector-builder/errors.py +44 -0
  215. procesio_cli/tools/connector-builder/gen_manifest.py +142 -0
  216. procesio_cli/tools/connector-builder/handlers/__init__.py +1 -0
  217. procesio_cli/tools/connector-builder/handlers/admin.py +182 -0
  218. procesio_cli/tools/connector-builder/handlers/auth.py +74 -0
  219. procesio_cli/tools/connector-builder/handlers/builds.py +396 -0
  220. procesio_cli/tools/connector-builder/handlers/common.py +104 -0
  221. procesio_cli/tools/connector-builder/handlers/files.py +111 -0
  222. procesio_cli/tools/connector-builder/handlers/raw.py +38 -0
  223. procesio_cli/tools/connector-builder/handlers/telemetry.py +39 -0
  224. procesio_cli/tools/connector-builder/main.py +94 -0
  225. procesio_cli/tools/connector-builder/tests/conftest.py +146 -0
  226. procesio_cli/tools/connector-builder/tests/test_cb_client.py +86 -0
  227. procesio_cli/tools/connector-builder/tests/test_cb_dispatch.py +105 -0
  228. procesio_cli/tools/connector-builder/tests/test_cb_manifest_sync.py +76 -0
  229. procesio_cli/tools/connector-builder/tests/test_cb_wait.py +123 -0
  230. procesio_cli/tools/connector-builder/tool.yaml +671 -0
  231. procesio_cli/tools/framework-map/.gitattributes +2 -0
  232. procesio_cli/tools/framework-map/README.md +98 -0
  233. procesio_cli/tools/framework-map/SKILL.md +30 -0
  234. procesio_cli/tools/framework-map/app.js +188 -0
  235. procesio_cli/tools/framework-map/fm_builder.py +476 -0
  236. procesio_cli/tools/framework-map/fm_catalog.py +19 -0
  237. procesio_cli/tools/framework-map/fm_ro_catalog.py +94 -0
  238. procesio_cli/tools/framework-map/fm_strings.py +101 -0
  239. procesio_cli/tools/framework-map/main.py +95 -0
  240. procesio_cli/tools/framework-map/styles.css +214 -0
  241. procesio_cli/tools/framework-map/tests/conftest.py +33 -0
  242. procesio_cli/tools/framework-map/tests/test_fm_build.py +126 -0
  243. procesio_cli/tools/framework-map/tests/test_fm_manifest_sync.py +63 -0
  244. procesio_cli/tools/framework-map/tests/test_fm_store_tree.py +75 -0
  245. procesio_cli/tools/framework-map/tool.yaml +61 -0
  246. procesio_cli/tools/mysql/MOVED-TO-CENTRAL.md +29 -0
  247. procesio_cli/tools/mysql/README.md +196 -0
  248. procesio_cli/tools/mysql/SKILL.md +37 -0
  249. procesio_cli/tools/mysql/__init__.py +0 -0
  250. procesio_cli/tools/mysql/connection.py +191 -0
  251. procesio_cli/tools/mysql/main.py +487 -0
  252. procesio_cli/tools/mysql/profiles.template.json +1 -0
  253. procesio_cli/tools/mysql/schema.py +434 -0
  254. procesio_cli/tools/mysql/tests/__init__.py +0 -0
  255. procesio_cli/tools/mysql/tests/conftest.py +21 -0
  256. procesio_cli/tools/mysql/tests/test_manifest_sync.py +68 -0
  257. procesio_cli/tools/mysql/tests/test_mysql.py +201 -0
  258. procesio_cli/tools/mysql/tests/test_mysql_schema.py +337 -0
  259. procesio_cli/tools/mysql/tool.yaml +112 -0
  260. procesio_cli/tools/procesio/DTO-SUBTOOLS-NOTE.md +360 -0
  261. procesio_cli/tools/procesio/FORM-DEV-GUIDE/00-INDEX.md +67 -0
  262. procesio_cli/tools/procesio/FORM-DEV-GUIDE/01-ANATOMY.md +209 -0
  263. procesio_cli/tools/procesio/FORM-DEV-GUIDE/02-CODE-INJECTION.md +309 -0
  264. procesio_cli/tools/procesio/FORM-DEV-GUIDE/03-DOM-CONTRACT.md +370 -0
  265. procesio_cli/tools/procesio/FORM-DEV-GUIDE/04-INTERACTION-RECIPES.md +600 -0
  266. procesio_cli/tools/procesio/FORM-DEV-GUIDE/05-STEPPER-AND-MOTION.md +426 -0
  267. procesio_cli/tools/procesio/FORM-DEV-GUIDE/06-PROCESS-INTEGRATION.md +347 -0
  268. procesio_cli/tools/procesio/FORM-DEV-GUIDE/07-DEPLOY-WORKFLOW.md +294 -0
  269. procesio_cli/tools/procesio/FORM-DEV-GUIDE/08-PITFALLS.md +569 -0
  270. procesio_cli/tools/procesio/FORM-DEV-GUIDE/09-NAVIGATION-AND-HOSTING.md +308 -0
  271. procesio_cli/tools/procesio/PHASE4-E2E-NOTES.md +594 -0
  272. procesio_cli/tools/procesio/PROCESIO-API-CORRECTIONS.md +295 -0
  273. procesio_cli/tools/procesio/PROCESIO-API-NOTES.md +6976 -0
  274. procesio_cli/tools/procesio/PROCESIO-AUTH-NOTES.md +226 -0
  275. procesio_cli/tools/procesio/PROCESIO-CARD-BUILD-NOTES.md +183 -0
  276. procesio_cli/tools/procesio/PROCESIO-CONNECTORS-NOTES.md +141 -0
  277. procesio_cli/tools/procesio/PROCESIO-CUSTOM-ACTION-NOTES.md +179 -0
  278. procesio_cli/tools/procesio/PROCESIO-DOCS-FIX-REPORT.md +123 -0
  279. procesio_cli/tools/procesio/PROCESIO-ENVIRONMENTS-NOTES.md +94 -0
  280. procesio_cli/tools/procesio/PROCESIO-FE-VALIDATION-NOTES.md +107 -0
  281. procesio_cli/tools/procesio/PROCESIO-FOREACH-NOTES.md +199 -0
  282. procesio_cli/tools/procesio/PROCESIO-FORM-API-HANG-NOTE.md +101 -0
  283. procesio_cli/tools/procesio/PROCESIO-FORM-SUBMISSION-NOTES.md +172 -0
  284. procesio_cli/tools/procesio/PROCESIO-HTML-TO-DOCX-NOTES.md +110 -0
  285. procesio_cli/tools/procesio/PROCESIO-INSTANCE-HISTORY-NOTES.md +242 -0
  286. procesio_cli/tools/procesio/PROCESIO-METERING-NOTES.md +201 -0
  287. procesio_cli/tools/procesio/PROCESIO-NODE-CODE-NOTES.md +279 -0
  288. procesio_cli/tools/procesio/PROCESIO-NODE-MODULE-WHITELIST.md +113 -0
  289. procesio_cli/tools/procesio/PROCESIO-PYTHON-ACTION-NOTES.md +165 -0
  290. procesio_cli/tools/procesio/PROCESIO-QUERY-STORE-NOTES.md +826 -0
  291. procesio_cli/tools/procesio/PROCESIO-RECONCILIATION-PATTERNS.md +104 -0
  292. procesio_cli/tools/procesio/PROCESIO-RESOURCE-MODEL-NOTES.md +1100 -0
  293. procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-CRED-OPTIONALITY.md +45 -0
  294. procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-NOTES.md +252 -0
  295. procesio_cli/tools/procesio/PROCESIO-SQL-ACTIONS-NOTES.md +284 -0
  296. procesio_cli/tools/procesio/PROCESIO-USAGE-GUIDE.md +219 -0
  297. procesio_cli/tools/procesio/README.md +341 -0
  298. procesio_cli/tools/procesio/SCHEDULE-INPUT-SECURITY-NOTES.md +63 -0
  299. procesio_cli/tools/procesio/SKILL.md +694 -0
  300. procesio_cli/tools/procesio/__init__.py +1 -0
  301. procesio_cli/tools/procesio/actiondef.py +27 -0
  302. procesio_cli/tools/procesio/assets/html2docx/html2docx.js +2155 -0
  303. procesio_cli/tools/procesio/auth.py +354 -0
  304. procesio_cli/tools/procesio/autogen.py +121 -0
  305. procesio_cli/tools/procesio/client.py +355 -0
  306. procesio_cli/tools/procesio/config.py +96 -0
  307. procesio_cli/tools/procesio/data/endpoints.json +2901 -0
  308. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/01-authentication.md +180 -0
  309. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/02-conventions.md +116 -0
  310. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/ANONYMOUS-SURFACE.md +51 -0
  311. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/README.md +104 -0
  312. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/SYMBOL-INDEX.md +444 -0
  313. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/03-auth-users-workspaces.md +731 -0
  314. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/04-processes.md +913 -0
  315. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/05-actions.md +605 -0
  316. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/06-files.md +237 -0
  317. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/07-forms-documents.md +985 -0
  318. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/08-credentials.md +532 -0
  319. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/09-datastore-datatypes.md +830 -0
  320. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/10-custom-urls.md +319 -0
  321. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/11-subscriptions-resources-analytics.md +455 -0
  322. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/12-webhooks-notifications-misc.md +519 -0
  323. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/13-realtime-signalr.md +153 -0
  324. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/99-internal-and-other-services.md +52 -0
  325. procesio_cli/tools/procesio/docs_info/FormBuilder mock.ts +5725 -0
  326. procesio_cli/tools/procesio/docs_info/Procesio Platform Actions.json +30219 -0
  327. procesio_cli/tools/procesio/docs_info/form-config-enums.ts +92 -0
  328. procesio_cli/tools/procesio/docs_info/form-theme.ts +1603 -0
  329. procesio_cli/tools/procesio/docs_info/process-validation-reference-1.md +2739 -0
  330. procesio_cli/tools/procesio/dto/__init__.py +13 -0
  331. procesio_cli/tools/procesio/dto/credential/builder.py +179 -0
  332. procesio_cli/tools/procesio/dto/credential/config.schema.json +19 -0
  333. procesio_cli/tools/procesio/dto/credential/description.md +193 -0
  334. procesio_cli/tools/procesio/dto/credential/fixtures/rest.config.json +11 -0
  335. procesio_cli/tools/procesio/dto/credential/fixtures/rest.dto.json +28 -0
  336. procesio_cli/tools/procesio/dto/credential/fixtures/rest.template.json +44 -0
  337. procesio_cli/tools/procesio/dto/credential/template.dto.json +16 -0
  338. procesio_cli/tools/procesio/dto/data/_refresh.py +147 -0
  339. procesio_cli/tools/procesio/dto/data/action_catalog.json +30825 -0
  340. procesio_cli/tools/procesio/dto/data/action_families.json +55 -0
  341. procesio_cli/tools/procesio/dto/data/platform_types.json +182 -0
  342. procesio_cli/tools/procesio/dto/datatype/builder.py +223 -0
  343. procesio_cli/tools/procesio/dto/datatype/config.schema.json +47 -0
  344. procesio_cli/tools/procesio/dto/datatype/description.md +85 -0
  345. procesio_cli/tools/procesio/dto/datatype/fixtures/customer.config.json +41 -0
  346. procesio_cli/tools/procesio/dto/datatype/fixtures/customer.dto.json +164 -0
  347. procesio_cli/tools/procesio/dto/datatype/template.dto.json +37 -0
  348. procesio_cli/tools/procesio/dto/document/builder.py +193 -0
  349. procesio_cli/tools/procesio/dto/document/config.schema.json +33 -0
  350. procesio_cli/tools/procesio/dto/document/description.md +124 -0
  351. procesio_cli/tools/procesio/dto/document/fixtures/invoice.config.json +16 -0
  352. procesio_cli/tools/procesio/dto/document/fixtures/invoice.dto.json +32 -0
  353. procesio_cli/tools/procesio/dto/document/template.dto.json +14 -0
  354. procesio_cli/tools/procesio/dto/form/FORM-STYLING-NOTES.md +142 -0
  355. procesio_cli/tools/procesio/dto/form/GOLDEN-DRIFT-NOTES.md +72 -0
  356. procesio_cli/tools/procesio/dto/form/RUN-PROCESS-RESULT-NOTES.md +80 -0
  357. procesio_cli/tools/procesio/dto/form/addelement.py +277 -0
  358. procesio_cli/tools/procesio/dto/form/builder.py +1009 -0
  359. procesio_cli/tools/procesio/dto/form/capture_goldens.py +106 -0
  360. procesio_cli/tools/procesio/dto/form/code_cipher.py +67 -0
  361. procesio_cli/tools/procesio/dto/form/config.schema.json +76 -0
  362. procesio_cli/tools/procesio/dto/form/data_shell.json +1 -0
  363. procesio_cli/tools/procesio/dto/form/description.md +346 -0
  364. procesio_cli/tools/procesio/dto/form/elements/approval.json +259 -0
  365. procesio_cli/tools/procesio/dto/form/elements/assignee.json +137 -0
  366. procesio_cli/tools/procesio/dto/form/elements/button.json +125 -0
  367. procesio_cli/tools/procesio/dto/form/elements/chart.json +341 -0
  368. procesio_cli/tools/procesio/dto/form/elements/chat.json +199 -0
  369. procesio_cli/tools/procesio/dto/form/elements/checkbox.json +153 -0
  370. procesio_cli/tools/procesio/dto/form/elements/column.json +77 -0
  371. procesio_cli/tools/procesio/dto/form/elements/columns.json +78 -0
  372. procesio_cli/tools/procesio/dto/form/elements/datetime-input.json +304 -0
  373. procesio_cli/tools/procesio/dto/form/elements/divider.json +54 -0
  374. procesio_cli/tools/procesio/dto/form/elements/dropdown.json +130 -0
  375. procesio_cli/tools/procesio/dto/form/elements/dynamic-table-row.json +253 -0
  376. procesio_cli/tools/procesio/dto/form/elements/file-upload.json +196 -0
  377. procesio_cli/tools/procesio/dto/form/elements/file-viewer.json +169 -0
  378. procesio_cli/tools/procesio/dto/form/elements/heading.json +79 -0
  379. procesio_cli/tools/procesio/dto/form/elements/icon.json +107 -0
  380. procesio_cli/tools/procesio/dto/form/elements/image.json +174 -0
  381. procesio_cli/tools/procesio/dto/form/elements/input.json +206 -0
  382. procesio_cli/tools/procesio/dto/form/elements/list.json +202 -0
  383. procesio_cli/tools/procesio/dto/form/elements/number-input.json +202 -0
  384. procesio_cli/tools/procesio/dto/form/elements/paragraph.json +79 -0
  385. procesio_cli/tools/procesio/dto/form/elements/radiobox.json +174 -0
  386. procesio_cli/tools/procesio/dto/form/elements/section.json +114 -0
  387. procesio_cli/tools/procesio/dto/form/elements/select.json +217 -0
  388. procesio_cli/tools/procesio/dto/form/elements/side-panel.json +146 -0
  389. procesio_cli/tools/procesio/dto/form/elements/signature-pad.json +141 -0
  390. procesio_cli/tools/procesio/dto/form/elements/static-table-row.json +84 -0
  391. procesio_cli/tools/procesio/dto/form/elements/step.json +105 -0
  392. procesio_cli/tools/procesio/dto/form/elements/stepper.json +126 -0
  393. procesio_cli/tools/procesio/dto/form/elements/tab.json +77 -0
  394. procesio_cli/tools/procesio/dto/form/elements/table.json +279 -0
  395. procesio_cli/tools/procesio/dto/form/elements/tabs.json +114 -0
  396. procesio_cli/tools/procesio/dto/form/elements/textarea.json +213 -0
  397. procesio_cli/tools/procesio/dto/form/enum_map.json +68 -0
  398. procesio_cli/tools/procesio/dto/form/fieldpath.py +284 -0
  399. procesio_cli/tools/procesio/dto/form/fixtures/reg.config.json +32 -0
  400. procesio_cli/tools/procesio/dto/form/fixtures/reg.elements.json +638 -0
  401. procesio_cli/tools/procesio/dto/form/sync_from_mock.py +386 -0
  402. procesio_cli/tools/procesio/dto/framework.py +125 -0
  403. procesio_cli/tools/procesio/dto/process/builder.py +1991 -0
  404. procesio_cli/tools/procesio/dto/process/config.schema.json +159 -0
  405. procesio_cli/tools/procesio/dto/process/description.md +218 -0
  406. procesio_cli/tools/procesio/dto/process/fixtures/greet.config.json +32 -0
  407. procesio_cli/tools/procesio/dto/process/fixtures/greet.dto.json +317 -0
  408. procesio_cli/tools/procesio/dto/process/naming.py +305 -0
  409. procesio_cli/tools/procesio/dto/process/normalize.py +74 -0
  410. procesio_cli/tools/procesio/dto/process/template.dto.json +32 -0
  411. procesio_cli/tools/procesio/dto/refdata.py +87 -0
  412. procesio_cli/tools/procesio/dto/registry.py +27 -0
  413. procesio_cli/tools/procesio/dto/webhook/builder.py +142 -0
  414. procesio_cli/tools/procesio/dto/webhook/config.schema.json +25 -0
  415. procesio_cli/tools/procesio/dto/webhook/description.md +92 -0
  416. procesio_cli/tools/procesio/dto/webhook/fixtures/order.config.json +10 -0
  417. procesio_cli/tools/procesio/dto/webhook/fixtures/order.dto.json +25 -0
  418. procesio_cli/tools/procesio/dto/webhook/template.dto.json +14 -0
  419. procesio_cli/tools/procesio/environments.py +264 -0
  420. procesio_cli/tools/procesio/errors.py +166 -0
  421. procesio_cli/tools/procesio/flowmodel/README.md +37 -0
  422. procesio_cli/tools/procesio/flowmodel/__init__.py +14 -0
  423. procesio_cli/tools/procesio/flowmodel/digest.py +223 -0
  424. procesio_cli/tools/procesio/flowmodel/families.py +34 -0
  425. procesio_cli/tools/procesio/flowmodel/fevalidation.py +1098 -0
  426. procesio_cli/tools/procesio/flowmodel/formdigest.py +232 -0
  427. procesio_cli/tools/procesio/flowmodel/inspect.py +78 -0
  428. procesio_cli/tools/procesio/flowmodel/model.py +82 -0
  429. procesio_cli/tools/procesio/flowmodel/nodeparam.py +871 -0
  430. procesio_cli/tools/procesio/flowmodel/reader.py +191 -0
  431. procesio_cli/tools/procesio/flowmodel/sqlparam.py +410 -0
  432. procesio_cli/tools/procesio/form_code_keys.py +50 -0
  433. procesio_cli/tools/procesio/formlint.py +292 -0
  434. procesio_cli/tools/procesio/gen_manifest.py +118 -0
  435. procesio_cli/tools/procesio/handlers/__init__.py +1 -0
  436. procesio_cli/tools/procesio/handlers/auth_actions.py +103 -0
  437. procesio_cli/tools/procesio/handlers/catalog.py +147 -0
  438. procesio_cli/tools/procesio/handlers/common.py +90 -0
  439. procesio_cli/tools/procesio/handlers/customaction_ops.py +146 -0
  440. procesio_cli/tools/procesio/handlers/datastore_ops.py +482 -0
  441. procesio_cli/tools/procesio/handlers/datatype_ops.py +275 -0
  442. procesio_cli/tools/procesio/handlers/dto_actions.py +258 -0
  443. procesio_cli/tools/procesio/handlers/environment_admin.py +146 -0
  444. procesio_cli/tools/procesio/handlers/fevalidate.py +236 -0
  445. procesio_cli/tools/procesio/handlers/files.py +141 -0
  446. procesio_cli/tools/procesio/handlers/flowgraph.py +229 -0
  447. procesio_cli/tools/procesio/handlers/flowlint.py +269 -0
  448. procesio_cli/tools/procesio/handlers/form_chains.py +336 -0
  449. procesio_cli/tools/procesio/handlers/form_code.py +277 -0
  450. procesio_cli/tools/procesio/handlers/form_element.py +199 -0
  451. procesio_cli/tools/procesio/handlers/form_events.py +441 -0
  452. procesio_cli/tools/procesio/handlers/form_update.py +270 -0
  453. procesio_cli/tools/procesio/handlers/formprocess.py +211 -0
  454. procesio_cli/tools/procesio/handlers/generic.py +135 -0
  455. procesio_cli/tools/procesio/handlers/layout.py +137 -0
  456. procesio_cli/tools/procesio/handlers/nodeparams.py +1018 -0
  457. procesio_cli/tools/procesio/handlers/process_layout.py +189 -0
  458. procesio_cli/tools/procesio/handlers/process_naming.py +213 -0
  459. procesio_cli/tools/procesio/handlers/processes.py +416 -0
  460. procesio_cli/tools/procesio/handlers/profile_admin.py +184 -0
  461. procesio_cli/tools/procesio/handlers/resource_ops.py +447 -0
  462. procesio_cli/tools/procesio/handlers/schedules.py +320 -0
  463. procesio_cli/tools/procesio/handlers/sqlactions.py +232 -0
  464. procesio_cli/tools/procesio/handlers/transport.py +463 -0
  465. procesio_cli/tools/procesio/handlers/usageguide.py +222 -0
  466. procesio_cli/tools/procesio/layout/README.md +196 -0
  467. procesio_cli/tools/procesio/layout/__init__.py +11 -0
  468. procesio_cli/tools/procesio/layout/adapter.py +736 -0
  469. procesio_cli/tools/procesio/layout/cycles.py +186 -0
  470. procesio_cli/tools/procesio/layout/dispatch.py +39 -0
  471. procesio_cli/tools/procesio/layout/elk/elk_runner.mjs +50 -0
  472. procesio_cli/tools/procesio/layout/elk/package-lock.json +21 -0
  473. procesio_cli/tools/procesio/layout/elk/package.json +11 -0
  474. procesio_cli/tools/procesio/layout/elk_engine.py +568 -0
  475. procesio_cli/tools/procesio/layout/engine.py +1311 -0
  476. procesio_cli/tools/procesio/layout/report.py +187 -0
  477. procesio_cli/tools/procesio/main.py +179 -0
  478. procesio_cli/tools/procesio/profiles.py +193 -0
  479. procesio_cli/tools/procesio/reliability.py +193 -0
  480. procesio_cli/tools/procesio/sqlformat.py +167 -0
  481. procesio_cli/tools/procesio/swagger.py +51 -0
  482. procesio_cli/tools/procesio/tests/__init__.py +0 -0
  483. procesio_cli/tools/procesio/tests/conftest.py +129 -0
  484. procesio_cli/tools/procesio/tests/test_auth.py +200 -0
  485. procesio_cli/tools/procesio/tests/test_autogen.py +78 -0
  486. procesio_cli/tools/procesio/tests/test_builder_attrpath_sqlbind.py +180 -0
  487. procesio_cli/tools/procesio/tests/test_builder_custom_action_catalog.py +72 -0
  488. procesio_cli/tools/procesio/tests/test_client.py +114 -0
  489. procesio_cli/tools/procesio/tests/test_client_reliability.py +139 -0
  490. procesio_cli/tools/procesio/tests/test_customaction.py +103 -0
  491. procesio_cli/tools/procesio/tests/test_customaction_test.py +80 -0
  492. procesio_cli/tools/procesio/tests/test_cycles.py +69 -0
  493. procesio_cli/tools/procesio/tests/test_datastore.py +378 -0
  494. procesio_cli/tools/procesio/tests/test_datastore_node.py +94 -0
  495. procesio_cli/tools/procesio/tests/test_dispatch.py +170 -0
  496. procesio_cli/tools/procesio/tests/test_document_page_size.py +19 -0
  497. procesio_cli/tools/procesio/tests/test_dto.py +734 -0
  498. procesio_cli/tools/procesio/tests/test_edit_dryrun_preview.py +96 -0
  499. procesio_cli/tools/procesio/tests/test_elk_layout.py +221 -0
  500. procesio_cli/tools/procesio/tests/test_environments.py +214 -0
  501. procesio_cli/tools/procesio/tests/test_fevalidate_gate.py +104 -0
  502. procesio_cli/tools/procesio/tests/test_fevalidation.py +317 -0
  503. procesio_cli/tools/procesio/tests/test_fieldpath_variables.py +87 -0
  504. procesio_cli/tools/procesio/tests/test_files.py +72 -0
  505. procesio_cli/tools/procesio/tests/test_flow_digest.py +202 -0
  506. procesio_cli/tools/procesio/tests/test_flowlint.py +114 -0
  507. procesio_cli/tools/procesio/tests/test_flowmodel.py +158 -0
  508. procesio_cli/tools/procesio/tests/test_form_add_element.py +256 -0
  509. procesio_cli/tools/procesio/tests/test_form_approval_gaps.py +319 -0
  510. procesio_cli/tools/procesio/tests/test_form_auto_names.py +60 -0
  511. procesio_cli/tools/procesio/tests/test_form_chains.py +217 -0
  512. procesio_cli/tools/procesio/tests/test_form_code_actions.py +188 -0
  513. procesio_cli/tools/procesio/tests/test_form_code_keys.py +92 -0
  514. procesio_cli/tools/procesio/tests/test_form_code_style.py +178 -0
  515. procesio_cli/tools/procesio/tests/test_form_delete_element.py +99 -0
  516. procesio_cli/tools/procesio/tests/test_form_element_config.py +141 -0
  517. procesio_cli/tools/procesio/tests/test_form_event_maps.py +135 -0
  518. procesio_cli/tools/procesio/tests/test_form_event_ops.py +376 -0
  519. procesio_cli/tools/procesio/tests/test_form_event_replace.py +86 -0
  520. procesio_cli/tools/procesio/tests/test_form_events.py +92 -0
  521. procesio_cli/tools/procesio/tests/test_form_parity.py +171 -0
  522. procesio_cli/tools/procesio/tests/test_form_select_source.py +74 -0
  523. procesio_cli/tools/procesio/tests/test_form_sync.py +35 -0
  524. procesio_cli/tools/procesio/tests/test_form_update.py +133 -0
  525. procesio_cli/tools/procesio/tests/test_formlint.py +155 -0
  526. procesio_cli/tools/procesio/tests/test_formlint_css_scope.py +38 -0
  527. procesio_cli/tools/procesio/tests/test_formlint_field_names.py +83 -0
  528. procesio_cli/tools/procesio/tests/test_guards.py +110 -0
  529. procesio_cli/tools/procesio/tests/test_hidden_setting_types.py +39 -0
  530. procesio_cli/tools/procesio/tests/test_html2docx_asset.py +132 -0
  531. procesio_cli/tools/procesio/tests/test_key_handle_terminology.py +45 -0
  532. procesio_cli/tools/procesio/tests/test_layout.py +574 -0
  533. procesio_cli/tools/procesio/tests/test_layout_report.py +88 -0
  534. procesio_cli/tools/procesio/tests/test_manifest_sync.py +68 -0
  535. procesio_cli/tools/procesio/tests/test_nodedelete.py +151 -0
  536. procesio_cli/tools/procesio/tests/test_nodeparam.py +826 -0
  537. procesio_cli/tools/procesio/tests/test_normalize.py +70 -0
  538. procesio_cli/tools/procesio/tests/test_payload_docs.py +86 -0
  539. procesio_cli/tools/procesio/tests/test_process_action_naming.py +170 -0
  540. procesio_cli/tools/procesio/tests/test_process_call_api_seed.py +46 -0
  541. procesio_cli/tools/procesio/tests/test_process_ext.py +373 -0
  542. procesio_cli/tools/procesio/tests/test_process_invariants.py +183 -0
  543. procesio_cli/tools/procesio/tests/test_process_layout.py +117 -0
  544. procesio_cli/tools/procesio/tests/test_process_naming.py +188 -0
  545. procesio_cli/tools/procesio/tests/test_process_query_store.py +172 -0
  546. procesio_cli/tools/procesio/tests/test_processinfo_variable.py +56 -0
  547. procesio_cli/tools/procesio/tests/test_profiles.py +127 -0
  548. procesio_cli/tools/procesio/tests/test_put_projects.py +41 -0
  549. procesio_cli/tools/procesio/tests/test_reliability.py +107 -0
  550. procesio_cli/tools/procesio/tests/test_removal_gate.py +95 -0
  551. procesio_cli/tools/procesio/tests/test_resource_ops.py +173 -0
  552. procesio_cli/tools/procesio/tests/test_save_validity.py +207 -0
  553. procesio_cli/tools/procesio/tests/test_schedule_cron_shape.py +111 -0
  554. procesio_cli/tools/procesio/tests/test_schedules.py +309 -0
  555. procesio_cli/tools/procesio/tests/test_sqlconvert.py +234 -0
  556. procesio_cli/tools/procesio/tests/test_sqlformat.py +83 -0
  557. procesio_cli/tools/procesio/tests/test_sqlparam.py +187 -0
  558. procesio_cli/tools/procesio/tests/test_superseded_actions.py +54 -0
  559. procesio_cli/tools/procesio/tests/test_surgical_concurrency.py +156 -0
  560. procesio_cli/tools/procesio/tests/test_tier4.py +123 -0
  561. procesio_cli/tools/procesio/tests/test_transport.py +147 -0
  562. procesio_cli/tools/procesio/tests/test_transport_data_stores.py +168 -0
  563. procesio_cli/tools/procesio/tests/test_transport_mapper_repair.py +150 -0
  564. procesio_cli/tools/procesio/tests/test_transport_webhook_strip.py +253 -0
  565. procesio_cli/tools/procesio/tests/test_usage_guide.py +96 -0
  566. procesio_cli/tools/procesio/tool.yaml +12486 -0
  567. procesio_cli/tools/sqlserver/MOVED-TO-CENTRAL.md +29 -0
  568. procesio_cli/tools/sqlserver/README.md +192 -0
  569. procesio_cli/tools/sqlserver/SKILL.md +37 -0
  570. procesio_cli/tools/sqlserver/SQLSERVER-SCHEMA-NOTES.md +284 -0
  571. procesio_cli/tools/sqlserver/__init__.py +0 -0
  572. procesio_cli/tools/sqlserver/connection.py +242 -0
  573. procesio_cli/tools/sqlserver/main.py +521 -0
  574. procesio_cli/tools/sqlserver/profiles.template.json +1 -0
  575. procesio_cli/tools/sqlserver/schema.py +600 -0
  576. procesio_cli/tools/sqlserver/tests/__init__.py +0 -0
  577. procesio_cli/tools/sqlserver/tests/conftest.py +21 -0
  578. procesio_cli/tools/sqlserver/tests/test_connection.py +75 -0
  579. procesio_cli/tools/sqlserver/tests/test_dbprofiles.py +92 -0
  580. procesio_cli/tools/sqlserver/tests/test_dbquery.py +220 -0
  581. procesio_cli/tools/sqlserver/tests/test_manifest_sync.py +68 -0
  582. procesio_cli/tools/sqlserver/tests/test_sqlserver.py +326 -0
  583. procesio_cli/tools/sqlserver/tests/test_sqlserver_schema.py +488 -0
  584. procesio_cli/tools/sqlserver/tool.yaml +123 -0
  585. procesio_cli/tools/web/README.md +381 -0
  586. procesio_cli/tools/web/SKILL.md +37 -0
  587. procesio_cli/tools/web/WEB-AUTOMATION-NOTES.md +277 -0
  588. procesio_cli/tools/web/__init__.py +21 -0
  589. procesio_cli/tools/web/actiondef.py +24 -0
  590. procesio_cli/tools/web/api.py +444 -0
  591. procesio_cli/tools/web/brokered.py +107 -0
  592. procesio_cli/tools/web/driver.py +839 -0
  593. procesio_cli/tools/web/drivercontract.py +44 -0
  594. procesio_cli/tools/web/errors.py +54 -0
  595. procesio_cli/tools/web/handlers/__init__.py +1 -0
  596. procesio_cli/tools/web/handlers/archive.py +367 -0
  597. procesio_cli/tools/web/handlers/browse.py +182 -0
  598. procesio_cli/tools/web/handlers/contacts.py +74 -0
  599. procesio_cli/tools/web/handlers/sessmgmt.py +120 -0
  600. procesio_cli/tools/web/main.py +128 -0
  601. procesio_cli/tools/web/sessions.py +253 -0
  602. procesio_cli/tools/web/steps.py +162 -0
  603. procesio_cli/tools/web/tests/__init__.py +0 -0
  604. procesio_cli/tools/web/tests/conftest.py +197 -0
  605. procesio_cli/tools/web/tests/test_api.py +330 -0
  606. procesio_cli/tools/web/tests/test_archive.py +190 -0
  607. procesio_cli/tools/web/tests/test_brokered.py +138 -0
  608. procesio_cli/tools/web/tests/test_dispatch.py +132 -0
  609. procesio_cli/tools/web/tests/test_errors.py +60 -0
  610. procesio_cli/tools/web/tests/test_manifest_sync.py +76 -0
  611. procesio_cli/tools/web/tests/test_page_contacts.py +68 -0
  612. procesio_cli/tools/web/tests/test_sessions.py +145 -0
  613. procesio_cli/tools/web/tests/test_steps.py +210 -0
  614. procesio_cli/tools/web/tool.yaml +184 -0
  615. procesio_cli/tools/xlsx/README.md +34 -0
  616. procesio_cli/tools/xlsx/SKILL.md +28 -0
  617. procesio_cli/tools/xlsx/__init__.py +0 -0
  618. procesio_cli/tools/xlsx/main.py +129 -0
  619. procesio_cli/tools/xlsx/reader.py +91 -0
  620. procesio_cli/tools/xlsx/tests/__init__.py +0 -0
  621. procesio_cli/tools/xlsx/tests/conftest.py +39 -0
  622. procesio_cli/tools/xlsx/tests/test_xlsx.py +103 -0
  623. procesio_cli/tools/xlsx/tool.yaml +30 -0
  624. procesio_cli/webplatform/aat_mcp/AAT-MCP-NOTES.md +244 -0
  625. procesio_cli/webplatform/aat_mcp/README.md +78 -0
  626. procesio_cli/webplatform/aat_mcp/bridge.py +705 -0
  627. procesio_cli/webplatform/aat_mcp/chat_server.py +194 -0
  628. procesio_cli/webplatform/aat_mcp/chat_surface.snapshot.json +668 -0
  629. procesio_cli/webplatform/aat_mcp/chat_surface.yaml +372 -0
  630. procesio_cli/webplatform/aat_mcp/gate.py +68 -0
  631. procesio_cli/webplatform/aat_mcp/http_server.py +139 -0
  632. procesio_cli/webplatform/aat_mcp/protocol.py +175 -0
  633. procesio_cli/webplatform/aat_mcp/server.py +306 -0
  634. procesio_cli/webplatform/aat_mcp/tests/conftest.py +8 -0
  635. procesio_cli/webplatform/aat_mcp/tests/test_aat_mcp.py +255 -0
  636. procesio_cli/webplatform/aat_mcp/tests/test_chat_surface.py +247 -0
  637. procesio_cli/webplatform/aat_mcp/tests/test_discovery.py +489 -0
  638. procesio_cli/webplatform/aat_mcp/tests/test_multiuser.py +86 -0
  639. procesio_cli/webplatform/aat_mcp/tests/test_progressive_discovery.py +89 -0
  640. procesio_cli/webplatform/aat_mcp/tests/test_protocol.py +180 -0
  641. procesio_cli/webplatform/aat_mcp/tests/test_skill_discovery.py +23 -0
  642. procesio_cli-0.1.1.dist-info/METADATA +467 -0
  643. procesio_cli-0.1.1.dist-info/RECORD +647 -0
  644. procesio_cli-0.1.1.dist-info/WHEEL +4 -0
  645. procesio_cli-0.1.1.dist-info/entry_points.txt +7 -0
  646. procesio_cli-0.1.1.dist-info/licenses/LICENSE +201 -0
  647. procesio_cli-0.1.1.dist-info/licenses/NOTICE +5 -0
@@ -0,0 +1,569 @@
1
+ # 08 — Pitfalls: symptom → cause → rule
2
+
3
+ Every one of these was found by breaking something real. Scan the **symptom**
4
+ column first; that is how you will meet them.
5
+
6
+ ---
7
+
8
+ ## Runtime / JavaScript
9
+
10
+ ### The code works on first load, then stops
11
+ **Cause.** Listeners and observers were declared in the form-level JS scope. That
12
+ scope is a throwaway sandbox iframe, destroyed and rebuilt on every re-trigger.
13
+ **Rule.** Anything that must outlive one run is injected once into
14
+ `window.parent.document`. Installer + runtime, two layers, two guards
15
+ ([02](02-CODE-INJECTION.md) §4).
16
+
17
+ ### Doubled toasts / doubled ripples / the process launches twice
18
+ **Cause.** The file re-ran and installed a second copy of everything.
19
+ **Rule.** Guard the installer on a DOM id **and** the payload on a `window` flag.
20
+ Every DOM-touching function marks its work with a `data-*` attribute or an injected
21
+ child, and returns early if the mark is there.
22
+
23
+ ### `querySelector` finds nothing, but the element is clearly on screen
24
+ **Cause.** You are querying the sandbox iframe's `document`, not the page's.
25
+ **Rule.** The runtime lives in the parent document; inside it, `document` is
26
+ correct. From the installer scope it is not.
27
+
28
+ ### Something is processed on first render and never again
29
+ **Cause.** Processed nodes were remembered in a `Set`. The renderer destroyed them
30
+ and made new ones; the set is full of corpses.
31
+ **Rule.** Never track nodes across a rebuild. Mark the node itself, and recompute
32
+ everything from the current DOM on every pass.
33
+
34
+ ### `refresh()` runs dozens of times per frame during a step change
35
+ **Cause.** The MutationObserver fires per mutation; a step change makes dozens.
36
+ **Rule.** Coalesce with a `pending` flag + `requestAnimationFrame`.
37
+
38
+ ### An attribute rewrite feeds your own MutationObserver in a loop
39
+ **Cause.** Writing the attribute unconditionally on every pass.
40
+ **Rule.** Compare before writing: `if (next !== current) { set(next); }`.
41
+
42
+ ---
43
+
44
+ ## Visibility and state
45
+
46
+ ### An entire step renders completely blank
47
+ **Cause.** A class that sets `opacity: 0` was removed only in response to an
48
+ observed DOM mutation — and that mutation did not arrive (or the observer's target
49
+ had been replaced). Measured: `at200 opacity=0.002 → at1500 opacity=0`, never
50
+ lifting.
51
+ **Rule.** **A visual state must never depend on an event that may not come.** Lift
52
+ it on a timer. Clear it by sweeping `all('.leaving')` rather than a held node
53
+ reference, because the renderer may have swapped the container.
54
+
55
+ ### The loader veil never lifts and the form is unusable
56
+ **Cause.** Dismissal was tied to a network call that failed or a quiet-timer that
57
+ never settled.
58
+ **Rule.** Every veil has a **hard ceiling** in both modes, and when the ceiling
59
+ fires the user is told what to do instead ([05](05-STEPPER-AND-MOTION.md) §5).
60
+
61
+ ### The next button can never be reached
62
+ **Cause.** Readiness counted hidden fields. A field that is gated can never be
63
+ filled, so the gate never opens.
64
+ **Rule.** Only `el.offsetParent !== null` fields count toward readiness.
65
+
66
+ ### A field is invisible but Tab still lands in it
67
+ **Cause.** Hidden with `visibility: hidden` or `opacity: 0`.
68
+ **Rule.** `display: none !important`. A control you can reach but cannot see is a
69
+ worse bug than a visible one.
70
+
71
+ ### Hiding a button leaves an empty row
72
+ **Cause.** The button was hidden, not its element wrapper.
73
+ **Rule.** Hide `b.closest('.form-builder--element')`.
74
+
75
+ ### Buttons belonging to a later view are visible on a fresh load
76
+ **Cause.** The form's own logic hides them inside a click handler that has never run.
77
+ **Rule.** Gate on an observable phase, e.g. "the stepper is on screen".
78
+
79
+ ### The native form shows for about a second before any script runs
80
+ **Cause.** The renderer draws the form first and runs the form-load event about a
81
+ second later (measured: 1.0 s on a live form). Every script sits behind an event,
82
+ including the `Data.code` JavaScript, which the front end injects as a form event. So
83
+ no script, however small or early in the list, can hide anything from the first frame.
84
+ Setting `visible = false` from a load script is no faster, and it removes the node from
85
+ the page within milliseconds ([01](01-ANATOMY.md) §4), which breaks any field a script
86
+ reads or clicks in the DOM.
87
+ **Rule.** Make the form presentable without its scripts. The first element is a plain
88
+ line that says what is loading; hidden helper fields come after it. If something must be
89
+ invisible from the first frame, the form-level CSS in `Data.code` is the only surface
90
+ applied at render that can hide it. Per-element `style` takes only theme variables
91
+ ([01](01-ANATOMY.md) §4), and writing `Data.code` needs the right key
92
+ ([07](07-DEPLOY-WORKFLOW.md) §2).
93
+
94
+ ---
95
+
96
+ ## Values and Vue
97
+
98
+ ### Writing `info-text` from the field model does nothing at all
99
+ **Cause.** The runtime renders `info-text` from the element's STATIC config array, not
100
+ from the reactive field object, so assigning `infoText` on
101
+ `ProcesioForm.data.fields.<name>` changes nothing on screen, and no
102
+ `setConfigValue`-style API is exposed to form JS. (The field object itself is wider
103
+ than `value`, `visible`, `required` and `readonly`: on a select built through the API it
104
+ carried 15 properties, `label` and `placeholder` among them. What it carries follows the
105
+ form's data model; see *A script reads a select's options and gets nothing*.)
106
+ **Rule.** Drive live text — counters, running totals, quota hints — by writing the DOM
107
+ node. Note that when `info-text` is empty the message component is never rendered at all
108
+ (`v-if` on a truthy value), so there is no node to write into: either set a non-empty
109
+ `info-text` in the designer, or create the node yourself.
110
+ See [`../dto/form/description.md`](../dto/form/description.md) for the selector details —
111
+ the control's DOM `id` equals its `name` config and sits on the `.pds-c-input-group`
112
+ wrapper, not on the `<input>`.
113
+
114
+ ### A field looks filled and submits empty
115
+ **Cause.** `input.value` / `input.checked` was set directly. The renderer is
116
+ Vue-bound and never saw it.
117
+ **Rule.** Click the real control. If you must write, dispatch `input` **and**
118
+ `change` with `bubbles: true`.
119
+
120
+ ### Clearing a radio group immediately re-selects the same option
121
+ **Cause.** A `change` event was re-dispatched after clearing. The Vue handler reads
122
+ the option's value and re-selects it.
123
+ **Rule.** Clear the model (`window.ProcesioForm.data.fields`, guarded) and the DOM
124
+ state, and dispatch nothing.
125
+
126
+ ### Every field-matching function silently returns null, on every field
127
+ **Cause.** The form's inputs carry an **empty `label` config** — their visible label
128
+ is a separate `paragraph` element sitting above each one, which is a common way to
129
+ build a form whose labels need styling the control does not offer. The label-matching
130
+ handle then has nothing to match on: `.pds-c-input-group--label` is absent and the
131
+ control's own `textContent` is empty (a placeholder is an attribute, not text). Found
132
+ on a live form where an entire step's gating had never once executed, with no error
133
+ anywhere and no visible symptom other than the feature simply not happening.
134
+ **Rule.** Before building anything on label matching, **check that the labels exist**
135
+ — one `querySelectorAll('.pds-c-input-group--label')` on the rendered form answers it.
136
+ When they do not, fall back to an **element-id → field-name map generated from the
137
+ DTO**, say in a comment where it came from and how to regenerate it, and keep the rest
138
+ of the code speaking names. Ids are the weaker handle, but a weak handle that resolves
139
+ beats a strong one that returns null.
140
+
141
+ ### A feature "does nothing" and no error is ever logged
142
+ **Cause.** A lookup returned null and every caller guarded it with `if (!key) return;`.
143
+ Defensive early-returns turn a wiring failure into silence.
144
+ **Rule.** When a mapping function can legitimately return null for SOME nodes, assert
145
+ that it resolves for **at least one** — a `console.warn` when a whole pass resolves
146
+ zero fields would have caught the above on first load.
147
+
148
+ ### The wrong field gets a value / a label match hits the wrong control
149
+ **Cause.** A substring label match, ordered shortest-first. `'id — series'` matches
150
+ inside `'id representative — series'`.
151
+ **Rule.** Order the label table **most specific first**, and normalize diacritics
152
+ and case on both sides of every comparison.
153
+
154
+ ---
155
+
156
+ ### A button has to be clicked twice before its MAP_FORM_DATA reacts
157
+ **Cause.** A JS block wrote a value (for example a validation flag) and a MAP
158
+ condition later in the SAME chain reads it. `input`/`number-input` values reach the
159
+ form model 500 ms after the DOM write (`onInputDebounced`), so the MAP sees the
160
+ value from before the click. The second click works only because the first one's
161
+ value has landed by then. Verified live, with a MAP that never saw the value its
162
+ own chain had written.
163
+ **Rule.** Never branch a MAP on a value the same chain's JS just wrote. Hand off
164
+ through a field's own `onInput` chain instead: [04](04-INTERACTION-RECIPES.md) §16.
165
+
166
+ ### A programmatic click on another form button, from inside a chain, does nothing
167
+ **Cause.** While a button's chain runs the form is locked: every element is
168
+ `disabled`, and a disabled button ignores the click. The stepper's Next/Previous
169
+ are not form elements and still respond.
170
+ **Rule.** Do not chain one button into another. Trigger the follow-up through a
171
+ field's `onInput` chain ([04](04-INTERACTION-RECIPES.md) §16), or click the stepper.
172
+
173
+ ### A MAP guarded by `<variable> IS_TRUE` runs although the variable is "false"
174
+ **Cause.** The designer stores a Boolean form variable's default as TEXT (`"False"`
175
+ or `"false"`), and a condition treats any non-empty text as true. Measured live:
176
+ text `"false"` → `IS_TRUE` passes and `IS_FALSE` fails; `null` → the opposite. Two
177
+ mutually exclusive branches both run, and a load gated on `isConfirmed IS_TRUE`
178
+ runs for every visitor. A render process that later writes a real boolean does not
179
+ help a condition evaluated before its result lands.
180
+ **Rule.** Do not branch or gate on a Boolean form variable with `IS_TRUE`/`IS_FALSE`.
181
+ Branch on a value that really is text (`EQUALS` on a select's value, or on a field
182
+ your own flow writes), or give the variable a `null` default. And a condition in
183
+ the browser is never access control: re-check the user inside the process.
184
+ `formlint` flags the pattern.
185
+
186
+ ### A MAP that writes a field also runs that field's handlers, at once
187
+ **Cause.** A value set by MAP_FORM_DATA (or by a process outputMap) reaches the
188
+ element with no debounce and fires its `onInputEvents` chain immediately, in
189
+ parallel with the chain that wrote it. JS blocks of concurrent chains share one
190
+ sandbox iframe, so they can cancel each other.
191
+ **Rule.** A field that must trigger logic is written by exactly one party. Keep
192
+ flags that MAPs reset apart from the field that triggers work.
193
+
194
+ ### A script reads a select's options and gets nothing
195
+ **Cause.** Two gaps, both silent. On a form built through the API before 2026-10-01, the
196
+ select's field object has no `sourceType` and no `sourceValue`: `form-create` wrote them
197
+ as element configs but left them out of the form's data model, and only data-model
198
+ attributes reach `ProcesioForm`. A save in the designer adds them, and `form-create` and
199
+ `form-add-element` now write them too, for a static option list. The page is no fallback either:
200
+ the option nodes are not drawn until the list is opened once (none before, the
201
+ options after). A local replica that draws its own select hides both gaps, so the list is fine
202
+ in every test and empty on the live form.
203
+ **Rule.** On a form built or rebuilt since then, read a static list from the field's
204
+ `sourceValue`, through a lookup that ignores case and separators. For an older form, a
205
+ JSON or URL source (whose shape was never captured, so the builder leaves it out), or a
206
+ list the page has to supply, hand the script the list directly: write it in at build
207
+ time, or return it from a process call the form already makes. Opening the select from
208
+ code so that it draws works, but it leans on markup and timing. Spec and the one
209
+ remaining live check: `todo/procesio-form-create-select-source-in-data-model.md`.
210
+
211
+ ### Field reads that worked stop working after a designer save
212
+ **Cause.** A form built through the API keeps its field names exactly as written, and
213
+ `ProcesioForm.data.fields` is keyed by them. A save in the designer re-keys them: it
214
+ splits each name on underscores, lowercases the parts and joins them in camelCase, so
215
+ `orderList` becomes `orderlist` and `order_id` becomes `orderId`. A read that
216
+ worked for weeks returns `undefined` the first time anyone saves the form in the
217
+ designer, and a lowercase snake_case name is not safe either.
218
+ **Rule.** Read fields through a lookup that ignores case and separators
219
+ ([`../dto/form/description.md`](../dto/form/description.md)). Only a name that is a single
220
+ lowercase word survives a designer save unchanged. `form-create`, `form-edit` and
221
+ `form-update` return a warning naming every field a designer save would re-key, and
222
+ what it would become. They never rename: scripts in use read the names as built. When no name is given, the builder generates a single lowercase word from the label, so auto-named fields are safe by default; only a name you set yourself can trip the warning.
223
+ **Why it happens, and the 2026-10-05 fix.** The re-key is the designer's legacy format
224
+ `"0"`, which it applies to a form with no `dataModelAttributeFormatVersion`; under `"1"` (what
225
+ the designer writes for its own new forms) it keeps every name as written. The builder wrote
226
+ no version until 2026-10-05 and now writes `"1"`, so a form built since then keeps
227
+ `orderList`, `order_id` and `Customer_First_Name` through a designer save (measured on QA,
228
+ read back by form JS) and draws no warning. The lookup above is still right for a script that
229
+ may run on an older form.
230
+
231
+ ### A designer save changes far more than the edit you made
232
+ **Cause.** Saving in the designer rewrites the whole definition. On an API-built form, one
233
+ save with no edit at all re-keyed the field names (above), added an encrypted `Data.code`
234
+ blob, gave every element a `class` config, replaced the theme layout, swapped `type` for
235
+ `rows` on text fields and removed `disabledIfFormIsInvalid` from buttons. The form-load
236
+ scripts survived it.
237
+ **Rule.** Treat a designer save of an API-built form as a migration: export the definition
238
+ before and after and diff them, rerun the form's live checks, and Publish. Better still,
239
+ change API-built forms only through the builder.
240
+
241
+ ## Mapping and processes
242
+
243
+ ### `[object Object]` lands in every field
244
+ **Cause.** A structured variable was mapped as a whole, or the row's `path`
245
+ attribute chain was dropped during a rewrite. The form side's path shape is typed
246
+ `any` in the renderer — it is **not derivable** and cannot be guessed correctly.
247
+ **Rule.** Eliminate paths: one process output variable per field, all primitives,
248
+ split by small Node actions ([06](06-PROCESS-INTEGRATION.md) §4).
249
+
250
+ ### The designer shows raw guids and the launch 400s
251
+ **Cause.** A variable **name** on the left of a map row. The API accepts it.
252
+ **Rule.** The process-variable GUID goes on the left, always. Let
253
+ `form-set-element-event` resolve names — it fails before writing if one is unknown.
254
+
255
+ ### The designer cannot render a mapping row you wrote via the API
256
+ **Cause.** The sides were written as bare strings.
257
+ **Rule.** Each side is an object: `{value, isList, path}`, with `path: {}` on the
258
+ process side and `path: null` on the form side.
259
+
260
+ ### The process runs but the outputMap populates nothing
261
+ **Cause.** `syncRun: false` — the form fired and forgot.
262
+ **Rule.** `syncRun: true`. Verified to hold the line open across a multi-second
263
+ external call.
264
+ **Observed timing with `syncRun: false` (2026-10-22, FORM_LOAD and click chains):** the
265
+ renderer still launched with `runSynchronous=false`, waited for the completion notice, then
266
+ read `GET /api/formProcess/{form}/{process}/{instance}/variables`, and only then ran the next
267
+ event of the same chain. So a "hide the loader" script placed after the RUN_PROCESS runs once
268
+ the result is in, not right after the launch.
269
+
270
+ ### A signature-pad value mapped to a File input fails at launch
271
+ **Symptom.** The click chain runs (publish, upload and launch all return 200), the form
272
+ unlocks, and nothing else happens. The instance shows 0 actions consumed and
273
+ `Error while building input model: Invalid variable value for the mandatory input file property.`
274
+ **Seen** once, on a duplicated form whose signature pad fed a `File` process input (the
275
+ upload itself succeeded; the stored value was `{id, elementId, name, file: {}, path, …}`).
276
+ Not yet checked on an original, non-duplicated form.
277
+ **Rule.** Before relying on a signature pad → File mapping, run the real chain once and check
278
+ the instance's actions. Give the form a visible failure path: a UI that only reacts to the
279
+ success output leaves the signer looking at a button that did nothing.
280
+
281
+ ### The process launches twice per interaction
282
+ **Cause.** Two `RUN_PROCESS` events on the same trigger.
283
+ **Rule.** One event per trigger; rewire with `--replace`.
284
+
285
+ ### A Node action is rejected at save time
286
+ **Cause.** `Timeout` outside 60–300, or a superseded action (`Call API v3`).
287
+ **Rule.** `Timeout` 60–300; use `Call API` with `Response Status` / `Response Body`
288
+ / `Time Out`. Remember `Node` returns raw while `Javascript` wraps as `{result: v}`.
289
+
290
+ ### Fields come back empty but the call succeeded (status 200, valid body)
291
+ **Cause.** Extraction quality — the model returned mostly nulls for a partially
292
+ legible document. Not a wiring failure.
293
+ **Rule.** Carry a `warning_status` / `warning_message` pair out of the process so
294
+ the form can tell the two apart, and never throw inside a parse Node — return a
295
+ diagnosable object.
296
+
297
+ ### A file variable is rejected
298
+ **Cause.** `file` is not a type.
299
+ **Rule.** Use the `FileDataModel` model.
300
+
301
+ ---
302
+
303
+ ## CSS
304
+
305
+ ### The page will not scroll; the bottom of the form is unreachable
306
+ **Cause.** `overflow: hidden` on `.form-builder--form`.
307
+ **Rule.** Never. Clip with a **background** instead — backgrounds honour
308
+ `border-radius` for free.
309
+
310
+ ### The pinned footer lands on top of the content
311
+ **Cause.** A `transform` on `.form-builder--form` made the card the containing block
312
+ for `position: fixed` descendants.
313
+ **Rule.** Animate the card's `opacity` only. No `transform`, `filter`,
314
+ `perspective`, or `will-change: transform` on the card.
315
+
316
+ ### An animated gradient bar vanishes after the first cycle
317
+ **Cause.** `background-repeat: no-repeat` while animating `background-position` —
318
+ the gradient simply slid away.
319
+ **Rule.** `repeat-x`, gradient starting and ending on the same colour, travel
320
+ exactly one tile per cycle.
321
+
322
+ ### A CSS rule has no effect on the form's own markup
323
+ **Cause.** The form author wrote an inline `style` attribute; an inline declaration
324
+ beats a stylesheet one.
325
+ **Rule.** `!important`, and target it with `[style*="border-left"]`-style attribute
326
+ selectors when the structure is unknown.
327
+
328
+ ### A `<div>` written into a paragraph is not where the CSS expects it
329
+ **Cause.** `Paragraph.component.vue` renders `<p v-html="sanitizeHtml(...)">`, and the
330
+ HTML parser cannot nest a `<div>` inside a `<p>` — the block is hoisted out and lands
331
+ as a SIBLING of an now-empty `<p>`. Selectors written against `p > .my-block` match
332
+ nothing, and the wrapper is `display: flex`, so the hoisted block becomes a flex ITEM
333
+ sized to its content: a centred block sits off to one side of the column it should fill.
334
+ **Rule.** Style the wrapper's children, not the `<p>`:
335
+ `.form-builder--paragraph { align-items: stretch } .form-builder--paragraph > * { flex: 1 1 auto; min-width: 0 }`.
336
+ DOMPurify's defaults keep `class`, `style` and `data-*`, so authored paragraph HTML can
337
+ carry real classes — do that instead of inline styles, which only `!important` can
338
+ override later.
339
+
340
+ ### An `<img>` icon will not take a colour
341
+ **Cause.** The colour is baked into the icon service URL; `color` does nothing and
342
+ `filter` only approximates.
343
+ **Rule.** Rewrite the URL's colour parameter.
344
+
345
+ ### The loader's indicator is invisible on a long form
346
+ **Cause.** It was centred inside a card taller than the viewport, so it sits below
347
+ the fold.
348
+ **Rule.** `position: sticky; top: 40vh` on the inner block.
349
+
350
+ ### A completed-field glow overhangs the next column
351
+ **Cause.** An outer `box-shadow`.
352
+ **Rule.** `inset`.
353
+
354
+ ### A hover lift does nothing on an element that animated in
355
+ **Cause.** The entrance animation used `animation-fill-mode: both`. Its last keyframe
356
+ (`transform: none`) stays applied after the animation ends, and animations beat
357
+ ordinary declarations, `:hover` included.
358
+ **Rule.** Entrances use `backwards`: the "from" state covers the delay, and the element
359
+ returns to its own styles at the end.
360
+
361
+ ### Tiles in a grid overlap or overflow it
362
+ **Cause.** Authored `<a>` / `<button>` tiles with `width: 100%` and padding render with
363
+ `box-sizing: content-box` on this page, so every tile is wider than its grid track.
364
+ **Rule.** Set `box-sizing: border-box` on the component and its descendants. Also check
365
+ that a narrow-screen media query comes after the wider one in the file: a
366
+ `max-width: 480px` rule placed before a `max-width: 760px` rule loses to it on phones.
367
+
368
+ ### The entrance stagger makes a long step take seconds to appear
369
+ **Cause.** An uncapped `nth-child` delay ramp.
370
+ **Rule.** Cap it: `nth-child(n+4) { animation-delay: 180ms; }`.
371
+
372
+ ### A toast appears instantly with no transition
373
+ **Cause.** The class was added in the same frame as the insertion.
374
+ **Rule.** Add it inside `requestAnimationFrame`.
375
+
376
+ ### The dropzone stays stuck in the drag state
377
+ **Cause.** `dragleave` fires on children; targeted removal missed.
378
+ **Rule.** On `dragleave`/`drop`, sweep **all** zones.
379
+
380
+ ---
381
+
382
+ ## Stepper
383
+
384
+ ### A second, native stepper appears next to the custom one
385
+ **Cause.** The platform's nav renders as soon as the stepper's `steps` config names
386
+ the real step elements — which happens the next time the form is saved.
387
+ **Rule.** If you draw your own rail, hide theirs explicitly:
388
+ `.form-builder--stepper--nav { display: none !important; }`.
389
+
390
+ ### The step indicator jumps to a wrong position (e.g. straight to 100%)
391
+ **Cause.** Step detection failed and the code guessed.
392
+ **Rule.** Return `-1` for unknown and **leave the indicator untouched**. Wrong
393
+ information is worse than a stale frame.
394
+
395
+ ### Step detection breaks after a redesign
396
+ **Cause.** Matching on a design-system wrapper class.
397
+ **Rule.** Match on the visible banner text — that text is the form's own content.
398
+
399
+ ### Custom step labels drift from the form's
400
+ **Cause.** A second, hand-maintained list.
401
+ **Rule.** Copy the labels off the platform's nav items before hiding it, and fall
402
+ back to the hard-coded list only if the counts disagree.
403
+
404
+ ### A gated "next" button lets a fast clicker straight through
405
+ **Cause.** Two independent leaks, both measured on a replica:
406
+ 1. the gate was a **class on the button**, and the renderer destroys and recreates the
407
+ nav buttons on every step change — the class is gone by the next click;
408
+ 2. a step change is **not synchronous**. Until the swap lands, `currentStep()` still
409
+ reports the step you just left, so a burst of clicks each read "this step is fine"
410
+ and each advances one step. Three clicks jumped from step 1 to step 4, past two
411
+ ungated steps.
412
+ **Rule.** The class is presentation; **enforce in a capture-phase click listener on
413
+ the document**, recomputing the verdict at click time and calling `stopPropagation()`
414
+ so the platform's own handler never sees it. Add a short lock keyed on the step you
415
+ last advanced FROM, released when `currentStep()` actually changes.
416
+
417
+ ### The gate can never be satisfied because the fields are hidden
418
+ **Cause.** A step hides its fields until some prerequisite (a document read, a lookup)
419
+ arrives, and readiness counts those hidden required fields. If the prerequisite fails,
420
+ the step is unreachable in both directions.
421
+ **Rule.** Whenever a step hides what it also requires, ship the **manual way out in the
422
+ same change** — an always-visible control that opens the fields — not a timeout. A
423
+ toast promising "you can fill these in by hand" over fields that are still hidden is
424
+ worse than no promise.
425
+
426
+ ### The recompute loop stops the moment nobody is looking
427
+ **Cause.** `requestAnimationFrame` does not fire in a **backgrounded or hidden tab**,
428
+ and the recompute loop hangs entirely off it. Harmless for a person (nothing to see),
429
+ but it makes the form look frozen to any automated check — the page renders once and
430
+ never updates, with no error to find.
431
+ **Rule.** Know this before debugging a "form.js stopped working" in a headless or
432
+ side-panel browser. Give the local replica a switch (`?raf=timeout`) that swaps rAF for
433
+ a timer, and drive tests through that. Note that background tabs also throttle
434
+ `setTimeout` heavily, so allow generous waits before concluding anything is broken.
435
+
436
+ ### The page scrolls itself on the very first render
437
+ **Cause.** `scrollIntoView` fired on the initial step assignment.
438
+ **Rule.** Only scroll when `lastStep > -1`.
439
+
440
+ ---
441
+
442
+ ## Deployment
443
+
444
+ ### The form loses all its elements
445
+ **Cause.** `form-edit` (a desired-state editor) was used to change one thing.
446
+ **Rule.** Surgical actions only: `form-set-code`, `form-set-element-event`. Watch
447
+ the `elements` count in every write result.
448
+
449
+ ### `len(None)` / a crash on a form that has never had code
450
+ **Cause.** `{"JAVASCRIPT": null, "CSS": null}` is the designer's **initial** state,
451
+ not a corrupt blob.
452
+ **Rule.** Normalize `null → ""` before any length or concatenation.
453
+
454
+ ### Decryption fails and it is unclear whether the key or the blob is wrong
455
+ **Cause.** Both surface identically as a `UnicodeDecodeError`.
456
+ **Rule.** Round-trip `encrypt_code`/`decrypt_code` with a throwaway key. If that
457
+ works, the blob is fine and the key is wrong. Also check you are not confusing the
458
+ workspace API key with the form-code passphrase — both are short opaque tokens.
459
+
460
+ ### A PUT starts failing for no visible reason
461
+ **Cause.** An unexpected extra field from the GET was echoed back, or camelCase was
462
+ sent where PascalCase is required.
463
+ **Rule.** Map the envelope explicitly (`_PUT_KEYS`), never spread the GET body.
464
+
465
+ ### A fix on the process side breaks a branch that used to work
466
+ **Cause.** It was published straight to the live process.
467
+ **Rule.** Duplicate, change the copy, test the copy, promote. And when something
468
+ does break: revert fully and immediately, then re-approach.
469
+
470
+ ### `form-set-code` succeeds and the form goes blank
471
+ **Cause.** The key stored for that environment is not the one the installation's
472
+ renderer uses. The write encrypts with it anyway; the renderer cannot open the blob, logs
473
+ `Malformed UTF-8 data` and never mounts the form. It is easy to read this as "the CLI
474
+ cannot write form CSS", which is the wrong conclusion. The tool no longer lends the
475
+ default environment's key to another installation, which closes the commonest way in,
476
+ but a wrong key stored under the right name still does this.
477
+ **Rule.** Before the first write on an installation, decrypt the code of a form whose CSS
478
+ was written in the designer there ([07](07-DEPLOY-WORKFLOW.md) §2). If that fails, the
479
+ key is wrong; do not write. `form-set-code --clear` repairs a form already blanked.
480
+
481
+ ### A form answers "Form not found" after someone edited it in the designer
482
+ **Cause.** A designer **Save** without **Publish** turns a published form into a draft,
483
+ and a draft's page answers "Form not found". The draft is not closed, though: its data
484
+ stays reachable through the API, anonymous `rows/filter` included.
485
+ **Rule.** Publish after every designer save, and confirm the status through the API
486
+ (`status` 1 = published, 0 = draft). To take a form offline, make it private or disable
487
+ it. A draft takes the page down and leaves the data up.
488
+
489
+ ### A form takes seconds to open, and much longer at busy times
490
+ **Cause.** The whole definition, scripts included, is sent on every open, uncompressed.
491
+ A 499 KB form took 4 s at good times and up to 20 s at bad ones. Minifying cut the
492
+ script by about a quarter but the form by only 9-15 %, because most of the weight is
493
+ elements and their data model (about 260 KB of them beside 100 KB of script, in one
494
+ case).
495
+ **Rule.** Few hidden helper fields: one request field and one result field per process,
496
+ holding JSON, rather than one field per value. Minify at build time and keep the
497
+ readable source in the repository. Check a form's size before it ships, the way you
498
+ check its contrast.
499
+
500
+ ### The first open on a fresh browser takes most of a minute
501
+ **Cause.** Not the form. On a cold browser the forms site's own stylesheet, about 2 MB,
502
+ took 31-62 s to download in one measurement, while the form and its first process call
503
+ together took about 11 s.
504
+ **Rule.** Before a demo, open each form once on the presenting machine so the platform's
505
+ files are cached. Load the opening view with one process call, not several. Report
506
+ platform slowness with numbers: in the same measurement a neutral CDN served 1 MB in
507
+ about a second.
508
+
509
+ ### Each process call from a form takes three to four seconds
510
+ **Cause.** Every `RUN_PROCESS` from a form went through a platform publish step
511
+ (1.8-3.0 s) before the launch itself (1.2-1.4 s). Calls made one after another add up:
512
+ a view that read three items with one call each spent 16.5 s on them, about half of its
513
+ 31.7 s load.
514
+ **Rule.** Give each view one call that returns everything it needs. Whether the publish
515
+ step can be skipped for a process that has not changed is a question for the platform
516
+ team.
517
+
518
+ ---
519
+
520
+ ## Silent DTO acceptance (the server takes it and says nothing)
521
+
522
+ These are accepted with a 2xx and no error, then cost a debugging session because
523
+ nothing points at them. `form-update` now emits non-blocking **lint** warnings for
524
+ the first three (see `tools/procesio/formlint.py`); the doctrine is in
525
+ `agents/procesio/PROCESIO-API-RELIABILITY-DOCTRINE.md`.
526
+
527
+ ### An element saves fine but renders on NO tab / pane
528
+ **Symptom.** The element exists in the DTO and the PUT succeeds, but it appears on
529
+ no tab — invisible in the rendered form.
530
+ **Cause.** Its `parentId` references no element on the form (a phantom parent). Tab
531
+ and container membership is by `parentId` = a container element's id (§01-ANATOMY);
532
+ a dangling id is silently placed nowhere.
533
+ **Rule.** Point `parentId` at a real container/tab element id, or `null` for a
534
+ top-level element. (Lint: "phantom parent — renders on NO pane".)
535
+
536
+ ### A form-update patch changes nothing, silently
537
+ **Symptom.** `form-update` returns applied, but the form is unchanged.
538
+ **Cause.** The `--data` patch was wrapped as `{"Data": {...}}` (or a top-level key
539
+ was mistyped). The deep-merge adds it as a NEW key inside `Data` — inert junk — and
540
+ never touches the field you meant. Deep-merge also REPLACES arrays wholesale and
541
+ sets `null` rather than deleting.
542
+ **Rule.** Pass the INNER fields directly: `--data '{"hideBranding": true}'`, not
543
+ `--data '{"Data": {"hideBranding": true}}'`. To change one item of an array, pass
544
+ the whole new array. (Lint: "wrapping mistake" / "not an existing Data field".)
545
+
546
+ ### Two elements fight over selectors or process mapping
547
+ **Symptom.** CSS/JS targets the wrong element, or a process input maps from the
548
+ wrong field.
549
+ **Cause.** Two elements share the same `id` or `name` config value.
550
+ **Rule.** Keep every element's `id`/`name` config unique. (Lint: "N elements share
551
+ the same … config".)
552
+
553
+ ### A multi-select maps a list into a single value
554
+ **Symptom.** A `multiple=true` select sends only one value (or a stringified list)
555
+ into a process.
556
+ **Cause.** Its `value` config / mapped data-model attribute is not marked `isList`.
557
+ **Rule.** Set `isList` on the value config / the data-model attribute for any
558
+ multiple-select. (Lint: "multiple-select … not marked isList".)
559
+
560
+ ### Wiring one event on an element wipes the others
561
+ **Symptom.** After adding a click handler, a previously-working handler on the same
562
+ element is gone.
563
+ **Cause.** The write replaced ALL events on the trigger. An element commonly carries
564
+ `[RUN_PROCESS, RUN_JAVASCRIPT]` on one click trigger; a blanket replace discards
565
+ both.
566
+ **Rule.** Replace only the action you mean:
567
+ `form-set-element-event --replace-action RUN_PROCESS` keeps the sibling event in
568
+ order. Bare `--replace` now warns before discarding more than one; append (no flag)
569
+ to add alongside.