docs: align reconstruction termination contract #26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: ci | |
| on: | |
| push: | |
| pull_request: | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| commit-lint: | |
| name: commit messages | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| fetch-depth: 0 | |
| persist-credentials: false | |
| - name: Lint commit messages | |
| env: | |
| BEFORE_SHA: ${{ github.event.before }} | |
| CURRENT_SHA: ${{ github.sha }} | |
| EVENT_NAME: ${{ github.event_name }} | |
| PR_BASE_SHA: ${{ github.event.pull_request.base.sha }} | |
| PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} | |
| run: | | |
| if [ "$EVENT_NAME" = "pull_request" ]; then | |
| range="$PR_BASE_SHA..$PR_HEAD_SHA" | |
| elif [ "$BEFORE_SHA" != "0000000000000000000000000000000000000000" ] && git cat-file -e "$BEFORE_SHA" 2>/dev/null; then | |
| range="$BEFORE_SHA..$CURRENT_SHA" | |
| else | |
| range="HEAD~1..HEAD" | |
| fi | |
| tools/git/commit-lint.sh "$range" | |
| research: | |
| name: research records | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 | |
| with: | |
| python-version: "3.12" | |
| - name: Validate research records | |
| run: | | |
| pip install --quiet --requirement tools/research/requirements.txt | |
| tools/research/validate.sh | |
| rust: | |
| name: conformance harness | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 | |
| with: | |
| node-version: "24.20.0" | |
| cache: npm | |
| cache-dependency-path: | | |
| adapters/figma/plugin/package-lock.json | |
| tools/svelte-oracle/package-lock.json | |
| tools/automerge-oracle/package-lock.json | |
| - name: Install the pinned Rust toolchain | |
| run: | | |
| rustup toolchain install 1.98.0 --profile minimal --component rustfmt --component clippy | |
| rustup default 1.98.0 | |
| - name: Install Linux native dependencies | |
| run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev | |
| - name: Complete automated research and conformance loop | |
| run: cargo xtask all | |
| - name: Upload Gate B trial report | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: gate-b-report | |
| path: target/gate-b-report.json | |
| - name: Upload adapter coverage audit | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: adapter-coverage-report | |
| path: target/adapter-coverage-report.json | |
| - name: Upload direct dependency audit | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: dependency-audit-report | |
| path: target/dependency-audit-report.json | |
| - name: Upload diagnostic registry audit | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: diagnostic-registry-report | |
| path: target/diagnostic-registry-report.json | |
| - name: Upload workflow metadata audit | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: workflow-audit-report | |
| path: target/workflow-audit-report.json | |
| - name: Upload hostile-input measurements | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: hostile-input-report | |
| path: target/hostile-input-report.json | |
| - name: Upload automatic reduction evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: reduction-profile | |
| if-no-files-found: error | |
| path: | | |
| target/reduction-profile-report.json | |
| target/reduction-profile-fixture | |
| - name: Upload editor hostile-interaction evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: editor-hostile-input-report | |
| path: target/editor-hostile-input-report.json | |
| - name: Upload profile-zero performance measurements | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: performance-profile-report | |
| if-no-files-found: error | |
| path: | | |
| target/performance-profile-report.json | |
| target/criterion-smoke-report.json | |
| - name: Upload codec decision measurements | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: codec-benchmark-report | |
| path: target/codec-benchmark-report.json | |
| - name: Upload browser WebAssembly developer package | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: nuif-wasm-web | |
| if-no-files-found: error | |
| path: | | |
| target/nuif-wasm-web | |
| target/wasm-conformance-report.json | |
| - name: Upload MCP cross-surface evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: mcp-conformance-report | |
| if-no-files-found: error | |
| path: target/mcp-conformance-report.json | |
| - name: Upload portable resource profile evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: portable-resource-profile-reports | |
| if-no-files-found: error | |
| path: | | |
| target/package-resources-report.json | |
| target/image-resources-report.json | |
| target/font-resources-report.json | |
| - name: Upload live browser capture evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: live-browser-capture-report | |
| if-no-files-found: error | |
| path: | | |
| target/live-browser-capture-report.json | |
| target/layout-inference-report.json | |
| - name: Upload reconstruction evaluation contract | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: reconstruction-evaluation-report | |
| if-no-files-found: error | |
| path: target/reconstruction-evaluation-report.json | |
| - name: Upload reconstruction corpus integrity contract | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: reconstruction-corpus-audit-report | |
| if-no-files-found: error | |
| path: target/reconstruction-corpus-audit-report.json | |
| - name: Upload reconstruction provider manifest contract | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: reconstruction-provider-manifest-report | |
| if-no-files-found: error | |
| path: target/reconstruction-provider-manifest-report.json | |
| - name: Upload layout differential report | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: layout-differential-report | |
| path: target/layout-differential-report.json | |
| - name: Upload text pinning report | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: text-pinning-report | |
| path: target/text-pinning-report.json | |
| - name: Upload render profile report | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: render-profile-report | |
| path: target/render-profile-report.json | |
| - name: Upload editor authoring report and snapshot | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: editor-authoring-report | |
| path: | | |
| target/editor-authoring-report.json | |
| target/editor-authoring-snapshot | |
| - name: Upload native editor semantic and visual trial | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: editor-gui-trial | |
| path: target/editor-gui-trial | |
| - name: Upload user-scoped editor install trial | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: editor-install-trial | |
| path: target/editor-install-trial.json | |
| - name: Upload HTML and CSS synchronization evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: html-css-sync-report | |
| path: | | |
| target/html-sync-report.json | |
| target/html-sync-output.html | |
| target/html-sync-v0-report.json | |
| target/html-sync-v0-output.html | |
| target/html-sync-v0-editor-report.json | |
| target/html-sync-v0-editor-output.html | |
| - name: Upload SVG synchronization evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: svg-sync-report | |
| path: | | |
| target/svg-sync-report.json | |
| target/svg-sync-output.svg | |
| target/svg-sync-edited.nuif | |
| target/svg-sync-cli-report.json | |
| target/svg-sync-cli-output.svg | |
| - name: Upload DTCG synchronization evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: dtcg-sync-report | |
| path: | | |
| target/dtcg-sync-report.json | |
| target/dtcg-sync-output.tokens.json | |
| target/dtcg-sync-edited.nuif | |
| target/dtcg-sync-cli-report.json | |
| target/dtcg-sync-cli-output.tokens.json | |
| - name: Upload Penpot synchronization evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: penpot-sync-report | |
| path: | | |
| target/penpot-sync-report.json | |
| target/penpot-sync-output.penpot | |
| target/penpot-sync-edited.nuif | |
| target/penpot-sync-cli-report.json | |
| target/penpot-sync-cli-output.penpot | |
| - name: Upload React JSX synchronization evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: react-jsx-sync-report | |
| path: | | |
| target/react-sync-report.json | |
| target/react-sync-output.jsx | |
| target/react-sync-edited.nuif.json | |
| target/react-sync-cli-report.json | |
| target/react-sync-cli-output.jsx | |
| - name: Upload Svelte synchronization and compiler evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: svelte-static-sync-report | |
| if-no-files-found: error | |
| path: | | |
| target/svelte-sync-report.json | |
| target/svelte-sync-output.svelte | |
| target/svelte-sync-edited.nuif.json | |
| target/svelte-sync-cli-report.json | |
| target/svelte-sync-cli-output.svelte | |
| target/svelte-compiler-oracle-report.json | |
| - name: Upload Figma mapping and compiled-shell evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: figma-adapter-evidence | |
| if-no-files-found: error | |
| path: | | |
| target/figma-snapshot-report.json | |
| target/figma-plugin-shell-report.json | |
| target/figma-plugin-fixture-snapshot.json | |
| target/figma-plugin-fixture.nuif.json | |
| target/figma-plugin-fixture-report.json | |
| target/figma-plugin-plan-validation.json | |
| target/nuif-figma-plugin-review-shell | |
| - name: Upload behavior portability evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: behavior-portability | |
| if-no-files-found: error | |
| path: | | |
| target/behavior-portability-fixture.json | |
| target/behavior-portability-static-report.json | |
| target/behavior-portability-report.json | |
| target/behavior-package-fixture.nuif | |
| target/behavior-package-expected.json | |
| target/behavior-package-static-report.json | |
| target/behavior-package-report.json | |
| target/behavior-package-cli-report.json | |
| - name: Upload independent implementation evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: gate-g-independent-profile | |
| path: | | |
| target/gate-g-report.json | |
| target/gate-g-independent | |
| - name: Upload collaboration convergence evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: collaboration-profiles | |
| if-no-files-found: error | |
| path: | | |
| target/collaboration-report.json | |
| target/collaboration-structure-report.json | |
| target/collaboration-automerge-input.json | |
| target/collaboration-automerge-report.json | |
| - name: Upload verification artifact index | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: verification-manifest | |
| path: target/verification-manifest.json | |
| resource-profiles: | |
| name: resource profiles (${{ matrix.platform }}) | |
| runs-on: ${{ matrix.runner }} | |
| timeout-minutes: 30 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - platform: linux-x86_64 | |
| runner: ubuntu-latest | |
| - platform: windows-x86_64 | |
| runner: windows-latest | |
| - platform: macos-aarch64 | |
| runner: macos-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Install the pinned Rust toolchain | |
| shell: bash | |
| run: | | |
| rustup toolchain install 1.98.0 --profile minimal | |
| rustup default 1.98.0 | |
| - name: Install Linux native dependencies | |
| if: runner.os == 'Linux' | |
| run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev | |
| - name: Validate package, image, and font profiles | |
| run: | | |
| cargo xtask gate-i-package | |
| cargo xtask gate-i-image | |
| cargo xtask gate-i-font | |
| - name: Upload platform resource evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: portable-resource-profiles-${{ matrix.platform }} | |
| if-no-files-found: error | |
| path: | | |
| target/package-resources-report.json | |
| target/image-resources-report.json | |
| target/font-resources-report.json | |
| accessibility: | |
| name: web host browser oracles | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 | |
| with: | |
| node-version: "24.20.0" | |
| cache: npm | |
| cache-dependency-path: tools/accessibility-oracle/package-lock.json | |
| - name: Install the pinned Rust toolchain | |
| run: | | |
| rustup toolchain install 1.98.0 --profile minimal | |
| rustup default 1.98.0 | |
| - name: Compare portable semantics and behavior across three engines | |
| run: cargo xtask gate-web-hosts | |
| - name: Upload web host mapping evidence | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: accessibility-mapping-report | |
| if-no-files-found: error | |
| path: | | |
| target/accessibility-mapping-static-report.json | |
| target/accessibility-mapping-report.json | |
| target/accessibility-mapping-fixture.html | |
| target/accessibility-mapping-expected.json | |
| target/web-behavior-static-report.json | |
| target/web-behavior-report.json | |
| target/web-behavior-fixture.html | |
| target/web-behavior-expected.json | |
| native-editor: | |
| name: native-editor (${{ matrix.platform }}) | |
| runs-on: ${{ matrix.runner }} | |
| timeout-minutes: 45 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - platform: linux-x86_64 | |
| runner: ubuntu-latest | |
| - platform: windows-x86_64 | |
| runner: windows-latest | |
| - platform: macos | |
| runner: macos-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Install the pinned Rust toolchain | |
| shell: bash | |
| run: | | |
| rustup toolchain install 1.98.0 --profile minimal --component clippy | |
| rustup default 1.98.0 | |
| - name: Install Linux native dependencies | |
| if: runner.os == 'Linux' | |
| run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev | |
| - name: Check native editor targets | |
| run: cargo check -p nuif-editor --all-targets --all-features --locked | |
| - name: Test native editor and automation | |
| run: cargo test -p nuif-editor --all-targets --all-features --locked | |
| - name: Run semantic and visual editor trial | |
| run: cargo xtask editor-gui-trial | |
| - name: Exercise user-scoped source installation | |
| run: cargo xtask editor-install-trial | |
| - name: Build and verify native package | |
| run: cargo xtask editor-package | |
| - name: Validate macOS bundle metadata | |
| if: runner.os == 'macOS' | |
| run: plutil -lint target/dist/nuif-editor-*/NUIF\ Editor.app/Contents/Info.plist | |
| - name: Upload native package and editor evidence | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: native-editor-${{ matrix.platform }} | |
| if-no-files-found: error | |
| path: | | |
| target/dist/editor-package-manifest.json | |
| target/dist/*.tar.gz | |
| target/dist/*.zip | |
| target/editor-gui-trial/report.json | |
| target/editor-gui-trial/editor-shell.png | |
| target/editor-gui-trial/editor-file-menu.png | |
| target/editor-gui-trial/semantics.json | |
| target/editor-install-trial.json | |
| fuzz-smoke: | |
| name: bounded sanitizer fuzzing | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Install the pinned fuzz toolchain | |
| run: rustup toolchain install nightly-2026-08-28 --profile minimal --component rust-src | |
| - name: Install the pinned fuzz driver | |
| run: cargo +nightly-2026-08-28 install cargo-fuzz --version 0.13.2 --locked | |
| - name: Run every bounded fuzz contract | |
| env: | |
| NUIF_FUZZ_RUNS: "512" | |
| run: cargo +nightly-2026-08-28 xtask fuzz-smoke | |
| - name: Upload fuzz campaign report | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: fuzz-smoke-report | |
| if-no-files-found: error | |
| path: target/fuzz-smoke-report.json | |
| msrv: | |
| name: minimum Rust version | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Install the minimum Rust toolchain | |
| run: | | |
| rustup toolchain install 1.96.0 --profile minimal | |
| rustup default 1.96.0 | |
| - name: Install Linux native dependencies | |
| run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev | |
| - name: Check at rust-version | |
| run: cargo check --workspace --all-targets --locked | |
| workflow-security: | |
| name: workflow security | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Audit GitHub Actions workflows | |
| uses: zizmorcore/zizmor-action@3dc1ecc9bcb9e94e9b2c709687979e1298497054 # v0.6.2 | |
| with: | |
| advanced-security: false | |
| annotations: true | |
| persona: pedantic | |
| version: 1.29.0 | |
| deny: | |
| name: dependency policy | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: EmbarkStudios/cargo-deny-action@3c6349835b2b7b196a839186cb8b78e02f7b5f25 # v2.1.1 | |
| with: | |
| command: check |