Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ce02bbc
test(ci): add exact-head change-scope classifier
seonghobae Sep 3, 2026
c8c898b
test(ci): prove docs-only and code-bearing partition semantics
seonghobae Sep 3, 2026
52285e5
fix(ci): keep docs contracts while skipping Rust-heavy prose work
seonghobae Sep 3, 2026
044cd29
chore(ci): restore protected-main workflow ownership boundary
seonghobae Sep 3, 2026
077704e
test(ci): cover classifier CLI and conservative path edges
seonghobae Sep 3, 2026
0606fbe
test(ci): cover rename-aware scope classification
seonghobae Sep 3, 2026
51a1e81
fix(ci): preserve rename preimages in scope classifier
seonghobae Sep 3, 2026
910fd12
test(ci): reject truncated NUL change streams
seonghobae Sep 3, 2026
e08f686
fix(ci): fail closed on truncated NUL change streams
seonghobae Sep 3, 2026
a282707
test(ci): fail closed on mode-blind docs evidence
seonghobae Sep 3, 2026
149c15c
test(ci): require mode-aware raw diff evidence
seonghobae Sep 3, 2026
67460f0
fix(ci): require raw file modes for docs-only scope
seonghobae Sep 3, 2026
ccbf987
test(ci): reject impossible raw object identities
seonghobae Sep 4, 2026
75d1432
fix(ci): validate raw mode and object identity coupling
seonghobae Sep 4, 2026
49f94d4
test(ci): align raw-diff fixtures with object identity invariants
seonghobae Sep 4, 2026
4f604fe
test(ci): reject non-prose blobs under docs from lightweight scope
seonghobae Sep 4, 2026
7c87bc3
fix(ci): keep non-prose docs artifacts on Rust-heavy path
seonghobae Sep 4, 2026
c01c703
test(ci): fail closed on agent instruction control plane
seonghobae Sep 4, 2026
dc429da
fix(ci): keep agent instruction authority on full gate
seonghobae Sep 4, 2026
5860cdf
test(ci): reject nested agent instruction authority from prose lane
seonghobae Sep 4, 2026
5e88f9c
fix(ci): keep nested agent instruction files on full Rust path
seonghobae Sep 4, 2026
b1e2b8a
test(ci): reject unchanged blob modification metadata
seonghobae Sep 4, 2026
b2bd01b
fix(ci): reject impossible unchanged modification records
seonghobae Sep 4, 2026
819db4c
test(ci): reject noncanonical raw diff paths
seonghobae Sep 4, 2026
2a6b622
fix(ci): reject noncanonical raw diff paths
seonghobae Sep 4, 2026
6a84616
test(ci): keep Gemini instructions on full-Rust lane
seonghobae Sep 4, 2026
bd7046f
fix(ci): treat Gemini instructions as control plane
seonghobae Sep 4, 2026
f0d8a56
test(ci): reject noncanonical raw similarity scores
seonghobae Sep 4, 2026
b947dcd
fix(ci): require canonical raw similarity score spelling
seonghobae Sep 4, 2026
24ff89d
test(ci): reject identical rename/copy paths
seonghobae Sep 4, 2026
06d04b7
fix(ci): reject identical rename/copy paths
seonghobae Sep 4, 2026
c157cd1
fix(ci): require complete raw-diff object IDs
seonghobae Sep 4, 2026
b2a120f
test(ci): reject impossible rename similarity identities
seonghobae Sep 4, 2026
8f885ab
fix(ci): bind rename similarity to blob identity
seonghobae Sep 4, 2026
4137d72
test(ci): cover rename similarity identity boundaries
seonghobae Sep 4, 2026
a33f1da
test(ci): align rename fixtures with Git similarity
seonghobae Sep 4, 2026
e3a40a4
chore(ci): merge similarity boundary tests
seonghobae Sep 4, 2026
afe7738
docs(ci): record similarity identity contract
seonghobae Sep 4, 2026
ba0c1c9
chore(ci): adopt current protected main for partition contracts
seonghobae Sep 4, 2026
5fd4b3d
fix(ci): restore fail-closed change partition
seonghobae Sep 4, 2026
87c80f8
fix(ci): trust protected-base scope classifier
seonghobae Sep 4, 2026
b54a585
Merge remote-tracking branch 'origin/main' into codex/pr282-trusted-b…
seonghobae Sep 4, 2026
b64e070
fix(actions): avoid inactive PR runs (#289)
seonghobae Sep 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 58 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review, converted_to_draft, closed]
types: [opened, synchronize, reopened, ready_for_review]
push:
branches: [main]

Expand All @@ -14,9 +14,63 @@ concurrency:
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
scope:
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.draft == false }}
name: Classify CI scope
runs-on: ubuntu-24.04
outputs:
documentation_only: ${{ steps.scope.outputs.documentation_only }}
rust_required: ${{ steps.scope.outputs.rust_required }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
fetch-depth: 1
- name: Classify exact changed objects
id: scope
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
shell: bash
run: |
set -euo pipefail
if [ "${GITHUB_EVENT_NAME}" != "pull_request" ]; then
printf 'documentation_only=false\nrust_required=true\n' >> "${GITHUB_OUTPUT}"
exit 0
fi
test -n "${BASE_SHA}"
test -n "${HEAD_SHA}"
git fetch --no-tags --depth=1 origin "${BASE_SHA}"
if ! git cat-file -e "${BASE_SHA}:scripts/ci/classify_ci_change_scope.py"; then
# The protected base does not yet contain the trusted classifier.
printf 'documentation_only=false\nrust_required=true\n' >> "${GITHUB_OUTPUT}"
exit 0
fi
trusted_classifier="${RUNNER_TEMP}/classify_ci_change_scope.py"
git show "${BASE_SHA}:scripts/ci/classify_ci_change_scope.py" > "${trusted_classifier}"
git diff --raw -z --no-abbrev "${BASE_SHA}" "${HEAD_SHA}" |
python3 "${trusted_classifier}" >> "${GITHUB_OUTPUT}"

contracts:
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.draft == false }}
name: Repository and documentation contracts
needs: scope
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Check Python repository contracts
run: |
python3 -m compileall -q scripts tests
python3 -m unittest discover -s tests -p 'test_*.py'

rust:
if: ${{ github.event_name != 'pull_request' || (github.event.action != 'closed' && github.event.pull_request.draft == false) }}
name: Rust contracts
needs: [scope, contracts]
if: ${{ (github.event_name != 'pull_request' || github.event.pull_request.draft == false) && needs.scope.outputs.rust_required == 'true' }}
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -27,10 +81,6 @@ jobs:
with:
toolchain: 1.97.1
components: clippy,rustfmt
- name: Check Python repository contracts
run: |
python3 -m compileall -q scripts tests
python3 -m unittest discover -s tests -p 'test_*.py'
- name: Check formatting
id: formatting
run: cargo fmt --all --check
Expand Down Expand Up @@ -64,8 +114,9 @@ jobs:
run: cargo doc --locked --workspace --no-deps

coverage:
if: ${{ github.event_name != 'pull_request' || (github.event.action != 'closed' && github.event.pull_request.draft == false) }}
name: Production coverage
needs: [scope, contracts]
if: ${{ (github.event_name != 'pull_request' || github.event.pull_request.draft == false) && needs.scope.outputs.rust_required == 'true' }}
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand Down
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ All notable changes to OriginWeave are documented in this file. The format follo

## [Unreleased]

- Execute the documentation-only CI classifier from the protected base revision; the bootstrap PR fails closed to full Rust verification when that trusted classifier is not yet present.
- Require complete SHA-1 or SHA-256 object identities before exact-head Git raw-diff evidence may authorize lightweight documentation CI.
- Bind Git rename/copy similarity to blob identity so perfect scores require equal objects and lower scores require distinct objects.

- Refreshed the product-gap queue to 126 open pull requests (54 ready, 72 draft) after #190, #188, #185, #192, #182, #184, #115, #181, #116, #117, #118, #183, #114, #127, #112, #109, #186, #110, #108, #111, #174, and #113 were merged into their immediate stacked prerequisites. PRs #147, #146, #145, #144, #143, #142, #141, #139, #136, #132, #129, and #128 moved to ready after exact-head checks and thread review; these are queue-consolidation results, not protected-main shipment.

### Added
Expand Down Expand Up @@ -102,4 +106,4 @@ All notable changes to OriginWeave are documented in this file. The format follo
- The hourly product agent has no Git metadata or repository authority. A separate post-verification publisher opens one PR and cannot approve or merge it.
- The unprivileged OpenCode user is restricted to loopback egress during model execution, preventing runner-wide allow-listed endpoints from becoming direct source-exfiltration channels.

[Unreleased]: https://github.com/ContextualWisdomLab/OriginWeave/compare/main...HEAD
[Unreleased]: https://github.com/ContextualWisdomLab/OriginWeave/compare/main...HEAD
Loading
Loading