/**
 * 问题二十七: First Principles — 第一性原理框架。
 *
 * 强制执行:
 * - first principles 不能停留在口号，必须能阻断错误前提和表面修复
 * - high impact 机制变更必须有 fundamental_need
 */
/**
 * 创建第一性原理框架。
 */
export function createFirstPrinciplesFrame(overrides) {
    return {
        fundamental_need: "",
        known_facts: [],
        assumptions: [],
        non_negotiable_constraints: [],
        candidate_solutions: [],
        simplest_viable_solution: "",
        falsification_questions: [],
        chosen_solution: "",
        why_not_legacy_path: "",
        first_principles_status: "insufficient_context",
        ...overrides,
    };
}
/**
 * 执行第一性原理检查。
 * - 验证框架是否有足够上下文
 * - 验证是否包含 fundamental_need
 * - 验证是否有证伪问题
 * - 验证是否选择了最简可行方案
 * - 能阻断错误前提和表面修复
 */
export function performFirstPrinciplesCheck(frame) {
    const failures = [];
    // 必须有 fundamental_need
    if (!frame.fundamental_need) {
        failures.push("缺少 fundamental_need: high impact 变更必须有根本需求描述");
    }
    // 必须有已知事实
    if (frame.known_facts.length === 0) {
        failures.push("缺少 known_facts: 没有事实基础无法进行第一性推理");
    }
    // 必须有假设列表（即使是空的也代表经过了思考）
    // 不强制要求假设数量，但必须显式列出
    // 必须有候选方案
    if (frame.candidate_solutions.length === 0) {
        failures.push("缺少 candidate_solutions: 必须列出候选方案");
    }
    // 必须有最简可行方案
    if (!frame.simplest_viable_solution) {
        failures.push("缺少 simplest_viable_solution: 必须选择最简可行方案");
    }
    // 必须有证伪问题
    if (frame.falsification_questions.length === 0) {
        failures.push("缺少 falsification_questions: 必须能证伪");
    }
    // 必须说明为什么不走老路
    if (!frame.why_not_legacy_path) {
        failures.push("缺少 why_not_legacy_path: 必须解释为什么不沿用现有方案");
    }
    // 检测表面修复: 如果 chosen_solution 与 simplest_viable_solution 不一致
    if (frame.chosen_solution && frame.simplest_viable_solution &&
        frame.chosen_solution !== frame.simplest_viable_solution) {
        // 允许选择更复杂的方案，但需要在假设中说明
        if (frame.assumptions.length === 0) {
            failures.push("选择了非最简方案但缺少假设支撑，可能是表面修复");
        }
    }
    // 阻断错误前提: 已知事实不能包含矛盾
    const contradictions = findContradictions(frame.known_facts, frame.assumptions);
    if (contradictions.length > 0) {
        failures.push(...contradictions);
    }
    return {
        frame,
        passed: failures.length === 0,
        failures,
    };
}
/**
 * 验证第一性原理框架是否可用于 high impact 变更。
 */
export function validateFirstPrinciplesForHighImpact(frame) {
    const violations = [];
    if (!frame.fundamental_need) {
        violations.push("high impact 变更必须有 fundamental_need");
    }
    if (frame.first_principles_status === "insufficient_context") {
        violations.push("上下文不足，不能推进 high impact 变更");
    }
    if (frame.first_principles_status === "contradicted") {
        violations.push("前提已被反驳，不能推进变更");
    }
    const check = performFirstPrinciplesCheck(frame);
    violations.push(...check.failures);
    const result = {
        valid: violations.length === 0,
        violations,
        passed: violations.length === 0,
    };
    if (!result.valid) {
        result.expected_schema = {
            fundamental_need: "string — 问题的本质需求",
            known_facts: ["string — 已确认的事实"],
            assumptions: ["string — 未经验证的假设"],
            candidate_solutions: [{ solution_id: "string", description: "string", complexity: "string" }],
            simplest_viable_solution: "string — 最简可行方案",
            chosen_solution: "string — 最终选择的方案（应与 simplest_viable_solution 一致或说明差异）",
            falsification_questions: ["string — 可证伪的问题"],
            why_not_legacy_path: "string — 为什么不走传统路径",
        };
    }
    return result;
}
/**
 * 检测已知事实与假设之间的矛盾。
 */
function findContradictions(facts, assumptions) {
    const contradictions = [];
    // 简单的否定矛盾检测
    for (const fact of facts) {
        for (const assumption of assumptions) {
            if (fact.includes("不") && assumption.includes(fact.replace("不", ""))) {
                contradictions.push(`矛盾: 已知事实 "${fact}" 与假设 "${assumption}" 冲突`);
            }
        }
    }
    return contradictions;
}
/**
 * 推进第一性原理状态。
 */
export function advanceFirstPrinciplesStatus(current, check) {
    if (current === "contradicted")
        return "failed";
    if (!check.passed)
        return "contradicted";
    return "passed";
}
//# sourceMappingURL=first_principles.js.map