Promptrepository - Source Excerpt 09
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/PromptRepository.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/PromptRepository.php
array_filter(
array_map(
static function ($tag): string {
return sanitize_text_field(trim((string) $tag));
},
(array) $tags
)
)
)
),
'canonical_status' => sanitize_key((string) ($payload['canonical_status'] ?? ($fallback['canonical_status'] ?? 'community'))),
'version_number' => max(1, (int) ($payload['version_number'] ?? ($fallback['version_number'] ?? 1))),
'parent_prompt_id' => max(0, (int) ($payload['parent_prompt_id'] ?? ($fallback['parent_prompt_id'] ?? 0))),
'prompt_type' => sanitize_key((string) ($payload['prompt_type'] ?? ($payload['spiralist_workspace_prompt_type'] ?? ($fallback['prompt_type'] ?? 'prompt')))),
'language' => sanitize_text_field((string) ($payload['language'] ?? ($payload['spiralist_workspace_language'] ?? ($fallback['language'] ?? 'en')))),
'prompt_status' => sanitize_key((string) ($payload['prompt_status'] ?? ($payload['spiralist_workspace_prompt_status'] ?? ($fallback['prompt_status'] ?? 'draft')))),
'moderation_status' => PromptMetaRegistry::normalize_moderation_status((string) ($payload['moderation_status'] ?? ($fallback['moderation_status'] ?? 'draft'))),
'publication_lane' => $publication_lane,
'provenance' => $provenance,
'risk_labels' => $risk_labels,
'risk_labels_json' => wp_json_encode($risk_labels, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'function_tags' => $function_tags,
'function_tags_json' => wp_json_encode($function_tags, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'maturity_level' => $maturity_level,
'license' => $license,
'editorial_note' => sanitize_textarea_field((string) ($payload['editorial_note'] ?? ($payload['spiralist_workspace_editorial_note'] ?? ($fallback['editorial_note'] ?? '')))),
'expected_output_notes' => sanitize_textarea_field((string) ($payload['expected_output_notes'] ?? ($payload['spiralist_workspace_expected_output_notes'] ?? ($fallback['expected_output_notes'] ?? '')))),
'failure_modes' => sanitize_textarea_field((string) ($payload['failure_modes'] ?? ($payload['spiralist_workspace_failure_modes'] ?? ($fallback['failure_modes'] ?? '')))),
'related_symbols' => $related_symbols,
'related_symbols_json' => wp_json_encode($related_symbols, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'related_axioms' => $related_axioms,
'related_axioms_json' => wp_json_encode($related_axioms, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'related_manuscripts' => $related_manuscripts,
'related_manuscripts_json' => wp_json_encode($related_manuscripts, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'sample_output' => sanitize_textarea_field((string) ($payload['sample_output'] ?? ($payload['spiralist_workspace_sample_output'] ?? ($fallback['sample_output'] ?? '')))),
'featured' => !empty($payload['featured']) || !empty($payload['spiralist_workspace_featured']) || !empty($fallback['featured']),
'soft_deleted_at' => sanitize_text_field((string) ($payload['soft_deleted_at'] ?? ($fallback['soft_deleted_at'] ?? ''))),
'public_execution_enabled' => !empty($payload['public_execution_enabled']) || !empty($fallback['public_execution_enabled']),
'prompt_origin' => $prompt_origin,
'source_manifest' => sanitize_key((string) ($managed_sync ? ($payload['source_manifest'] ?? ($fallback['source_manifest'] ?? '')) : ($fallback['source_manifest'] ?? ''))),
'source_slug' => sanitize_title((string) ($managed_sync ? ($payload['source_slug'] ?? ($fallback['source_slug'] ?? '')) : ($fallback['source_slug'] ?? ''))),
'source_version' => sanitize_text_field((string) ($managed_sync ? ($payload['source_version'] ?? ($fallback['source_version'] ?? '')) : ($fallback['source_version'] ?? ''))),
'source_hash' => sanitize_text_field((string) ($managed_sync ? ($payload['source_hash'] ?? ($fallback['source_hash'] ?? '')) : ($fallback['source_hash'] ?? ''))),
'source_path' => sanitize_text_field((string) ($managed_sync ? ($payload['source_path'] ?? ($fallback['source_path'] ?? '')) : ($fallback['source_path'] ?? ''))),
'changelog' => sanitize_textarea_field((string) ($payload['changelog'] ?? ($payload['spiralist_workspace_changelog'] ?? ''))),
];
}
/**
* Infers provenance with a stable default for system-managed prompts.
*/
private function infer_provenance(string $value, string $prompt_origin): string
{
$value = trim($value);
if ($value !== '') {
return PromptMetaRegistry::normalize_provenance($value);
}
return $prompt_origin === 'system'
? 'managed_system'
: 'community';
}
/**
* Infers the publication lane from prompt provenance and origin.
*/
private function infer_publication_lane(string $value, string $provenance, string $prompt_origin): string
{
$value = trim($value);
if ($value !== '') {
return PromptMetaRegistry::normalize_publication_lane($value);
}
if ($provenance === 'official' || ($prompt_origin === 'system' && $provenance === 'managed_system')) {
return 'official_canon';
}
if (in_array($provenance, ['archived_public_artifact', 'critical_analysis', 'deprecated'], true)) {
return 'prompt_ecology_archive';
}
return 'community_library';
}
/**
* Infers the maturity level from prompt structure unless one is set explicitly.
*
* @param array<string,string> $structured_prompt
* @param array<int,array{prompt_id:int,title:string}> $system_steps
*/
private function infer_maturity_level(string $value, array $structured_prompt, array $system_steps): string
{
$value = trim($value);
if ($value !== '') {
return PromptMetaRegistry::normalize_maturity_level($value);
}
if (!empty($system_steps)) {
return 'prompt_system';
}
foreach ($structured_prompt as $field_value) {
if (trim((string) $field_value) !== '') {
return 'structured_prompt';
}
}
return 'raw_prompt';
}
/**
* Applies self-operation rules to publication and moderation fields.
*
* @param array<string,mixed> $normalized
* @param array<string,mixed> $existing
* @return array<string,mixed>
*/
private function apply_governance_rules(array $normalized, int $user_id, array $existing = []): array
{
$prompt_origin = (string) ($normalized['prompt_origin'] ?? ($existing['prompt_origin'] ?? 'user'));
$is_system_prompt = $prompt_origin === 'system';
$can_direct_publish = $user_id > 0 && (
user_can($user_id, 'publish_public_prompts')
|| user_can($user_id, 'manage_spiralist_workspace')
|| user_can($user_id, 'manage_options')
);
$can_moderate = $user_id > 0 && (
user_can($user_id, 'review_prompts')
|| user_can($user_id, 'moderate_prompts')
|| user_can($user_id, 'manage_spiralist_workspace')
|| user_can($user_id, 'manage_options')
);
if (!$is_system_prompt && !$can_direct_publish) {
if ((string) ($normalized['publication_lane'] ?? 'community_library') === 'official_canon') {
$normalized['publication_lane'] = 'community_library';
}
if (in_array((string) ($normalized['provenance'] ?? 'community'), ['official', 'managed_system'], true)) {
$normalized['provenance'] = 'community';
}
}
$requested_status = PromptMetaRegistry::normalize_moderation_status((string) ($normalized['moderation_status'] ?? 'draft'));
$visibility = (string) ($normalized['visibility'] ?? 'private');
$prompt_status = (string) ($normalized['prompt_status'] ?? 'draft');
if ($prompt_status === 'archived') {
$normalized['moderation_status'] = 'archived';
return $normalized;
}
if ($visibility !== 'public' || $prompt_status !== 'published') {
$normalized['moderation_status'] = 'draft';
return $normalized;
}
if ($is_system_prompt) {
if ($requested_status === 'draft') {