Repository navigation
Commit 0d6686e
committed
P-022 Stage 3: harden ACTION-BUILD for reproducibility, and record the ruling
OWNER RULING: ACTION-BUILD is ACCEPTED for Stage 3 as a declared TEMPORARY
distribution cost -- not a parity difference, not a semantic difference, not a
blocker. The contract is intact: the default is rust, Python stays the explicit
rollback until Stage 4, the Rust toolchain is installed by the Action rather
than assumed, and what is built is the production own-cli crate, never
own-shadow-engine or a test adapter. It is simply a heavy way to deliver a
binary -- a consumer today pays setup-python, setup-dotnet, setup-rust and a
cargo build to run a static analyzer. EXIT CONDITION: the first published
own-cli/Owen.Cli artifact, after which the Action downloads an immutable
platform binary. That is a post-Stage-3 packaging follow-up and deliberately
NOT Stage 4, which is about the Python distribution dependency.
Accepted, but the build had to be made to mean one thing over time. Three of its
four inputs were pinned and the fourth was not:
source pinned by the action ref the caller writes
dependencies pinned by rust/Cargo.lock ... only with --locked, which was absent
actions pinned by SHA
rustc FLOATING on `stable`
A caller who pins PhysShell/Own.NET@<tag> is entitled to have that tag mean one
thing. With a moving channel the same tag builds with whatever rustc shipped
that month, so a future release that compiled the crate differently -- or
refused it -- would change the behaviour of a revision nobody touched. rustc is
now pinned to 1.98.1, the concrete stable the qualification CI already runs, and
the build is `--locked` so an unchanged source revision cannot silently resolve
a different dependency graph. Verified: the locked build succeeds on this tree.
The cache-key comment claimed more than the key delivers, and the claim was
worth more than the key. It said a caller who bumps the pinned version gets a
rebuild rather than a stale binary; `github.action_ref` is whatever the caller
wrote, so a moving major tag like `v1` keeps ONE key across every commit it ever
points at. It is not a correctness bug -- Cargo rebuilds a local crate whose
sources changed, cache hit or not -- so the claim is withdrawn rather than
propped up with a digest-identity gate nobody needs: the cache is an
optimization and the Cargo build is authoritative.
Both properties are asserted, not just commented: tests/test_stage3_surfaces.py
refuses a floating channel and a build without --locked, and both are
mutation-proved. That control also learned, for the third time in this file,
that comments are not code: the prose justifying these pins contains the phrase
"cargo build" and was duly reported as an unlocked build.
Evidence recorded with it: `packaging-windows` moves from OWED to MEASURED. The
`owen CLI (gate A)` job on windows-latest concluded success at 2ecf501 carrying
the unconditional Stage-3 assertion that a bare `owen check` with an unusable
OWEN_PYTHON still finds OWN001 -- under `bash -e` with an explicit `exit 1`, so
success is that step passing. Nothing is carried over from Linux; that is
windows-latest reporting on itself. A new row records what the same run proved
about the Stage-1 controls there: 19 passed natively, including default-is-rust
and an unexpected child status mapped to exit 5 with the raw Windows-native
status retained. rollback-windows and cancellation-windows remain OWED.
Refs #262
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01376o4syzCem5aQ6NssxwX21 parent 6ed880d commit 0d6686e
4 files changed
Lines changed: 123 additions & 20 deletions
File tree
- docs
- evidence
- generated
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
111 | 111 | | |
112 | 112 | | |
113 | 113 | | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
114 | 130 | | |
115 | 131 | | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
116 | 145 | | |
117 | 146 | | |
118 | 147 | | |
119 | 148 | | |
120 | | - | |
| 149 | + | |
121 | 150 | | |
122 | 151 | | |
123 | 152 | | |
| |||
126 | 155 | | |
127 | 156 | | |
128 | 157 | | |
129 | | - | |
130 | | - | |
131 | | - | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
132 | 167 | | |
133 | 168 | | |
134 | 169 | | |
135 | 170 | | |
136 | 171 | | |
137 | 172 | | |
138 | 173 | | |
139 | | - | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
140 | 180 | | |
141 | 181 | | |
142 | 182 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
80 | | - | |
81 | | - | |
82 | | - | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
| |||
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
139 | 147 | | |
140 | 148 | | |
141 | 149 | | |
| |||
166 | 174 | | |
167 | 175 | | |
168 | 176 | | |
169 | | - | |
170 | | - | |
| 177 | + | |
| 178 | + | |
171 | 179 | | |
172 | 180 | | |
173 | 181 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
37 | | - | |
| 36 | + | |
| 37 | + | |
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
53 | | - | |
54 | 52 | | |
55 | 53 | | |
56 | 54 | | |
| |||
65 | 63 | | |
66 | 64 | | |
67 | 65 | | |
68 | | - | |
| 66 | + | |
69 | 67 | | |
70 | 68 | | |
71 | 69 | | |
72 | 70 | | |
73 | 71 | | |
74 | 72 | | |
75 | 73 | | |
| 74 | + | |
0 commit comments