Skip to content

Core: атомизировать физический вход Paint - #484

Merged
lemone112 merged 3 commits into
mainfrom
agent/v3a-atomic-paint-input
Jul 28, 2026
Merged

Core: атомизировать физический вход Paint#484
lemone112 merged 3 commits into
mainfrom
agent/v3a-atomic-paint-input

Conversation

@lemone112

@lemone112 lemone112 commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Корневая проблема

Private appearance-runtime представлял source и base alpha разными входами. Finite Program пока менял только source, поэтому следующий alpha/glass-срез мог бы создать недекларированные Cartesian-пары.

Изменение

  • атомарный PaintInputId -> EncodedPointPaintValueV1 { source, opacity };
  • PaintSpec::Input заменяет private Solid + ColorInput;
  • bindings и hot overwrite меняют PaintValue целиком;
  • текущий Program понижает существующие fixed/finite source как тот же PaintValue с alpha = 1;
  • старые private имена и setter удалены без alias;
  • точный point-support source binding переиздан без изменения математического claim.

Public Program/identity V3 в этом PR намеренно не меняются. Atomic finite candidates и identity V4 — следующий отдельный срез.

RED -> GREEN

Первый RED: один Paint input black@0.25 на белом должен дать [191;3] без отдельного opacity-узла; прежний IR не мог представить вход.

Дополнительный hostile oracle доказывает base alpha × modifier(s) в точном left-associated binary64 порядке, включая subnormal/underflow. Мутант, забывающий base alpha, даёт RED.

Проверки exact head

  • Core: 920 passed, 6 ignored; все integration suites и 37 doctests green;
  • clippy -D warnings, rustfmt: green;
  • point-support source binding: 5/5; independent proof replay: PASS;
  • focused generated mutation: 0 missed / 0 timeout; отдельный manual base-alpha mutant даёт RED;
  • независимый read-only review нашёл один P2; исправление повторно проверено, новых findings нет.

Review focus

Проверить, что PaintId остаётся topology identity, атомарное input value не несёт ID, отдельного source/alpha setter больше нет, а public behavior и numerical proof law не изменены.

Summary by CodeRabbit

  • Новые возможности
    • Обновлена модель работы с входными данными цвета: теперь поддерживаются типизированные paint-входы с отдельными значениями непрозрачности.
    • Улучшена обработка прозрачности при вычислении и композиции изображений.
  • Исправления
    • Синхронизированы проверки привязок, компиляции и воспроизведения графов для нового формата входных данных.
    • Обновлены контрольные данные и проверки артефактов, чтобы результаты верификации оставались корректными.
  • Производительность
    • Актуализированы измерения и ограничения размера WebAssembly после изменений в обработке paint-данных.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: cdaadee3-6206-4244-a0b7-7b786b40df52

📥 Commits

Reviewing files that changed from the base of the PR and between b2f1fbc and 692b66c.

📒 Files selected for processing (15)
  • crates/labcolors-core/contracts/clean-set-srgb8-v1/receipt-v1.json
  • crates/labcolors-core/contracts/clean-set-srgb8-v1/receipt-v1.sha256
  • crates/labcolors-core/contracts/point-support-reference-surplus-q55-bps-proof-v1.json
  • crates/labcolors-core/src/analog.rs
  • crates/labcolors-core/src/appearance.rs
  • crates/labcolors-core/src/appearance_graph_tests.rs
  • crates/labcolors-core/src/appearance_replay_tests.rs
  • crates/labcolors-core/src/constraint_tests.rs
  • crates/labcolors-core/src/joint_tests.rs
  • crates/labcolors-core/src/observation_tests.rs
  • crates/labcolors-core/src/point_support_tests.rs
  • crates/labcolors-core/src/program_session.rs
  • packages/colors/bench/wasm.json
  • scripts/check-wasm-size-budget.mjs
  • scripts/verify_point_support_surplus.py

Walkthrough

Переведены appearance-граф и ProgramSession с ColorInputId/PaintSpec::Solid на PaintInputId/PaintSpec::Input и EncodedPointPaintValueV1. Обновлены выполнение, binding admission, тесты, контрольные артефакты и wasm-бюджет.

Changes

Атомарные paint inputs

Layer / File(s) Summary
Модель и выполнение appearance-графа
crates/labcolors-core/src/appearance.rs
Введены типизированные paint inputs и encoded values; обновлены компиляция, binding admission, materialization opacity и сертификаты композиции.
Интеграция ProgramSession
crates/labcolors-core/src/program_session.rs
Lowering графа и bindings, target slots, применение кандидатов и обработка compile errors переведены на paint-input API.
Тесты новой модели
crates/labcolors-core/src/*_tests.rs, crates/labcolors-core/src/analog.rs
Тестовые графы, bindings, identity, replay, opacity, underflow и ошибки обновлены под новую модель.
Контрольные артефакты
crates/labcolors-core/contracts/*, packages/colors/bench/wasm.json, scripts/*
Обновлены хэши receipt/proof/source capsule и данные wasm-бюджета.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related issues

Possibly related PRs

Sequence Diagram(s)

sequenceDiagram
  participant ProgramSession
  participant AppearanceGraphSpec
  participant AppearanceBindings
  participant CompiledAppearanceProgram
  ProgramSession->>AppearanceGraphSpec: lower PaintSpec::Input graph
  ProgramSession->>AppearanceBindings: lower encoded paint inputs
  AppearanceGraphSpec->>CompiledAppearanceProgram: compile and bind paint inputs
  AppearanceBindings->>CompiledAppearanceProgram: admit and execute values
  CompiledAppearanceProgram-->>ProgramSession: rendered target result
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent/v3a-atomic-paint-input

Comment @coderabbitai help to get the list of available commands.

@lemone112
lemone112 marked this pull request as ready for review July 28, 2026 02:50

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

Exact-head review: cf5ef4a1bc9ceb8216d586c643954207d643b11d. Особое внимание atomic source+alpha binding, отсутствие старых aliases, left-associated alpha multiplication и неизменность point-support mathematical claim.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

@lemone112 Запускаю полный повторный review exact head cf5ef4a1bc9ceb8216d586c643954207d643b11d, с фокусом на атомарный binding source+alpha, отсутствие legacy aliases/setters, точный left-associated порядок alpha multiplication и неизменность mathematical claim point-support.

✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. Your recent PR review activity is in the 95th percentile or higher among CodeRabbit users, so adaptive limits apply. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 24 minutes.

Copy link
Copy Markdown
Collaborator Author

RCA первого MSRV gate: compile не начинался — exact clean-set receipt корректно отверг изменённые whole-file bytes appearance.rs и program_session.rs. В 353b2e9 перепривязаны только эти два artifact digest/size и внешний receipt pin; mathematical/research fields не менялись.

Exact verification: PRODUCT_IDENTITY_VERIFIED, hostile verifier 31/31, receipt 2cdb16116e01efd9d76bff544e1b13dac1cc9a59208bf5ad5f42808c1e024cc0.

@lemone112

Copy link
Copy Markdown
Collaborator Author

RCA WASM gate на exact head 353b2e941d490d3ebbe7c578b4eb85c864b5bfb7: две toolchain-pinned clean-сборки и byte diff прошли; атомарный Paint уменьшил canonical Linux runtime с 376707 B до 376675 B (−32 B, SHA-256 e70a9b2d6f55775c75a00bf81bc5fde0207df3d7ffc29d13ae00a349ab172971). Упал только stale exact-size receipt.

В 692b66c9fc3bbf605bdfc0aff666e85b673c67fd receipt перепривязан без headroom: source github-actions-run-30324408912, raw=max=376675 B, basis v3a-atomic-paint-input, canonical budget SHA-256 3d548ed9c77adb1a99eaa37c8a3f9ff06526adaa18cee4085023d13e6f6731b7. Локально: package runtime tests 275/275, typecheck, focused release-contract PASS; Darwin artifact остаётся diagnostic-only. Повторный Linux CI обязан дать exact delta 0 и выполнить ранее пропущенные headless/release gates.

@lemone112

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

Exact-head review: 692b66c9fc3bbf605bdfc0aff666e85b673c67fd. Проверь атомарность source+base-alpha, отсутствие старых aliases/setters и семантических recipes, exact left-associated alpha multiplication, неизменность point-support mathematical claim, честность clean-set/WASM receipts и отсутствие performance/API/documentation regressions.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

expected='692b66c9fc3bbf605bdfc0aff666e85b673c67fd'
echo "HEAD: $(git rev-parse HEAD)"
git cat-file -e "${expected}^{commit}"
base="$(git merge-base "${expected}" origin/main 2>/dev/null || git merge-base "${expected}" main)"
echo "MERGE_BASE: $base"
echo '--- CHANGED FILES ---'
git diff --name-status "$base" "$expected"
echo '--- DIFF STAT ---'
git diff --stat "$base" "$expected"

echo '--- CANDIDATE FILES ---'
fd -t f . | rg -i 'appearance|program_session|paint|point.*support|receipt|wasm|contract|binding|proof'

echo '--- ATOMIC AND LEGACY SYMBOL REFERENCES ---'
rg -n -i -C 2 \
  'EncodedPointPaintValueV1|PaintInputId|PaintSpec::Input|ColorInput|Solid|set.*(source|opacity|alpha)|source.*setter|opacity.*setter|base.*alpha|base_alpha|paint.*input' \
  . \
  -g '!target/**' -g '!node_modules/**' || true

echo '--- RECEIPT / WASM METADATA MATCHES ---'
rg -n -i -C 3 \
  '2cdb16116e01efd9d76bff544e1b13dac1cc9a59208bf5ad5f42808c1e024cc0|376675|e70a9b2d6f55775c75a00bf81bc5fde0207df3d7ffc29d13ae00a349ab172971|3d548ed9c77adb1a99eaa37c8a3f9ff06526adaa18cee4085023d13e6f6731b7|30324408912|v3a-atomic-paint-input|PRODUCT_IDENTITY_VERIFIED' \
  . \
  -g '!target/**' -g '!node_modules/**' || true

Length of output: 196418


🏁 Script executed:

#!/bin/bash
set -euo pipefail

expected='692b66c9fc3bbf605bdfc0aff666e85b673c67fd'
base="$(git merge-base "$expected" origin/main 2>/dev/null || git merge-base "$expected" main)"
printf 'HEAD=%s\nEXPECTED=%s\nBASE=%s\n' "$(git rev-parse HEAD)" "$expected" "$base"

echo '--- EXACT DIFF: IMPLEMENTATION / TESTS / RECEIPTS ---'
git diff --find-renames --find-copies --unified=30 "$base" "$expected" -- \
  crates/labcolors-core/src/appearance.rs \
  crates/labcolors-core/src/program_session.rs \
  crates/labcolors-core/contracts/clean-set-srgb8-v1/receipt-v1.json \
  crates/labcolors-core/contracts/clean-set-srgb8-v1/receipt-v1.sha256 \
  packages/colors/bench/wasm.json \
  scripts/check-wasm-size-budget.mjs \
  scripts/verify_clean_set_receipt.py

echo '--- APPEARANCE MAP ---'
ast-grep outline crates/labcolors-core/src/appearance.rs --items all --type struct,enum,impl,function --match 'Paint|Appearance|Opacity|point_opacity' || true

echo '--- KEY IMPLEMENTATION SLICES ---'
sed -n '1,180p;1110,1328p;1928,1950p;2220,2320p' crates/labcolors-core/src/appearance.rs
sed -n '3128,3170p;4140,4190p;4690,4840p' crates/labcolors-core/src/program_session.rs

echo '--- PRIVATE LEGACY-API SEARCH (DEFINITIONS AND CALLS) ---'
rg -n -i -C 2 \
  '(ColorInput|PaintSourceInput|SolidPaintInput|set_(paint_)?(source|opacity|alpha)|overwrite_(paint_)?(source|opacity|alpha)|bind_(paint_)?(source|opacity|alpha)|source_binding|opacity_binding)' \
  crates/labcolors-core/src/appearance.rs \
  crates/labcolors-core/src/program_session.rs \
  crates/labcolors-core/src/*tests.rs || true

echo '--- ATOMIC / NUMERIC REGRESSION TEST NAMES AND BODIES ---'
rg -n -i -C 4 \
  '(atomic|cartesian|base alpha|base_alpha|left.associ|subnormal|underflow|191|black.*0\.25|opacity.*multiply)' \
  crates/labcolors-core/src/appearance.rs \
  crates/labcolors-core/src/*tests.rs

echo '--- RECEIPT HASH VALIDATION ---'
python3 - <<'PY'
import hashlib, json
from pathlib import Path
root=Path('crates/labcolors-core/contracts/clean-set-srgb8-v1')
receipt=root/'receipt-v1.json'
data=json.loads(receipt.read_text())
for entry in data.get('source_files', []):
    p=Path(entry['path'])
    actual=hashlib.sha256(p.read_bytes()).hexdigest() if p.exists() else 'MISSING'
    print(f"{entry['path']}: declared={entry['sha256']} actual={actual} ok={actual == entry['sha256']}")
print('receipt-v1.json sha256=', hashlib.sha256(receipt.read_bytes()).hexdigest())
print('receipt-v1.sha256=', (root/'receipt-v1.sha256').read_text().strip())
PY

echo '--- WASM RECEIPT / CHECKER ---'
cat packages/colors/bench/wasm.json
sed -n '1,260p' scripts/check-wasm-size-budget.mjs

Length of output: 160875


🏁 Script executed:

#!/bin/bash
set -euo pipefail

expected='692b66c9fc3bbf605bdfc0aff666e85b673c67fd'
base="$(git merge-base "$expected" origin/main 2>/dev/null || git merge-base "$expected" main)"

echo '--- COMPLETE CHANGE SCOPE ---'
git diff --name-status "$base" "$expected"
echo '--- PUBLIC PROGRAM / IDENTITY DIFF (SHOULD BE EMPTY) ---'
git diff --stat "$base" "$expected" -- \
  crates/labcolors-core/src/program.rs \
  crates/labcolors-core/src/program_identity.rs \
  crates/labcolors-core/src/lib.rs
git diff --unified=5 "$base" "$expected" -- \
  crates/labcolors-core/src/program.rs \
  crates/labcolors-core/src/program_identity.rs \
  crates/labcolors-core/src/lib.rs

echo '--- FOCUSED REGRESSION TEST BODIES ---'
sed -n '270,330p;735,875p;1200,1295p' crates/labcolors-core/src/appearance_graph_tests.rs
echo '--- SOURCE-OVER / POINT-SUPPORT CLAIM REFERENCES ---'
rg -n -C 3 \
  'PhysicalProgramIdentityV1|InputOpacityOverSurfaceEncodedSrgb8V1|point_program_matches|source-over|source over|mathematical|математичес|replay' \
  crates/labcolors-core/src/appearance.rs \
  crates/labcolors-core/src/appearance_graph_tests.rs \
  crates/labcolors-core/src/appearance_replay_tests.rs \
  crates/labcolors-core/src/point_support.rs \
  crates/labcolors-core/contracts/point-support-*.json || true

echo '--- STRICT LEGACY IDENTIFIER ABSENCE ---'
rg -n -i '\b(ColorInputId|CompiledColorInputSlotV1|PaintSpec::Solid|CompiledPaintSpec::Solid|DuplicateColorInput|MissingPaintColorInput|DuplicateColorBinding|MissingColorBinding|UnexpectedColorBinding|bind_color_input|overwrite_color_at)\b' \
  crates/labcolors-core --glob '*.rs' || true

echo '--- COMPLETE CLEAN-SET RECEIPT VALIDATION ---'
python3 - <<'PY'
import hashlib, json
from pathlib import Path
root=Path('crates/labcolors-core/contracts/clean-set-srgb8-v1')
receipt=root/'receipt-v1.json'
data=json.loads(receipt.read_text())
bad=[]
for group in ('artifacts','source_files'):
    for e in data.get(group,[]):
        p=Path(e['path'])
        exists=p.is_file()
        raw=p.read_bytes() if exists else b''
        digest=hashlib.sha256(raw).hexdigest() if exists else 'MISSING'
        size=len(raw) if exists else None
        hashok=digest == e.get('sha256')
        sizeok=('bytes' not in e or size == e['bytes'])
        print(f'{group} {p}: exists={exists} size={size} declared_size={e.get("bytes")} size_ok={sizeok} hash_ok={hashok}')
        if not exists or not hashok or not sizeok: bad.append(str(p))
print('receipt_sha256=',hashlib.sha256(receipt.read_bytes()).hexdigest())
print('bad_entries=',bad)
PY

echo '--- RECEIPT VERIFIER CONTRACT (NON-EXECUTED) ---'
rg -n -C 5 'def verify_product_receipt|artifacts|source_files|sha256|bytes|PRODUCT_IDENTITY_VERIFIED' \
  scripts/verify_clean_set_receipt.py

echo '--- WASM RUN AND PR CHECK STATUS (READ-ONLY GITHUB METADATA) ---'
gh run view 30324408912 --repo Labpics-Team/lab-colors --json databaseId,status,conclusion,event,headSha,workflowName,createdAt,updatedAt,url,jobs 2>&1 || true
gh pr view 484 --repo Labpics-Team/lab-colors --json headRefOid,statusCheckRollup,url 2>&1 || true

Length of output: 95471


@lemone112 Полный review exact head 692b66c9fc3bbf605bdfc0aff666e85b673c67fd завершён — actionable findings нет.

Проверено:

  • PaintInputId теперь связывается с ID-free EncodedPointPaintValueV1 { source, opacity }; PaintId остаётся topology identity материализованного EncodedPointPaintV1.
  • Старые private ColorInputId/CompiledColorInputSlotV1, PaintSpec::Solid, bind_color_input, overwrite_color_at и отдельные source/alpha setters отсутствуют.
  • lower_bindings и hot finite overwrite понижают прежние source-кандидаты через EncodedPointPaintValueV1::opaque(...), то есть с alpha = 1 и без расширения finite-domain semantics.
  • Каждый PaintSpec::Opacity применяет ровно одно value.opacity().multiply(modifier) к предыдущему узлу DAG. Есть targeted oracle для black@0.25 на белом ([191; 3]), subnormal/underflow и property-test с точным left fold от base alpha.
  • Mathematical claim point-support не расширен: physical identity остаётся private, source-over certificate/replay сохраняет тот же composition profile; public program.rs, program_identity.rs и lib.rs не менялись.
  • Clean-set receipt: все объявленные artifact sizes/SHA-256 совпали с рабочим деревом, а receipt-v1.json совпал с внешним SHA pin 2cdb…024cc0.
  • WASM receipt корректно заявляет свой ограниченный scope: exact Linux size, zero headroom и ссылку на CI run. Он не выдаётся за отдельный content-hash receipt артефакта.
  • На текущем exact head успешны CI-проверки WASM build/headless/size, core tests, MSRV, clippy/rustfmt, docs, audit и Node consumer floor. Предыдущий run 30324408912 действительно падал только на stale size receipt до rebind.
✅ Action performed

Full review finished.

@lemone112
lemone112 merged commit 7d358fd into main Jul 28, 2026
9 of 10 checks passed
@lemone112
lemone112 deleted the agent/v3a-atomic-paint-input branch July 28, 2026 03:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant