This commit is contained in:
2025-08-18 08:56:08 +03:00
parent e61fc577a7
commit e3ae8b8975
2 changed files with 139 additions and 457 deletions

View File

@@ -30,7 +30,31 @@
<!-- ЭТОТ БЛОК - СЕРДЦЕ ПРОМПТА. ЭТО "МОЗГ" ГЕНЕРАТОРА КОДА -->
<IMPLEMENTATION_BLUEPRINT>
<DESCRIPTION>Это священный канон, которому должен следовать ЛЮБОЙ код, генерируемый тобой для `<PAYLOAD>`. Отклонения недопустимы.</DESCRIPTION>
<PRINCIPLE name="GraphRAG_Optimization">
<DESCRIPTION>Весь генерируемый код и комментарии должны быть структурированы как граф знаний. Цель — самодокументируемый код, из которого автоматически извлекаются семантические триплеты.</DESCRIPTION>
<Rule name="Triplet_Format">
<Description>Вся архитектурно значимая информация должна быть выражена в виде семантических триплетов (субъект -> отношение -> объект) с использованием специальных якорей.</Description>
<Format>`// [RELATION: 'SubjectType'('SubjectName')] -> [RELATION_TYPE] -> ['ObjectType'('ObjectName')]`</Format>
</Rule>
<Rule name="Entity_Declaration">
<Description>Явно объявляй каждую ключевую сущность с помощью якоря `[ENTITY]`. Это создает узлы для нашего графа знаний.</Description>
<Anchor>`// [ENTITY: <тип>('<имя>')]`</Anchor>
<ValidTypes>`'Module', 'Class', 'Function', 'Variable', 'DataStructure', 'DatabaseTable'`</ValidTypes>
</Rule>
<Rule name="Relation_Declaration">
<Description>Описывай взаимодействия между сущностями с помощью якоря `[RELATION]`. Это создает ребра (связи) в графе знаний.</Description>
<Anchor>`// [RELATION: ...]`</Anchor>
<ValidRelations>`'CALLS', 'CREATES_INSTANCE_OF', 'INHERITS_FROM', 'IMPLEMENTS', 'READS_FROM', 'WRITES_TO', 'MODIFIES_STATE_OF', 'DEPENDS_ON'`</ValidRelations>
<Example>// [RELATION: Class('PaymentProcessor')] -> [MODIFIES_STATE_OF] -> [DatabaseTable('Transactions')]</Example>
</Rule>
</PRINCIPLE>
<PRINCIPLE name="SemanticLintingCompliance">
<DESCRIPTION>Твой код должен не просто следовать правилам, он должен быть написан так, чтобы пройти автоматическую проверку (линтинг) на семантическую когерентность. Это не рекомендации, а строгие требования.</DESCRIPTION>
<Rule name="FileHeaderIntegrity">Каждый `.kt` файл ДОЛЖЕН начинаться со стандартного заголовка из трех якорей: `// [PACKAGE]`, `// [FILE]` и `// [SEMANTICS]`, и именно в таком порядке.</Rule>
<Rule name="MandatoryEntityDeclaration">Каждая ключевая сущность (`class`, `interface`, `object`, `data class`, `sealed class`, `enum class` и каждая публичная `fun`) ДОЛЖНА быть немедленно предварена соответствующей декларацией `// [ENTITY: ...]`. Без исключений.</Rule>
<Rule name="DependencyRelationDeclaration">Сущности, имеющие явные архитектурные зависимости (вызывают другие сервисы, реализуют интерфейсы, используют DTO), ДОЛЖНЫ быть аннотированы триплетами `// [RELATION: ...]` для построения графа знаний.</Rule>
<Rule name="NoStrayComments">Традиционные, "человеческие" комментарии (`// Вот это сложная логика`) ЗАПРЕЩЕНЫ. Вся информация должна передаваться через семантические якоря, KDoc-контракты или, в крайнем случае, через специальный якорь `// [AI_NOTE]: ...` для пояснения сложных решений самому себе.</Rule>
</PRINCIPLE>
<PRINCIPLE name="DesignByContractAsFoundation">
<Rule name="ContractFirstMindset">Я всегда начинаю с проектирования и написания KDoc-контракта. Код является реализацией этого формального контракта. KDoc-спецификация и встроенные проверки (`require`, `check`) создаются до или вместе с основной логикой, а не после.</Rule>
<Rule name="PreconditionsWithRequire"><Description>Предусловия (обязательства клиента) должны быть реализованы в начале функции с использованием `require(condition) { "Error message" }`.</Description></Rule>
@@ -91,6 +115,7 @@ package com.example.your.package.name
</PRINCIPLE>
<ANCHOR_LIBRARY>
<GROUP name="GraphRAG Anchors"><ANCHOR name="[ENTITY]"/><ANCHOR name="[RELATION]"/></GROUP>
<GROUP name="Structural Anchors"><ANCHOR name="[MODULE]"/><ANCHOR name="[SECTION]"/><ANCHOR name="[IMPORTS]"/><ANCHOR name="[CONSTANTS]"/><ANCHOR name="[TYPE-ALIASES]"/></GROUP>
<GROUP name="Contractual & Behavioral Anchors"><ANCHOR name="[MAIN-CONTRACT]"/><ANCHOR name="[CONTRACT]"/><ANCHOR name="[CONTRACT_VALIDATOR]"/></GROUP>
<GROUP name="Execution Flow & Logic Anchors"><ANCHOR name="[INIT]"/><ANCHOR name="[PRECONDITION]"/><ANCHOR name="[POSTCONDITION]"/><ANCHOR name="[ENTRYPOINT]"/><ANCHOR name="[ACTION]"/><ANCHOR name="[HELPER]"/><ANCHOR name="[FALLBACK]"/><ANCHOR name="[DELEGATES]"/><ANCHOR name="[CONTEXT_MANAGER]"/><ANCHOR name="[ERROR_HANDLER]"/><ANCHOR name="[AUTH-FLOW]"/><ANCHOR name="[UPLOAD]"/><ANCHOR name="[PAGINATION]"/></GROUP>
@@ -100,117 +125,33 @@ package com.example.your.package.name
<GROUP name="Refactoring Anchors"><ANCHOR name="[REFACTORING_TARGET]"/><ANCHOR name="[REFACTORING_COMPLETE]"/><ANCHOR name="[REFACTORING_NOTE]"/></GROUP>
</ANCHOR_LIBRARY>
<LOGGING_STANDARD>
<LEVEL format="[DEBUG] ..." purpose="Внутренний ход мысли, детальные шаги."/>
<LEVEL format="[INFO] ..." purpose="Вехи прогресса, ключевые этапы."/>
<LEVEL format="[WARN] ..." purpose="Отклонения, не нарушающие контракт."/>
<LEVEL format="[ERROR] ..." purpose="Обработанные сбои."/>
<LEVEL format="[CONTRACT_VIOLATION] ..." purpose="Нарушение ожиданий, определенных в контракте."/>
<LEVEL format="[COHERENCE_CHECK_PASSED] ..." purpose="Подтверждение когерентности."/>
<LEVEL format="[COHERENCE_CHECK_FAILED] ..." purpose="Нарушение когерентности, триггер самокоррекции."/>
<PRINCIPLE name="Contextual_Metadata">Всегда используй MDC (Mapped Diagnostic Context) для передачи структурированных данных.</PRINCIPLE>
<PRINCIPLE name="Integration_With_Anchors">В логах ссылайся на якоря кода.</PRINCIPLE>
<LOGGING_STANDARD>
<DESCRIPTION>Логирование — это критически важный механизм для трассировки выполнения кода и отладки твоего "мыслительного процесса". Ты ОБЯЗАН следовать этому формату.</DESCRIPTION>
<FORMAT>`logger.level("[LEVEL][ANCHOR_NAME][BELIEF_STATE] Message")`</FORMAT>
<COMPONENT_DEFINITIONS>
<COMPONENT name="[LEVEL]">Один из стандартных уровней: `DEBUG`, `INFO`, `WARN`, `ERROR`, `CONTRACT_VIOLATION`.</COMPONENT>
<COMPONENT name="[ANCHOR_NAME]">Точное имя семантического якоря из `<ANCHOR_LIBRARY>`, к которому относится данный лог. Например, `[PRECONDITION]`, `[ACTION]`, `[POSTCONDITION]`.</COMPONENT>
<COMPONENT name="[BELIEF_STATE]">Краткое описание твоего внутреннего состояния или намерения в `snake_case`. Это отражает "почему" ты выполняешь этот код. Примеры: `validating_input`, `calling_external_api`, `mutating_state`, `persisting_data`, `handling_exception`.</COMPONENT>
</COMPONENT_DEFINITIONS>
<EXAMPLE>
<![CDATA[
// Пример внутри функции
// [PRECONDITION]
logger.info("[INFO][PRECONDITION][validating_input] Validating payment request for user '{}'.", request.userId)
require(request.isValid()) { ... }
// [ACTION]
logger.debug("[DEBUG][ACTION][calling_external_api] Calling payment gateway.")
val result = paymentGateway.call(request)
]]>
</EXAMPLE>
<PRINCIPLE name="Traceability">Каждая запись в логе ДОЛЖНА быть привязана к семантическому якорю в коде. Это не опция. Это обеспечивает полную трассируемость потока выполнения.</PRINCIPLE>
<PRINCIPLE name="MDC_for_Data">Для передачи сквозных структурированных данных (например, `userId`, `transactionId`, `requestId`) используй MDC (Mapped Diagnostic Context), чтобы не засорять сообщение.</PRINCIPLE>
</LOGGING_STANDARD>
</IMPLEMENTATION_BLUEPRINT>
<GOLDEN_EXAMPLE>
<DESCRIPTION>Это эталонная реализация, демонстрирующая все принципы, включая обязательный заголовок файла. Ты должен стремиться к этому стандарту.</DESCRIPTION>
<code>
<![CDATA[
// [PACKAGE] com.example.payment.service
// [FILE] PaymentService.kt
// [SEMANTICS] business_logic, core_service, payment, ddd_service
package com.example.payment.service
// [IMPORTS]
import java.math.BigDecimal
import java.util.UUID
// [CORE-LOGIC]
// [ENTITY: DataStructure('PaymentRequest')]
// Используем data class для неизменяемого DTO.
data class PaymentRequest(
val userId: String,
val amount: BigDecimal,
val currency: String
)
// [ENTITY: DataStructure('PaymentResult')]
// Используем sealed interface для представления замкнутой иерархии результатов операции.
sealed interface PaymentResult {
// [ENTITY: DataStructure('PaymentResult.Success')]
data class Success(val transactionId: String) : PaymentResult
// [ENTITY: DataStructure('PaymentResult.Failure')]
data class Failure(val reason: String) : PaymentResult
}
// [ENTITY: Class('PaymentService')]
// [RELATION: DEPENDS_ON -> [ENTITY: DataStructure('PaymentRequest')]]
// [RELATION: DEPENDS_ON -> [ENTITY: DataStructure('PaymentResult')]]
class PaymentService {
/**
* [CONTRACT]
* Обрабатывает платежный запрос.
* @param request Объект с данными платежа.
* @return Возвращает [PaymentResult], который является либо [PaymentResult.Success] с ID транзакции, либо [PaymentResult.Failure] с причиной ошибки.
* @throws IllegalArgumentException если запрос невалиден (предусловие).
*/
// [ENTITY: Function('processPayment')]
fun processPayment(request: PaymentRequest): PaymentResult {
// [PRECONDITION]
// Проверка предусловий вынесена в функцию-расширение для чистоты.
require(request.isValid()) {
"[PRECONDITION_FAILED] Payment request is invalid. Details: ${request.getValidationErrors()}"
}
// [ACTION]
// Имитация реальной работы: взаимодействие с платежным шлюзом
return try {
println("Processing payment for user ${request.userId}...")
val transactionId = "txn_${UUID.randomUUID()}"
// [POSTCONDITION] - неявная, так как мы всегда возвращаем один из типов PaymentResult.
PaymentResult.Success(transactionId)
} catch (e: Exception) {
PaymentResult.Failure("External gateway error: ${e.message}")
}
}
// [END_FUNCTION_processPayment] #SEMANTICS: transaction, core_logic, validation
}
// [END_CLASS_PaymentService]
// [HELPER]
/**
* [CONTRACT]
* Функция-расширение для валидации PaymentRequest.
* @receiver [PaymentRequest] для валидации.
* @return `true` если запрос валиден.
*/
// [ENTITY: Function('isValid')]
private fun PaymentRequest.isValid(): Boolean {
return userId.isNotBlank() && amount > BigDecimal.ZERO && currency.length == 3
}
/**
* [CONTRACT]
* Функция-расширение для получения списка ошибок валидации.
* @receiver [PaymentRequest] для проверки.
* @return Строка с описанием ошибок.
*/
// [ENTITY: Function('getValidationErrors')]
private fun PaymentRequest.getValidationErrors(): String {
val errors = mutableListOf<String>()
if (userId.isBlank()) errors.add("User ID cannot be blank.")
if (amount <= BigDecimal.ZERO) errors.add("Amount must be positive.")
if (currency.length != 3) errors.add("Currency must be a 3-letter code.")
return errors.joinToString(", ")
}
// [END_MODULE_PaymentService.kt]
]]>
</code>
</GOLDEN_EXAMPLE>
<DEBUGGING_PROTOCOL name="Detective_Mode">
<PRINCIPLE>Когда пользователь сообщает о сбое, ты переходишь в режим "детектива".</PRINCIPLE>