// engine/otel-requirements/trace-requirements.ts — SPEC-044
// Generates acceptance criteria for distributed trace propagation.
/**
 * Generate trace propagation criteria for services with external HTTP clients.
 * Returns an array of acceptance criteria strings (without leading "- [ ]").
 */
export function generateTracePropagationCriteria() {
    return [
        'Todos los HTTP requests salientes incluyen trace context propagado en headers W3C TraceContext (`traceparent`, `tracestate`)',
        'Cada operación de base de datos genera un span con atributos `db.system`, `db.name`, `db.operation` y `db.statement` (sanitizado)',
        'Los errores no manejados se registran como span events con `exception.type`, `exception.message` y `exception.stacktrace`',
    ];
}
/**
 * Generate trace criteria for services with message queue (Kafka, RabbitMQ, SQS, NATS).
 */
export function generateMessageQueueTraceCriteria() {
    return [
        'El producer inyecta W3C TraceContext y Baggage en los headers del mensaje antes de publicar',
        'El consumer extrae el contexto del mensaje y crea un span hijo antes de procesar el payload',
    ];
}
/**
 * Generate structured logging criteria for services with OTel.
 */
export function generateStructuredLogCriteria() {
    return [
        'Todos los log entries incluyen `trace_id` y `span_id` del span OTel activo en el contexto',
        'Los logs de error incluyen el stack trace como campo estructurado (`exception.stacktrace`), no como string concatenado al mensaje',
        'No se usa concatenación de strings para construir mensajes de log — se usa `logger.WithField`/`logger.WithContext` o equivalente del ecosistema',
    ];
}
/**
 * Format criteria as HU.md checkbox lines.
 */
export function formatAsCriteria(criteria) {
    return criteria.map((c) => `- [ ] ${c}`);
}
/**
 * Build the full OTel traces section for a HU.md file.
 */
export function buildOtelTraceSection(hasExternalClients, hasMessageQueue) {
    if (!hasExternalClients && !hasMessageQueue) {
        return [];
    }
    const lines = ['', '## Observabilidad — Traces', ''];
    if (hasExternalClients) {
        lines.push(...formatAsCriteria(generateTracePropagationCriteria()));
        lines.push(...formatAsCriteria(generateStructuredLogCriteria()));
    }
    if (hasMessageQueue) {
        lines.push('');
        lines.push('### Propagación de Contexto — Message Queue');
        lines.push('');
        lines.push(...formatAsCriteria(generateMessageQueueTraceCriteria()));
    }
    return lines;
}
//# sourceMappingURL=trace-requirements.js.map