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>
137 lines
4.0 KiB
Python
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
|