renderBlueprintJson function

String renderBlueprintJson({
  1. required String command,
  2. required Blueprint blueprint,
  3. required CompatibilityResult compatibility,
  4. required CompatibilityStatus status,
})

Renders a Blueprint and its compatibility result as stable JSON over the existing envelope (FR-046). The Blueprint contribution is exactly Blueprint.toJson — catalog IDs and structured selections only, never a badge, section order, prompt, or AI conversation text (FR-020, FR-023, FR-024; proven in blueprint_no_presentation_test.dart, T047).

Implementation

String renderBlueprintJson({
  required String command,
  required Blueprint blueprint,
  required CompatibilityResult compatibility,
  required CompatibilityStatus status,
}) {
  final blocked = status == CompatibilityStatus.blocked;
  return renderEnvelope(
    command: command,
    ok: !blocked,
    exitCode: blocked
        ? ExitReporter.blueprintInvalidOrCompatibilityBlocker
        : ExitReporter.success,
    result: {
      'blueprint': blueprint.toJson(),
      'blueprintHash': blueprint.blueprintHash,
      'compatibility': {
        'status': status.name,
        'findings': [
          for (final finding in compatibility.findings)
            {
              'severity': finding.severity.name,
              'code': finding.code,
              'message': finding.message,
            },
        ],
      },
    },
    warnings: [for (final warning in compatibility.warnings) warning.message],
    error: blocked
        ? renderError(
            code: 'COMPATIBILITY_BLOCKER',
            exitCode: ExitReporter.blueprintInvalidOrCompatibilityBlocker,
            message: compatibility.blockers
                .map((finding) => finding.message)
                .join('; '),
          )
        : null,
  );
}