ppdr-conversion

Notes

  • 2026-10-30: services/ppdr_conversion.py became the single audited path from in-situ to post-production (entirely-api ea6961b, entirely-portal 6eb2751). convert_project = whole project (review_type raw ‘in_progress’, portal_state ppdr_conversion marker, timeline event, comm log, audit row, scheduler nudge; release_hold clears the five hold fields). set_line_post_production = per-division PPDR on one SOW line, review_type untouched. Surfaces: holding pool (keeps its not-on-hold 409, its job is the release), new POST /portal/projects/{id}/convert-to-ppdr for any project held or not, new POST /portal/projects/{id}/sow/{line}/post-production (the Scope panel 2x chip posts here now, so the flag carries audit attribution), cert_gen PATCH delegates, Friday tools convert_ppdr + flag_post_production, and a ops Slack command lane (services/ppdr_commands.py + ops_command_app.py, fourth Socket Mode app, deterministic regexes, four digit confirm, no LLM, no send authority, idles until OPS_COMMAND_* tokens exist). Friday’s update_field refuses review_type to Desk Review and names convert_ppdr: the label was previously written verbatim and read as nothing downstream, so the 2x rate silently never applied. Slack authorization reads the live portal row, so a portal demotion revokes it.