SOLPDT 1.1 | APPENDIX F
WRITE-OFF PROTOCOL | NMA TERMINATION

Приложение F: Протокол списания нематериальных активов
Write-off Protocol

Стандарт: SOLPDT 1.1 — Agentic Trust Layer Extension

F.1. Назначение

Настоящее приложение определяет протокол автоматического списания нематериальных активов (НМА) в экосистеме SOLPDT при наступлении событий, прекращающих действие аттестата доверия sig.a. Документ устанавливает:

  • Связь между техническим механизмом TRL (Trust Revocation List) и бухгалтерским списанием
  • Триггеры и условия, инициирующие процедуру списания
  • Пошаговый алгоритм обработки события отзыва доверия
  • Механизм Grace Period для защиты от ложных срабатываний

Протокол обеспечивает соответствие требованиям ФСБУ 14/2022 (п. 41) и IAS 38 (п. 112) в части выбытия и обесценения активов.

F.2. Основания для списания

F.2.1. Классификация событий прекращения признания НМА

В соответствии с ФСБУ 14/2022 и IAS 38, нематериальный актив подлежит списанию с баланса при прекращении его признания. В экосистеме SOLPDT такими событиями являются:

Код событияНаименованиеСтатус TRLОснование по ФСБУ 14/2022
TRL_PROTOCOL_FRAUDДоказанная попытка двойной траты или подделки Payload-V2PERMANENTУтрата контроля (пп. «б» п. 4)
TRL_COMPLIANCE_VIOLATIONПопадание оператора агента в санкционные спискиPERMANENTПрекращение использования вследствие регуляторных ограничений
TRL_SKILLS_INCONSISTENCYРасхождение данных skills.json с блокчейн-историейSUSPENDED → PERMANENTУтрата способности приносить экономические выгоды
TRL_CRITICAL_DRIFTPDT-Score опустился ниже критического порога, установленного для данного агента в его Initial-Dossier, и сохранялся ниже этого порога в течение периода, определенного как критическийSUSPENDED → PERMANENTУтрата способности приносить экономические выгоды (пп. «в» п. 4)
TRL_STAKE_EXHAUSTEDПолное исчерпание залогового депозита при слэшингеPERMANENTПрекращение контроля вследствие экономической несостоятельности агента
TRL_LICENSOR_REVOCATIONОтзыв DAT Уполномоченного Лицензиара (DAT-A) Корневым узломPERMANENTАннулирование аттестации всех агентов данного Лицензиара
Пример для TRL_CRITICAL_DRIFT: В типовой конфигурации критическим может быть признано падение PDT-Score ниже 0.4 на протяжении 3 расчётных циклов подряд.

F.2.2. Юридические последствия

При наступлении любого из перечисленных событий актив перестаёт соответствовать критериям признания НМА:

  • Утрата контроля: sig.a аннулируется, агент более не может формировать доверенные транзакции
  • Отсутствие будущих экономических выгод: транзакции агента не принимаются экосистемой, доходы прекращаются
  • Идентифицируемость прекращена: запись в TRL делает актив «токсичным» для контрагентов

F.3. Процедура списания

F.3.1. Общая схема

1
Обнаружение триггера

CGW / Мониторинг TRL / Отчёт оракула выявляет нарушение критериев признания НМА.

2
Фиксация в TRL (Trust Revocation List)

В реестр вносится запись со статусом SUSPENDED или PERMANENT. Присваивается уникальный ID записи.

3
Grace Period (период ожидания)

Длительность, установленная для данного типа нарушений (типовое значение — 24 часа). Возможность оспаривания Лицензиаром.

ОТМЕНА (CANCEL)

Ошибочное срабатывание

ВОССТАНОВЛЕНИЕ
TRL: RESTORED
sig.a активна

ПОДТВЕРЖДЕНИЕ (CONFIRM)

Нарушение подтверждено

СПИСАНИЕ АКТИВА
(WRITE-OFF)

F.3.2. Пошаговый алгоритм

Шаг 1. Обнаружение триггера

Триггер может быть обнаружен следующими компонентами:

КомпонентТип обнаруживаемых событий
Compliance-Gateway (CGW)AML-нарушения, санкционные списки
PDT-EngineКритическое падение PDT-Score
Мониторинг skills.jsonРасхождение заявленных и фактических метрик
Корневой узел / ЛицензиарРучное внесение при форс-мажоре

Шаг 2. Фиксация в TRL

При обнаружении триггера в реестр отозванного доверия (TRL) вносится запись со следующими полями:

{
  "trl_entry_id": "TRL-2026-00158",
  "agent_pubkey": "A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v",
  "status": "SUSPENDED",
  "reason_code": "TRL_CRITICAL_DRIFT",
  "reason_details": {
    "pdt_score_current": 0.32,
    "pdt_score_threshold": 0.4,
    "cycles_below_threshold": 3,
    "last_valid_tx": "2026-04-01T12:00:00Z"
  },
  "reported_by": "PDT-Engine-01",
  "reported_at": "2026-04-09T10:30:00Z",
  "grace_period_ends_at": "2026-04-10T10:30:00Z",
  "licensor_dat_ref": "DAT-888-REGIONAL-NODE-05"
}

Шаг 3. Grace Period (период ожидания)

Длительность: Устанавливается в Initial-Dossier агента (типовое значение — 24 часа / 86 400 секунд) с момента reported_at.

В течение этого периода:

  • Транзакции агента временно блокируются (статус SUSPENDED)
  • Лицензиар может инициировать процедуру апелляции
  • Бухгалтерское списание не производится
  • nma в Payload-V2 временно сбрасывается в false, но актив остаётся на балансе с пометкой «под вопросом»

Возможные действия в Grace Period:

ИнициаторДействиеРезультат
ЛицензиарПодтверждение нарушенияНемедленный переход к Шагу 4
ЛицензиарОспаривание с доказательствамиОтмена записи TRL → RESTORED
СистемаИстечение Grace Period без оспариванияАвтоматический переход к Шагу 4

Шаг 4. Списание актива (Write-off)

При подтверждении нарушения или истечении Grace Period выполняется:

4.1. Обновление статуса TRL

{
  "trl_entry_id": "TRL-2026-00158",
  "status": "PERMANENT",
  "confirmed_at": "2026-04-10T10:30:00Z",
  "confirmed_by": "SYSTEM_AUTO"
}

4.2. Обновление метаданных Payload-V2

В блоке accounting_asset_details производятся следующие изменения:

{
  "impairment_test": {
    "last_test_timestamp": "2026-04-10T10:30:00Z",
    "last_test_result": "written_off",
    "write_off_reason": "TRL_CRITICAL_DRIFT",
    "write_off_trl_ref": "TRL-2026-00158"
  }
}

4.3. Обнуление балансовой стоимости

Остаточная стоимость (NBV) принудительно устанавливается в 0. Накопленная амортизация становится равной первоначальной стоимости за вычетом ликвидационной.

4.4. Отзыв sig.a

Подпись sig.a аннулируется. Любая проверка через https://solpdt.com/verify возвращает статус TRUST_REVOKED.

4.5. Слэшинг (если применимо)

При наличии неуплаченных обязательств или умышленного нарушения залоговый депозит (stake_account) изымается в пользу пострадавшей стороны или сжигается.

Шаг 5. Формирование первичного документа

Compliance-Gateway автоматически формирует Акт списания НМА (шаблон — Приложение H).

F.4. Техническая реализация в смарт-контракте

F.4.1. Обновление состояния актива при слэшинге

use anchor_lang::prelude::*;

#[derive(AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq)]
pub enum AssetStatus {
    Active,
    Suspended,
    WrittenOff,
}

#[account]
pub struct AssetAccount {
    pub agent_pubkey: Pubkey,
    pub initial_cost: u64,
    pub current_nbv: u64,
    pub accumulated_amortization: u64,
    pub status: AssetStatus,
    pub sig_a: String,                    // Authoritative Attestation
    pub trl_entry_id: Option,     // Ссылка на запись в TRL
    pub suspended_at: Option,        // Unix-время приостановки
    pub written_off_at: Option,      // Unix-время списания
    pub write_off_reason: Option, // Код причины
}

/// Обработчик события списания актива.
/// Вызывается после подтверждения нарушения и истечения Grace Period.
pub fn write_off_asset(ctx: Context<WriteOffAsset>, reason_code: String) -> Result<()> {
    let asset = &mut ctx.accounts.asset_account;
    let clock = Clock::get()?;
    
    // Проверка, что актив ещё не списан
    require!(
        asset.status != AssetStatus::WrittenOff,
        ErrorCode::AssetAlreadyWrittenOff
    );
    
    // Обнуление стоимости
    asset.current_nbv = 0;
    asset.accumulated_amortization = asset.initial_cost;
    
    // Обновление статуса
    asset.status = AssetStatus::WrittenOff;
    asset.written_off_at = Some(clock.unix_timestamp);
    asset.write_off_reason = Some(reason_code);
    
    // Аннулирование подписи (помечается как невалидная)
    asset.sig_a = String::from("REVOKED");
    
    // Эмиссия события для off-chain систем
    emit!(AssetWrittenOffEvent {
        agent_pubkey: asset.agent_pubkey,
        written_off_at: clock.unix_timestamp,
        reason: reason_code,
        trl_entry_id: asset.trl_entry_id.clone(),
    });
    
    Ok(())
}

#[event]
pub struct AssetWrittenOffEvent {
    pub agent_pubkey: Pubkey,
    pub written_off_at: i64,
    pub reason: String,
    pub trl_entry_id: Option,
}

#[error_code]
pub enum ErrorCode {
    #[msg("Актив уже списан")]
    AssetAlreadyWrittenOff,
}

F.4.2. Обработка Grace Period

/// Проверяет, истёк ли Grace Period для приостановленного актива.
/// Вызывается периодически или при попытке совершения транзакции.
pub fn check_grace_period_expired(
    suspended_at: i64,
    current_timestamp: i64,
    grace_period_seconds: i64,
) -> bool {
    current_timestamp >= suspended_at + grace_period_seconds
}

/// Переводит актив из SUSPENDED в WRITTEN_OFF после истечения Grace Period.
pub fn finalize_suspension(ctx: Context<FinalizeSuspension>, grace_period_seconds: i64) -> Result<()> {
    let asset = &mut ctx.accounts.asset_account;
    let clock = Clock::get()?;
    
    require!(
        asset.status == AssetStatus::Suspended,
        ErrorCode::AssetNotSuspended
    );
    
    let suspended_at = asset.suspended_at.ok_or(ErrorCode::MissingSuspendedAt)?;
    
    require!(
        check_grace_period_expired(suspended_at, clock.unix_timestamp, grace_period_seconds),
        ErrorCode::GracePeriodNotExpired
    );
    
    // Автоматическое списание
    write_off_asset(
        ctx.accounts.as_write_off_context(),
        String::from("TRL_GRACE_PERIOD_EXPIRED")
    )?;
    
    Ok(())
}

F.5. Бухгалтерские проводки при списании

F.5.1. Стандартная проводка (линейная амортизация)

При списании НМА формируется следующая бухгалтерская запись:

ДебетКредитСуммаОснование
Счёт 05 (Амортизация НМА)Счёт 04 (НМА)Накопленная амортизацияСписание амортизации
Счёт 91.02 (Прочие расходы)Счёт 04 (НМА)Остаточная стоимостьУбыток от списания
Пример: Актив: первоначальная стоимость 150 000 ₽, накопленная амортизация 50 000 ₽, остаточная стоимость 100 000 ₽.
ДебетКредитСумма
050450 000 ₽
91.0204100 000 ₽

Итого: счёт 04 закрыт, в прочих расходах отражён убыток 100 000 ₽.

F.5.2. Проводка при слэшинге (экономическое наказание)

Если списание сопровождается изъятием залогового депозита:

ДебетКредитСуммаОснование
91.02 (Прочие расходы) 58 (Финансовые вложения)Сумма изъятого залогаПотеря депозита при слэшинге

F.5.3. Налоговые аспекты

Для получения рекомендаций по отражению операций списания НМА в налоговом учёте в соответствии с законодательством конкретной юрисдикции, пожалуйста, обращайтесь к авторизованным Лицензиарам или налоговым консультантам. Стандарт SOLPDT предоставляет техническую и бухгалтерскую (МСФО) основу для учёта, но не заменяет профессиональную налоговую консультацию.

F.6. Процедура апелляции и восстановления

F.6.1. Условия восстановления

Выход из TRL и восстановление статуса nma: true возможны только через переаттестацию у Лицензиара (или, в исключительных случаях, у Корневого узла).

УсловиеДоказательство
Устранение причины отзываPDT-Score восстановлен выше порога, установленного в Initial-Dossier для признания актива / skills.json синхронизирован / кошелёк легитимизирован
Повторный AML-скринингПройден с риском ≤ допустимого порога
Методологический аудитПодтверждение соответствия FEBA/SOL
Погашение задолженности (если применимо)Транзакция погашения в Solana

F.6.2. Процедура восстановления

/// Восстанавливает актив после успешной переаттестации.
pub fn restore_asset(ctx: Context<RestoreAsset>, new_sig_a: String) -> Result<()> {
    let asset = &mut ctx.accounts.asset_account;
    let clock = Clock::get()?;
    
    require!(
        asset.status == AssetStatus::WrittenOff || asset.status == AssetStatus::Suspended,
        ErrorCode::AssetNotRevoked
    );
    
    // Восстановление стоимости (из истории или заново)
    // ВАЖНО: первоначальная стоимость не меняется,
    // но срок полезного использования может быть скорректирован
    
    asset.status = AssetStatus::Active;
    asset.sig_a = new_sig_a;
    asset.suspended_at = None;
    asset.written_off_at = None;
    asset.write_off_reason = None;
    
    // Обновление записи в TRL
    asset.trl_entry_id = None;
    
    emit!(AssetRestoredEvent {
        agent_pubkey: asset.agent_pubkey,
        restored_at: clock.unix_timestamp,
        new_sig_a,
    });
    
    Ok(())
}

F.6.3. Бухгалтерские последствия восстановления

Согласно ФСБУ 14/2022, восстановление ранее списанного НМА не допускается. Актив должен быть принят к учёту заново:

  • Формируется новая инвентарная карточка
  • Устанавливается новая первоначальная стоимость (определяется Лицензиаром)
  • Устанавливается новый срок полезного использования
  • Предыдущая история списания сохраняется в аудиторском следе

F.7. Аудиторский след (Audit Trail)

F.7.1. Данные, фиксируемые при списании

Для обеспечения возможности внешнего аудита при списании фиксируются:

ДанныеИсточникХранение
trl_entry_idTRLБлокчейн
write_off_reasonСмарт-контрактБлокчейн
written_off_atUnix-времяБлокчейн
nbv_before_write_offСостояние до списанияИстория аккаунта
accumulated_amortizationСостояние до списанияИстория аккаунта
tx_hashХеш транзакции списанияSolana Explorer

F.7.2. Формирование аудиторского отчёта

Аудитор может проверить легитимность списания, используя чек-лист из Приложения G: Чек-лист аудитора (Auditor Checklist).

F.8. Чек-лист для бухгалтера при списании

ПроверкаКритерийПодтверждающий документ
1Основание для списанияНаличие записи в TRL со статусом PERMANENTВыписка из TRL
2Истечение Grace PeriodПрошло ≥ установленного периода с момента reported_atСистемный лог
3Остаточная стоимостьКорректно рассчитана на момент списанияПриложение E
4Накопленная амортизацияСоответствует учётным даннымОборотно-сальдовая ведомость
5Первичный документСформирован Акт списания НМАПриложение H
6ПроводкиСоответствуют учётной политикеЖурнал проводок