feat(prompts): versioned prompt registry, v1 seed, pinning + stamping

Pipeline v2 Phase 1, commit 2/4. Prompt_Registry (read) +
Prompt_Registry_Writer (immutable create/activate/seed) over the new
prompts table; canonical v1 bodies extracted verbatim into
Prompt_Defaults(+Editorial) — single source for BOTH the seed migration
(Migrate_Prompt_Seed_V0180, flag-gated, self-healing) and the in-code
fallback, so a missing table renders byte-identical prompts and never
fatals. Call sites swapped: Content_Prompts, Analysis_Prompts,
Chief_Editor, LLM_Research_Provider. Includes the image-composer seam
keys image.rewriter_system + image.style_template (composer PR consumes,
must not add its own prompt storage).

Pinning: Cost_Tracker::set_run_id() registers the process run context,
ensures the runs ledger row, and pins active versions once per run;
log_api_call/log_image_generation stamp prompt_version (run pins) +
agent_role (stage map) on every generation_log row. Single-pass keeps
stage 'draft' and stamps content.single_pass explicitly.

Under-300 refactors: Content_Generator's four duplicated span/log blocks
consolidated into execute_stage() (301 -> 224 lines, behavior
identical); get_avg_tokens_for_stages body moved to Cost_Reporter with a
delegating wrapper kept for API compatibility.

Tests: byte-identical fallback renders (single_pass/outline/polish/
editor.system), token filling, key coverage incl. stage-map integrity.

Agent-Session: pipeline-v2-phase1-engineer-20260612
This commit is contained in:
peptiderepo
2026-06-11 04:12:32 +00:00
parent 809e7176ad
commit 1b04809092
21 changed files with 1712 additions and 386 deletions

10
includes/models/class-generation-log.php Executable file → Normal file
View File

@@ -26,6 +26,8 @@ class PRAutoBlogger_Generation_Log {
private ?string $request_json;
private string $response_status;
private ?string $error_message;
private ?string $agent_role;
private ?string $prompt_version;
private string $created_at;
/**
@@ -44,6 +46,8 @@ class PRAutoBlogger_Generation_Log {
$this->request_json = $data['request_json'] ?? null;
$this->response_status = $data['response_status'] ?? 'success';
$this->error_message = $data['error_message'] ?? null;
$this->agent_role = $data['agent_role'] ?? null;
$this->prompt_version = isset( $data['prompt_version'] ) ? (string) $data['prompt_version'] : null;
$this->created_at = $data['created_at'] ?? current_time( 'mysql' );
}
@@ -71,6 +75,10 @@ class PRAutoBlogger_Generation_Log {
return $this->response_status; }
public function get_error_message(): ?string {
return $this->error_message; }
public function get_agent_role(): ?string {
return $this->agent_role; }
public function get_prompt_version(): ?string {
return $this->prompt_version; }
public function get_created_at(): string {
return $this->created_at; }
@@ -90,6 +98,8 @@ class PRAutoBlogger_Generation_Log {
'request_json' => $this->request_json,
'response_status' => $this->response_status,
'error_message' => $this->error_message,
'agent_role' => $this->agent_role,
'prompt_version' => $this->prompt_version,
'created_at' => $this->created_at,
);
}