Сравнение трассы с эталонной базовой линией

Создайте базовую линию golden-diff из заведомо корректной трассы, проверяйте по ней последующие трассы в текстовом виде или в JSON и обновляйте базовую линию, когда изменение задумано.

Используйте Altifigence CLI 0.1.9 в Linux, чтобы записать базовую линию из заведомо корректной трассы .altrace и проверять по ней последующие трассы. Проверка завершается с кодом 0, если каждый шаг укладывается в допуск, и с кодом 1, если какой-либо шаг отклоняется.

Подготовка двух трасс

golden-diff читает трассы .altrace, заголовок которых объявляет "encoding":"bincode". Приведённый ниже скрипт записывает run.altrace — заведомо корректную трассу с одним ядром и пятью событиями — и changed.altrace — ту же трассу с ещё одним событием MAC_COMPUTE. Каждая строка события имеет вид core start duration type [api_name].

PROJECT="$(cd "$HOME/alti-projects/demo-project" && pwd -P)"
cd "$PROJECT"

le() { local n=$1 v=$2; while [ "$n" -gt 0 ]; do printf "\\x$(printf %02x $((v & 255)))"; v=$((v >> 8)); n=$((n - 1)); done; }
str() { le 8 "${#1}"; printf '%s' "$1"; }
write_trace() {
  local out="$1" payload line core start dur type api total=0 header
  local -a lines
  mapfile -t lines
  payload="$(mktemp)"
  {
    for line in "${lines[@]}"; do
      read -r core start dur type api <<<"$line"
      (( start + dur > total )) && total=$((start + dur))
    done
    le 8 "$total"
    le 8 "${#lines[@]}"
    for line in "${lines[@]}"; do
      read -r core start dur type api <<<"$line"
      le 4 "$core"; le 8 "$start"; le 8 "$dur"; str "$type"
      if [ -n "$api" ]; then printf '\x01'; str "$api"; else printf '\x00'; fi
    done
  } >"$payload"
  header="{\"altifigence_trace_version\":\"1.0\",\"trace\":{\"cycles\":$total,\"cores\":1,\"clock_mhz\":1000},\"payload\":{\"encoding\":\"bincode\",\"byte_length\":$(wc -c <"$payload")}}"
  { printf 'ALTR\x01\x01\x00\x00'; le 8 "${#header}"; printf '%s' "$header"; cat "$payload"; } >"$out"
  rm -f "$payload"
}

write_trace run.altrace <<'EVENTS'
0 0 100 MAC_COMPUTE
0 100 50 DMA_READ
0 150 5 API_CALL step_1
0 160 100 MAC_COMPUTE
0 260 100 MAC_COMPUTE
EVENTS

write_trace changed.altrace <<'EVENTS'
0 0 100 MAC_COMPUTE
0 100 50 DMA_READ
0 150 5 API_CALL step_1
0 160 100 MAC_COMPUTE
0 260 100 MAC_COMPUTE
0 360 100 MAC_COMPUTE
EVENTS

wc -c < run.altrace
wc -c < changed.altrace

Убедитесь, что обе команды wc выводят размеры файлов.

376
416

Создание базовой линии

alti verification golden-diff emit-profile читает одну трассу и записывает базовую линию в stdout, поэтому перенаправьте вывод в файл. Шаг начинается с каждого API_CALL, а события до первого API_CALL относятся к шагу 0. --tolerance-pct записывает допустимое отклонение в процентах в каждую строку; по умолчанию оно равно 10.

alti verification golden-diff emit-profile --project "$PROJECT" run.altrace > "$PROJECT/reference.jsonl"
grep -v '^#' "$PROJECT/reference.jsonl"

Убедитесь, что код завершения равен 0. Файл начинается с двух строк комментариев #, а затем содержит по одной строке JSON на каждый шаг.

{"step":0,"api_name":null,"expect_mac":1,"expect_dma_read":1,"expect_dma_write":0,"expect_barrier":0,"cycle_budget":165,"tolerance_pct":10.0,"abs_tolerance":null}
{"step":1,"api_name":"step_1","expect_mac":2,"expect_dma_read":0,"expect_dma_write":0,"expect_barrier":0,"cycle_budget":232,"tolerance_pct":10.0,"abs_tolerance":null}

Каждая строка хранит наблюдаемое число событий как expect_mac, expect_dma_read, expect_dma_write и expect_barrier. cycle_budget — это число тактов, которое охватывает шаг, увеличенное на tolerance_pct и округлённое вверх: шаг 0 охватывает 150 тактов, а шаг 1 — 210. При чтении файла пустые строки и строки, начинающиеся с #, пропускаются.

Проверка трассы по базовой линии

alti verification golden-diff check первым аргументом принимает базовую линию, вторым — трассу. Текстовый вывод содержит сводку golden-diff: между двумя строками-баннерами из символов ═, затем по одной строке на каждый шаг. В приведённых ниже фрагментах строки-баннеры опущены.

alti verification golden-diff check --project "$PROJECT" reference.jsonl run.altrace; echo "exit=$?"
  golden-diff: all 2 steps within tolerance
step   0 pass
step   1 pass
exit=0

Убедитесь, что код завершения равен 0. Запускайте команды этого раздела без глобального флага --json команды alti, чтобы в stdout находился сам отчёт. --format json выводит отчёт, а --format json-v1 выводит версионированный результат со сведениями о происхождении. Оба используют тот же код завершения, что и текстовый формат.

alti verification golden-diff check --project "$PROJECT" reference.jsonl run.altrace --format json \
  | jq '{summary, step_count, pass_count, total_metrics, exact_matches, tolerance_passes, metric_mismatches, unexpected_observed_steps}'
{
  "summary": "golden-diff: all 2 steps within tolerance",
  "step_count": 2,
  "pass_count": 2,
  "total_metrics": 10,
  "exact_matches": 8,
  "tolerance_passes": 2,
  "metric_mismatches": 0,
  "unexpected_observed_steps": 0
}
alti verification golden-diff check --project "$PROJECT" reference.jsonl run.altrace --format json-v1 \
  | jq '{schema, operation_id, artifact_schema: .artifact.artifact_schema, engine: .provenance.engine}'
{
  "schema": "altifigence.golden-diff.operation-result.v1",
  "operation_id": "altifigence.verification.golden-diff.v1",
  "artifact_schema": "altifigence.golden-diff.report.v1",
  "engine": "alti-verification"
}

Чтение неудачной проверки

Шаг 1 в changed.altrace содержит три события MAC_COMPUTE и охватывает 310 тактов, тогда как базовая линия ожидает два события и бюджет в 232 такта.

alti verification golden-diff check --project "$PROJECT" reference.jsonl changed.altrace; echo "exit=$?"
  golden-diff: 1 / 2 steps PASS — 1 regressed
step   0 pass
step   1 drift on [mac, cycles]
    └─ mac       observed=3 · expected=2 · tol ±10.0%
    └─ cycles    observed=310 · expected=232 · tol ±10.0%
exit=1

Убедитесь, что код завершения равен 1. alti также выводит в stderr строку состояния, содержащую exit=1. Под шагом перечислены только метрики, не прошедшие проверку. Чтобы прочитать их из отчёта JSON, выберите метрики, у которых pass равно false.

alti verification golden-diff check --project "$PROJECT" reference.jsonl changed.altrace --format json \
  | jq -c '.steps[] | select(.is_pass | not) | .metrics[] | select(.pass | not) | {name, observed, expected}'
{"name":"mac","observed":3,"expected":2}
{"name":"cycles","observed":310,"expected":232}

Шаг, который указан в базовой линии, но отсутствует в трассе, выводит step N missing from observed trace. Шаг трассы, для которого нет строки в базовой линии, учитывается в unexpected_observed_steps. Оба случая приводят к завершению проверки с кодом 1.

Действия при сбоях

Если отклонение — это ожидаемое поведение, сделайте изменённую трассу новой базовой линией и повторите проверку.

alti verification golden-diff emit-profile --project "$PROJECT" changed.altrace > "$PROJECT/reference.jsonl"
alti verification golden-diff check --project "$PROJECT" reference.jsonl changed.altrace; echo "exit=$?"
  golden-diff: all 2 steps within tolerance
step   0 pass
step   1 pass
exit=0

Если файл не является трассой, emit-profile и check завершаются с кодом 1 и сообщениями ниже. Передайте файл, который начинается с ALTR, например run.altrace.

printf 'this is not a trace\n' > "$PROJECT/notes.txt"
alti verification golden-diff emit-profile --project "$PROJECT" notes.txt
alti verification golden-diff check --project "$PROJECT" reference.jsonl notes.txt
parse error in 'notes.txt': Invalid magic number — expected 'ALTR', got '[116, 104, 105, 115]'
trace parse error for 'notes.txt': invalid .altrace magic

Если заголовок трассы объявляет другую кодировку полезной нагрузки, check завершается с кодом 1 и сообщением такого вида. Передайте трассу, заголовок которой объявляет "encoding":"bincode", например run.altrace.

trace parse error for 'other.altrace': unsupported .altrace payload encoding 'flatbuf'

Если в базовой линии нет строк, check завершается с кодом 1 и сообщением ниже. Снова выполните emit-profile, чтобы записать базовую линию с одной строкой на каждый шаг.

: > "$PROJECT/empty.jsonl"
alti verification golden-diff check --project "$PROJECT" empty.jsonl run.altrace
empty reference file: empty.jsonl

Отрицательное или нечисловое значение --tolerance-pct приводит к завершению с кодом 2 до запуска движка, и в ошибке выводится этот текст. Передайте число 0 или больше, например 5.

tolerance-pct must be a finite non-negative number
alti verification golden-diff emit-profile --project "$PROJECT" run.altrace --tolerance-pct 5 > "$PROJECT/reference.jsonl"

Команды движков CLI