mitai-jinkendo/backend/placeholder_registry_export.py
Lars 645967a2ab
All checks were successful
Deploy Development / deploy (push) Successful in 51s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 15s
feat: Placeholder Registry Framework + Part A Nutrition Metrics
Part A Implementation (Nutrition Basis Metrics):
- Registry-based metadata system (flexible, not hardcoded)
- 4 placeholders registered: kcal_avg, protein_avg, carb_avg, fat_avg
- Evidence-based tagging (code-derived, draft-derived, unresolved, to_verify)
- Single source of truth for all consumers (Prompt, GUI, Export, Validation)

Technical:
- backend/placeholder_registry.py: Core registry framework
- backend/placeholder_registrations/nutrition_part_a.py: Part A registrations
- backend/placeholder_registry_export.py: Export integration
- backend/routers/prompts.py: /placeholders/export-values-extended integration

Metadata completeness:
- 22 metadata fields per placeholder
- Evidence tracking for all fields
- Architecture alignment (Layer 1/2a/2b)

NO LOGIC CHANGE:
- Data Layer unchanged (nutrition_metrics.py)
- Resolver unchanged (placeholder_resolver.py)
- Values identical (only metadata/export enhanced)

Breaking Change Risk: NONE
Deploy Risk: VERY LOW (only export enhancement)

Plan: .claude/task/rework_0b_placeholder/NUTRITION_PART_A_CHANGE_PLAN.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 11:46:16 +02:00

137 lines
4.0 KiB
Python

"""
Placeholder Registry Export Integration
Integrates the new placeholder registry with the existing export system.
Provides backward-compatible export with enhanced metadata from registry.
"""
from typing import Dict, List
from placeholder_registry import get_registry, EvidenceType
def get_registry_metadata_for_export(profile_id: str) -> Dict:
"""
Get metadata from registry formatted for export.
Returns:
Dict with:
- flat: List of all metadata dicts
- by_category: Dict mapping category to list of metadata
- evidence_report: Statistics about evidence types
- validation_report: Validation issues
"""
registry = get_registry()
# Get all metadata
all_metadata = registry.get_all()
# Build flat export
flat = []
for key, metadata in sorted(all_metadata.items()):
meta_dict = metadata.to_dict()
flat.append(meta_dict)
# Build by_category
by_category = {}
for metadata in all_metadata.values():
cat = metadata.category
if cat not in by_category:
by_category[cat] = []
by_category[cat].append(metadata.to_dict())
# Evidence report
evidence_stats = {
"code_derived": len(registry.get_by_evidence_type(EvidenceType.CODE_DERIVED)),
"draft_derived": len(registry.get_by_evidence_type(EvidenceType.DRAFT_DERIVED)),
"mixed": len(registry.get_by_evidence_type(EvidenceType.MIXED)),
"unresolved": len(registry.get_by_evidence_type(EvidenceType.UNRESOLVED)),
"to_verify": len(registry.get_by_evidence_type(EvidenceType.TO_VERIFY))
}
evidence_detail = {
etype.value: registry.get_by_evidence_type(etype)
for etype in EvidenceType
}
# Validation report
validation_issues = registry.validate_all()
return {
"flat": flat,
"by_category": by_category,
"evidence_report": {
"statistics": evidence_stats,
"detail": evidence_detail
},
"validation_report": validation_issues
}
def merge_registry_with_legacy_export(
registry_data: Dict,
legacy_data: Dict,
resolved_values: Dict[str, str]
) -> Dict:
"""
Merge registry metadata with legacy export data.
Args:
registry_data: Data from get_registry_metadata_for_export()
legacy_data: Existing legacy export structure
resolved_values: Resolved placeholder values (key -> value)
Returns:
Merged export with registry enhancements
"""
# Start with legacy structure
merged = legacy_data.copy()
# Add registry metadata section
merged["registry_metadata"] = {
"flat": registry_data["flat"],
"by_category": registry_data["by_category"],
"evidence_report": registry_data["evidence_report"],
"validation_report": registry_data["validation_report"]
}
# Populate runtime values in registry metadata
for meta_dict in merged["registry_metadata"]["flat"]:
key = meta_dict["key"]
if key in resolved_values:
meta_dict["value_display"] = resolved_values[key]
# Note: value_raw extraction can be added here if needed
return merged
def get_enhanced_export_with_registry(profile_id: str, legacy_export: Dict) -> Dict:
"""
Enhance legacy export with registry metadata.
Args:
profile_id: User profile ID
legacy_export: Existing legacy export structure
Returns:
Enhanced export with registry metadata section
"""
# Get registry data
registry_data = get_registry_metadata_for_export(profile_id)
# Get resolved values (for value_display population)
from placeholder_resolver import get_placeholder_example_values
resolved_values = get_placeholder_example_values(profile_id)
cleaned_values = {
key.replace('{{', '').replace('}}', ''): value
for key, value in resolved_values.items()
}
# Merge
enhanced = merge_registry_with_legacy_export(
registry_data,
legacy_export,
cleaned_values
)
return enhanced