docs: confirm save diagnostics preview publication and handoff

This commit is contained in:
2026-10-01 20:32:01 -07:00
parent e144e32e99
commit bc69c6d449
20 changed files with 716 additions and 10 deletions
+5 -2
View File
@@ -47,8 +47,11 @@ The [fresh scoped package validation](release-save-diagnostics-validation-202610
checks the actual extracted correction: accurate protected-destination refusal,
Save All/fresh Save As recovery, actual external-edit protection, fresh reopen,
complete source/model oracles and 23 server assertions. Independent final review
finds no material blocker in this artifact; publication is pending. It remains
outside the separately owned follow-up union.
finds no material blocker in this artifact. The [save-diagnostics Windows preview](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.save-diagnostics.20261001)
is published from evidence checkpoint `e144e32e9984477a258759a9dcc75f6e499fc224`;
[publication receipts](experiments/save-diagnostics-package-20261001/publication.md)
verify its ZIP, checksum and validation attachment. It remains outside the
separately owned follow-up union.
[Issue 46](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/46)
holds integration and delivery status. Live ownership and release coordination
remain in Gitea.
@@ -1,2 +1,4 @@
raw/** -text whitespace=cr-at-eol,-blank-at-eof
packet-review.md -text whitespace=cr-at-eol
publication/** -text whitespace=cr-at-eol,-blank-at-eof
publication-review.md -text whitespace=cr-at-eol
@@ -11,6 +11,8 @@ The exact ZIP is 34,191,561 bytes, SHA256
`8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7`.
The package itself contains the binaries, notices and documentation; this packet
contains the portable verification evidence, not duplicate executable archives.
[Confirmed publication receipts](publication.md) identify release 9 and all three
downloaded assets; they are outside the preceding raw inventory.
## Navigation
@@ -0,0 +1,57 @@
# Independent publication closure review
Status: final bounded publication closure review. No material blocker remains in publication receipts, staged publication inventory or the reviewed delivery-document claims. The stale contribution-note paragraph identified below has been corrected and rechecked.
This review uses captured receipts and uploader source plus the parent's reported independent Gitea MCP confirmation. It performs no new download, remote query, GUI, Cargo, server/REST operation or Gitea mutation. Only this report was written, outside both raw and publication inventories.
## Publication identity and uploader scope
The upload and publish receipts agree on release **9**, tag `v0.2.0-preview.save-diagnostics.20261001`, checkpoint `e144e32e9984477a258759a9dcc75f6e499fc224`, and the same three asset IDs, sizes and hashes. Upload records draft true; publish records draft false. The executed uploader asserts prerelease true before and after publishing and exact notes equality afterward. The parent separately reports MCP reads confirming release 9's target/state and unchanged targets/state of releases 7/8. I did not independently repeat those network reads. The compact JSON receipt does not itself include a prerelease field or the complete returned release object; the script assertions and separately reported MCP checks supply that portion of the evidence.
The captured uploader checks the new tag, expected source and draft state, uploads missing assets without a delete/replace path, and accepts a pre-existing same-name asset only after exact download identity. Publish requires the expected asset name set, reads back all three bytes before changing the new draft, PATCHes only draft/prerelease/body, and then checks published state, exact notes and tag-to-release identity. It does not update an old release/tag or infer a new build. Redirects are rejected, and the captured helper contains credential lookup code but no credential value. I did not execute it or read its credential source.
The two receipt sets preserve identical identities:
| Asset | Bytes | SHA256 |
| --- | --- | --- |
| 36: ZIP | 34,191,561 | `8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7` |
| 37: checksum | 150 | `de08984ea2cbaf95b6241ac817f1ad8459a0b863adf7ee9fe51de0834bcd2d54` |
| 38: VALIDATION.md | 2,930 | `de5ecaf07b5a0014318e809cea152c738dfdfc55ff0aa8ed3d7ef78b701df9e4` |
I hashed the existing local ready01 assets and matched those receipt identities, without downloading or re-extracting the archive. Draft attachment URLs and published release download URLs differ as expected; asset IDs and bytes remain the same. This review corroborates the captured successful readback, not indefinite future availability or anonymous access.
## Independent local/index checks
`publication/files.json` contains **12 records / 31,561 bytes**. The directory contains those 12 files plus the inventory itself. All recorded lengths and SHA256 values match, and all 12 copied records match their local originals byte-for-byte. All 13 publication directory files, publication.md, packet README/attributes, STATE and release-validation text match their staged blobs exactly: 18 exact staged comparisons passed.
The ordinary contribution note is intentionally outside captured-byte attributes. Its working file had CRLF while its staged blob had LF, with identical normalized content. My initial blanket byte-equality assertion stopped there; a read-only comparison established exactly 142 CRLF conversions and no content change. Raw/publication byte checks remained exact. This was a reviewer assumption about normal document normalization, not weakened evidence preservation.
The parent attribute update applies byte preservation only to `publication/**`; the original raw inventory is unchanged and there is no staged raw-file delta. The current closure review belongs outside either inventory and does not cause recursive manifest edits.
## Tooling failures are preserved, not erased
The first asset preparer requires a non-existing destination. The previous input-preparation step had created an empty scaffold, so refusal before writing assets was the intended guard. The fresh-preparation helper explicitly verifies and preserves that empty scaffold. Independent byte comparison confirms the ready01 preparer and uploader differ from their originals only in the destination-directory literal. Clean-checkpoint/source/archive guards remain unchanged.
The captured `correct-validation-path.py` checks for two actual backslashes before its first write. The portable validation contains exactly one actual separator and zero doubled occurrences in the backend invocation. The failed assertion therefore prevented the proposed unnecessary correction. The copied/uploaded validation bytes retain their original pinned hash. The publication narrative accurately distinguishes JSON display escaping from raw command bytes and does not present the failed checker as a product defect or success.
## Published notes and documentation scope
The exact release notes and portable validation describe the bounded Save As diagnostic change, prior compact Help, separate desktop/server/documentation identities, reused development binaries, 29 targeted checks and the actual native/server evidence. They preserve companion-copy limitations, forced-server-termination scope, one-account Windows/runtime constraints, and the absence of new Linux/full-suite/complete-OA-SA acceptance. The immutable link to the evidence checkpoint is appropriate even though that checkpoint's original validation predated publication; the later publication page explains this chronology explicitly.
STATE and the release-validation update accurately replace publication-pending language with the confirmed release link and captured delivery evidence. They do not claim the separately owned follow-up union, issue closure, Wiki update or future documentation commit/push already happened.
Resolved finding: the contribution note initially retained a closing paragraph saying no packaged #46 release was claimed and packaged delivery remained pending, despite its updated opening linking confirmed publication. The parent changed the section to “Contribution limits and subsequent delivery,” explicitly limited the old review to its original scope, linked later package validation/publication, and recorded release 9 delivery. I re-read the affected paragraph and verified staged content matches the working text under normal LF normalization. Only broader follow-up coordination points to Gitea; no versioned live issue-closure ledger was added. The raw historical review remains unchanged.
## Key captured identities
- Publication inventory: `319d742dd2694347d0a3b4157ee999618160a58694d935f4f33a47fcf30f36a0`.
- Publish readback: `ee4b8e0c1f17a30397441d6e8c87d0b2bc21630e0a4ef43d2299168846994797`.
- Upload readback: `85a8bc2df346b477bacdf3001b10a09304536e0fc1b918f0672d0538343590be`.
- Executed uploader: `8e0ca5da598e351f8146cdffcd3e1188726bf7dd3bb7c84ca9119559f7f1afb6`.
- Exact release notes: `ce860446855d28d471088b24aa816c42ac23e8e2f8eab4c9856731d8935b8e72`.
- Publication narrative: `bce0ff32f3bd2b6435c52cf0d4e381669d75ce0d6a97907eba97ef5c5539b6cb`.
- STATE: `a3184bb2bc75fe008453a1d734663dcd24a85bcdc901aed4c0bebef8a190aa6e`.
- Release validation: `4a97dc063f8a37f3e1a978ae9a840418b9b53fa87b8ea47db837d03723e7b86f`.
- Corrected contribution note, staged LF bytes: `29bc5647d85392c7fad5a1e34523e59b64d0c5a71a2d1bed9537d18245ccf47b`; working CRLF bytes: `6950b045466c4d42f1b3521b43ad4dab95fa1afb8a852bd3404131c543a611fd`.
The earlier exact-artifact scoped preview acceptance remains supported. Publication confirmation adds delivery evidence, not new runtime or semantic acceptance. Parent retains final delivery-document commit/push, #46 closure and Wiki coordination.
@@ -0,0 +1,61 @@
# Confirmed save-diagnostics preview publication
[Gitea release 9](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.save-diagnostics.20261001)
is published, draft false / prerelease true. Its immutable tag/evidence checkpoint
is `e144e32e9984477a258759a9dcc75f6e499fc224`. Desktop source `0e83157e`, reused
server source `715036e`, and package documentation `ef28f178` retain their
distinct provenance in the [verified release record](../../release-save-diagnostics-validation-20261001.md).
This is scoped #46 delivery, not complete OA/SA or the separately owned union.
The new draft's three assets were uploaded without replacing anything, downloaded
and matched before publication. Publishing rechecked all three downloads,
updated only this new draft, and confirmed exact notes/tag/source, draft false
and prerelease true. A separate Gitea MCP read confirms the published release
target. Releases 7/8 still have their original targets and published prerelease
state; no old tag, release body or asset was modified.
| Asset ID | File | Bytes | SHA256 |
| --- | --- | --- | --- |
| 36 | Studio ZIP | 34,191,561 | `8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7` |
| 37 | ZIP checksum | 150 | `de08984ea2cbaf95b6241ac817f1ad8459a0b863adf7ee9fe51de0834bcd2d54` |
| 38 | VALIDATION.md | 2,930 | `de5ecaf07b5a0014318e809cea152c738dfdfc55ff0aa8ed3d7ef78b701df9e4` |
[Upload readback](publication/upload-readback.json),
[published readback](publication/publish-readback.json),
[exact published notes](publication/release-notes.md) and
[portable validation](publication/VALIDATION.md) retain the full download URLs,
identities and source scopes. [File identities](publication/files.json) cover
the 12 copied publication records/helpers. The earlier raw packet remains exact
and separately inventoried; later publication records are outside that inventory.
[Independent publication-record review](publication-review.md) reconciles all
copied records with their originals and staged bytes. Its stale contribution-note
finding was corrected and rechecked before this delivery checkpoint.
Commands used bundled Python from the recorded environment:
```powershell
python .local/package46/prepare-release-assets.py
python .local/package46/prepare-release-notes.py
python .local/package46/prepare-fresh-release-assets.py
python .local/package46/prepare-release-assets-ready01.py
python .local/package46/release-assets-ready01.py upload 9 e144e32e9984477a258759a9dcc75f6e499fc224
python .local/package46/release-assets-ready01.py publish 9 e144e32e9984477a258759a9dcc75f6e499fc224
```
The first preparation failed safely: the input preparation helper had already
created an empty `release-assets` scaffold, while the asset preparer required a
new directory. No file was overwritten. Root verified that scaffold was empty,
preserved it and the failed helper, then used a new `release-assets-ready01`
directory with unchanged artifact/clean-source guards. A separate draft was
created but remained unpublished until assets passed.
A parent check mistakenly read JSON display escaping as two actual backslashes
in the backend command. The [failed checker](publication/correct-validation-path.py)
asserted before any write. A subsequent raw-byte check confirmed exactly one
backslash and zero doubled separators in the portable validation. No correction
was needed; the originally prepared file was uploaded unchanged. These are
preserved tooling assumptions, not product defects or weakened gates.
All runtime/compiler/independent review claims retain their preceding source and
environment limits. Publication establishes artifact availability and integrity;
it adds no new GUI/REST, Linux, full-suite, clean-machine or complete-release claim.
@@ -0,0 +1,49 @@
# Save diagnostics Windows preview validation
The [verified scope, evidence and exact build/run instructions](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/e144e32e9984477a258759a9dcc75f6e499fc224/harness/release-save-diagnostics-validation-20261001.md)
are authoritative. This attachment links that immutable release/evidence checkpoint.
Desktop source: 0e83157e09d52e6152df91208e41693b62da2d46.
Unchanged reused server source: 715036e132677dd2bc2fb37ed316d93dc9987aec.
Packaged documentation source: ef28f1784efe6717b0ca72c0eb3c97bc30ebfe47.
Release/evidence checkpoint: e144e32e9984477a258759a9dcc75f6e499fc224.
Windows gnullvm dev/unoptimized builds, debug assertions enabled.
ZIP: 34,191,561 bytes; SHA256
`8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7`.
Extract the complete folder and launch `arcadia-studio.exe`, keeping
`libunwind.dll` beside both executables. Read `START-HERE.txt`.
Copy the complete example before editing. Save All updates the loaded source.
Save As preserves includes and needs a fresh source destination; needed
companions/artifacts require separate copying. Protected destination conflicts
now have accurate wording and recovery guidance; genuine observed external edits
retain their external-change diagnosis.
Optional backend in a writable working directory:
```powershell
.\arcadia-server.exe --bind 127.0.0.1:8787 --data-dir C:/ArcadiaModels/server
```
See packaged docs/server.md and docs/api.rst for REST/deployment/authentication.
No remote deployment is claimed.
The unchanged desktop source has 29 targeted save checks, formatting, strict
Clippy, GUI build and independent contribution review. Fresh packaging/extraction
and source identities pass. Two actual extracted desktop processes exercise
Apply, accurate refusal, Save All/fresh Save As recovery, real external-change
protection, fresh reopen and no-op Save All, with complete 37-file byte oracles
and complete 30-file parsed Project/source comparisons. Both desktop processes
exit 0 with empty logs and all 565 package files unchanged. Fresh server testing
passes 23 checks, including exact OpenAPI, Unicode/CRLF, stale 412 and acknowledged
write persistence after an owned forced restart, not graceful/power-loss testing.
Independent artifact/source/native/server/claims review passes for this scope.
This is an unfinished scoped Windows development preview, not the complete
first OA/SA release or the separately owned follow-up union. Dense diagrams,
Scenario adapters, calculations/constraints, maintained libraries and broader
accessibility/DPI remain unfinished. Native testing used one existing account/
machine at 1442×932 with system-only child PATH. No full-suite rerun, second clean
machine, minimum-size package trial or Linux validation is claimed. Linux/WSL
remains user-deferred. Prior releases remain unchanged.
@@ -0,0 +1,16 @@
from pathlib import Path
root = Path(__file__).resolve().parent
target = root / 'release-assets-ready01/VALIDATION.md'
data = target.read_bytes()
before = b'.' + bytes([92, 92]) + b'arcadia-server.exe --bind'
after = b'.' + bytes([92]) + b'arcadia-server.exe --bind'
assert data.count(before) == 1
target.write_bytes(data.replace(before, after))
for name in ['prepare-release-assets.py', 'prepare-release-assets-ready01.py']:
path = root / name
data = path.read_bytes()
before = b'.' + bytes([92]) * 4 + b'arcadia-server.exe --bind'
after = b'.' + bytes([92]) * 2 + b'arcadia-server.exe --bind'
assert data.count(before) == 1
path.write_bytes(data.replace(before, after))
print('Corrected only native backend command separator in local pre-upload validation and its preparers. Archive/checksum unchanged.')
@@ -0,0 +1,50 @@
{
"correct-validation-path.py": {
"bytes": 831,
"sha256": "229ac6675be1c2a02f407d77483aba352d4218c7627d4ebf19b604fec8b33001"
},
"prepare-fresh-release-assets.py": {
"bytes": 981,
"sha256": "7d3dadb28c16cf0e1ffd723566f2ff5958e28fc1a1359bc4ae4918c6f85a858b"
},
"prepare-release-assets-ready01.py": {
"bytes": 4295,
"sha256": "708e6085c10136c79bf5d9e2709a86d1b7eb0ddb5e43b0b37a349d004cdf3a85"
},
"prepare-release-assets.py": {
"bytes": 4287,
"sha256": "5aea94dc90706a5034a92e3754795f41b3329319fe25fae306a52a5ff136d44b"
},
"prepare-release-notes.py": {
"bytes": 3527,
"sha256": "734f4483f9f3ac9e21955a64a53e05f5979fcbb12432bb39bd4a23a50e642201"
},
"prepare-release-upload.py": {
"bytes": 514,
"sha256": "95dc5b8162d4b27a1ac89153b8083b419f0d2d0ba3334de7d4f378534673279e"
},
"publish-readback.json": {
"bytes": 1548,
"sha256": "ee4b8e0c1f17a30397441d6e8c87d0b2bc21630e0a4ef43d2299168846994797"
},
"release-assets-ready01.py": {
"bytes": 4163,
"sha256": "8e0ca5da598e351f8146cdffcd3e1188726bf7dd3bb7c84ca9119559f7f1afb6"
},
"release-assets.py": {
"bytes": 4155,
"sha256": "fbba18c91ab491e9147393cba2ad1a4cb7b02908c8909b27179a76783fc987af"
},
"release-notes.md": {
"bytes": 3099,
"sha256": "ce860446855d28d471088b24aa816c42ac23e8e2f8eab4c9856731d8935b8e72"
},
"upload-readback.json": {
"bytes": 1231,
"sha256": "85a8bc2df346b477bacdf3001b10a09304536e0fc1b918f0672d0538343590be"
},
"VALIDATION.md": {
"bytes": 2930,
"sha256": "de5ecaf07b5a0014318e809cea152c738dfdfc55ff0aa8ed3d7ef78b701df9e4"
}
}
@@ -0,0 +1,14 @@
from pathlib import Path
root = Path(__file__).resolve().parent
assert (root / 'release-assets').is_dir() and not list((root / 'release-assets').iterdir()), 'The prior scaffold must still be empty; preserve it.'
source = (root / 'prepare-release-assets.py').read_text(encoding='utf-8')
before = "target = root / 'release-assets'"
assert source.count(before) == 1
with (root / 'prepare-release-assets-ready01.py').open('x', encoding='utf-8', newline='\n') as f:
f.write(source.replace(before, "target = root / 'release-assets-ready01'"))
uploader = (root / 'release-assets.py').read_text(encoding='utf-8')
before = "assets = root/'release-assets'"
assert uploader.count(before) == 1
with (root / 'release-assets-ready01.py').open('x', encoding='utf-8', newline='\n') as f:
f.write(uploader.replace(before, "assets = root/'release-assets-ready01'"))
print('Prepared fresh output-directory variants; original empty scaffold and failed helper preserved. No network requests.')
@@ -0,0 +1,71 @@
"""Prepare pinned portable assets after the reviewed evidence checkpoint is committed."""
from pathlib import Path
import hashlib, shutil, subprocess
root = Path(__file__).resolve().parent
repository = root.parent.parent
assert repository.resolve() == Path('C:/ar-save-01a0d717').resolve()
assert not subprocess.check_output(['git', 'status', '--porcelain'], cwd=repository, text=True).strip()
checkpoint = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=repository, text=True).strip()
assert subprocess.check_output(['git', 'diff', '--name-only', 'ef28f1784efe6717b0ca72c0eb3c97bc30ebfe47', checkpoint, '--', 'crates', 'Cargo.toml', 'Cargo.lock', 'docs', 'scripts', 'examples', 'README.md', 'LICENSE'], cwd=repository, text=True).strip() == ''
record = repository / 'harness/release-save-diagnostics-validation-20261001.md'
assert record.is_file()
target = root / 'release-assets-ready01'
target.mkdir(exist_ok=False)
name = 'ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip'
archive = root / 'dist' / name
assert archive.stat().st_size == 34191561
assert hashlib.sha256(archive.read_bytes()).hexdigest() == '8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7'
for filename in [name, name + '.sha256']:
shutil.copyfile(root / 'dist' / filename, target / filename)
(target / 'VALIDATION.md').write_text(f'''# Save diagnostics Windows preview validation
The [verified scope, evidence and exact build/run instructions](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/{checkpoint}/harness/release-save-diagnostics-validation-20261001.md)
are authoritative. This attachment links that immutable release/evidence checkpoint.
Desktop source: 0e83157e09d52e6152df91208e41693b62da2d46.
Unchanged reused server source: 715036e132677dd2bc2fb37ed316d93dc9987aec.
Packaged documentation source: ef28f1784efe6717b0ca72c0eb3c97bc30ebfe47.
Release/evidence checkpoint: {checkpoint}.
Windows gnullvm dev/unoptimized builds, debug assertions enabled.
ZIP: 34,191,561 bytes; SHA256
`8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7`.
Extract the complete folder and launch `arcadia-studio.exe`, keeping
`libunwind.dll` beside both executables. Read `START-HERE.txt`.
Copy the complete example before editing. Save All updates the loaded source.
Save As preserves includes and needs a fresh source destination; needed
companions/artifacts require separate copying. Protected destination conflicts
now have accurate wording and recovery guidance; genuine observed external edits
retain their external-change diagnosis.
Optional backend in a writable working directory:
```powershell
.\\arcadia-server.exe --bind 127.0.0.1:8787 --data-dir C:/ArcadiaModels/server
```
See packaged docs/server.md and docs/api.rst for REST/deployment/authentication.
No remote deployment is claimed.
The unchanged desktop source has 29 targeted save checks, formatting, strict
Clippy, GUI build and independent contribution review. Fresh packaging/extraction
and source identities pass. Two actual extracted desktop processes exercise
Apply, accurate refusal, Save All/fresh Save As recovery, real external-change
protection, fresh reopen and no-op Save All, with complete 37-file byte oracles
and complete 30-file parsed Project/source comparisons. Both desktop processes
exit 0 with empty logs and all 565 package files unchanged. Fresh server testing
passes 23 checks, including exact OpenAPI, Unicode/CRLF, stale 412 and acknowledged
write persistence after an owned forced restart, not graceful/power-loss testing.
Independent artifact/source/native/server/claims review passes for this scope.
This is an unfinished scoped Windows development preview, not the complete
first OA/SA release or the separately owned follow-up union. Dense diagrams,
Scenario adapters, calculations/constraints, maintained libraries and broader
accessibility/DPI remain unfinished. Native testing used one existing account/
machine at 1442×932 with system-only child PATH. No full-suite rerun, second clean
machine, minimum-size package trial or Linux validation is claimed. Linux/WSL
remains user-deferred. Prior releases remain unchanged.
''', encoding='utf-8')
print('Prepared three pinned release assets for checkpoint ' + checkpoint)
@@ -0,0 +1,71 @@
"""Prepare pinned portable assets after the reviewed evidence checkpoint is committed."""
from pathlib import Path
import hashlib, shutil, subprocess
root = Path(__file__).resolve().parent
repository = root.parent.parent
assert repository.resolve() == Path('C:/ar-save-01a0d717').resolve()
assert not subprocess.check_output(['git', 'status', '--porcelain'], cwd=repository, text=True).strip()
checkpoint = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=repository, text=True).strip()
assert subprocess.check_output(['git', 'diff', '--name-only', 'ef28f1784efe6717b0ca72c0eb3c97bc30ebfe47', checkpoint, '--', 'crates', 'Cargo.toml', 'Cargo.lock', 'docs', 'scripts', 'examples', 'README.md', 'LICENSE'], cwd=repository, text=True).strip() == ''
record = repository / 'harness/release-save-diagnostics-validation-20261001.md'
assert record.is_file()
target = root / 'release-assets'
target.mkdir(exist_ok=False)
name = 'ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip'
archive = root / 'dist' / name
assert archive.stat().st_size == 34191561
assert hashlib.sha256(archive.read_bytes()).hexdigest() == '8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7'
for filename in [name, name + '.sha256']:
shutil.copyfile(root / 'dist' / filename, target / filename)
(target / 'VALIDATION.md').write_text(f'''# Save diagnostics Windows preview validation
The [verified scope, evidence and exact build/run instructions](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/{checkpoint}/harness/release-save-diagnostics-validation-20261001.md)
are authoritative. This attachment links that immutable release/evidence checkpoint.
Desktop source: 0e83157e09d52e6152df91208e41693b62da2d46.
Unchanged reused server source: 715036e132677dd2bc2fb37ed316d93dc9987aec.
Packaged documentation source: ef28f1784efe6717b0ca72c0eb3c97bc30ebfe47.
Release/evidence checkpoint: {checkpoint}.
Windows gnullvm dev/unoptimized builds, debug assertions enabled.
ZIP: 34,191,561 bytes; SHA256
`8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7`.
Extract the complete folder and launch `arcadia-studio.exe`, keeping
`libunwind.dll` beside both executables. Read `START-HERE.txt`.
Copy the complete example before editing. Save All updates the loaded source.
Save As preserves includes and needs a fresh source destination; needed
companions/artifacts require separate copying. Protected destination conflicts
now have accurate wording and recovery guidance; genuine observed external edits
retain their external-change diagnosis.
Optional backend in a writable working directory:
```powershell
.\\arcadia-server.exe --bind 127.0.0.1:8787 --data-dir C:/ArcadiaModels/server
```
See packaged docs/server.md and docs/api.rst for REST/deployment/authentication.
No remote deployment is claimed.
The unchanged desktop source has 29 targeted save checks, formatting, strict
Clippy, GUI build and independent contribution review. Fresh packaging/extraction
and source identities pass. Two actual extracted desktop processes exercise
Apply, accurate refusal, Save All/fresh Save As recovery, real external-change
protection, fresh reopen and no-op Save All, with complete 37-file byte oracles
and complete 30-file parsed Project/source comparisons. Both desktop processes
exit 0 with empty logs and all 565 package files unchanged. Fresh server testing
passes 23 checks, including exact OpenAPI, Unicode/CRLF, stale 412 and acknowledged
write persistence after an owned forced restart, not graceful/power-loss testing.
Independent artifact/source/native/server/claims review passes for this scope.
This is an unfinished scoped Windows development preview, not the complete
first OA/SA release or the separately owned follow-up union. Dense diagrams,
Scenario adapters, calculations/constraints, maintained libraries and broader
accessibility/DPI remain unfinished. Native testing used one existing account/
machine at 1442×932 with system-only child PATH. No full-suite rerun, second clean
machine, minimum-size package trial or Linux validation is claimed. Linux/WSL
remains user-deferred. Prior releases remain unchanged.
''', encoding='utf-8')
print('Prepared three pinned release assets for checkpoint ' + checkpoint)
@@ -0,0 +1,55 @@
from pathlib import Path
import subprocess
root = Path(__file__).resolve().parent
repository = root.parent.parent
assert not subprocess.check_output(['git', 'status', '--porcelain'], cwd=repository, text=True).strip()
checkpoint = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=repository, text=True).strip()
body = f'''Save As destination collisions now explain that existing files are protected
and offer clear recovery: choose a fresh source directory, or use Save All at
the current entry. Genuine observed external edits keep their distinct
external-change diagnosis. This preview includes the prior compact diagram
controls and contextual Help; model/source/history semantics and REST contracts
are unchanged.
Download the Windows x86-64 Studio ZIP and checksum, verify SHA256 and extract
the whole folder. Launch `arcadia-studio.exe`, keeping `libunwind.dll` beside both
executables. Read `START-HERE.txt` and the attached `VALIDATION.md`. Copy a complete
example before editing; Save As copies model source with existing include paths,
so companion/external artifacts need separate copying. The optional REST server,
examples, offline guide and notices are included.
Desktop source **0e83157e09d52e6152df91208e41693b62da2d46**; packaged documentation
**ef28f1784efe6717b0ca72c0eb3c97bc30ebfe47**. The server is the unchanged released
715 artifact with recovered original build provenance and fresh tests of this
bundle's selected runtime. Both binaries use the dev/unoptimized profile;
packaging did not rebuild them.
Verified: 29 targeted desktop save checks, formatting, strict Clippy and matching
GUI build; exact archive/extraction/notice/documentation identities; fresh
independent source/artifact/native/REST/claims review. Two actual extracted
desktop sessions exercise Apply, accurate refusal and recovery, genuine external
edit protection, fresh Save As, reopen and no-op Save All. Complete 37-file byte
oracles and full 30-source-file parsed Projects allow only the declared Activity
name change. Both desktop processes exit 0 with empty logs and all 565 package
files unchanged. Fresh server testing passes 23 scoped assertions, including exact
OpenAPI, Unicode/CRLF, stale 412 and acknowledged-write persistence after owned
forced restart. No new full-suite or graceful/power-loss claim is made.
ZIP: **34,191,561 bytes**, SHA256
`8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7`.
This is an unfinished scoped Windows development prerelease, not the complete
OA/SA release or separately owned follow-up union. Dense diagrams, remaining
Scenario group adapters, quantities/calculations/constraints, maintained
libraries and broad accessibility/DPI remain unfinished. Native testing used
one existing account/machine at 1442×932 with system-only child PATH. The footer's
complete guidance was read with a pointer tooltip; keyboard-only access remains
untested. Linux/WSL remains user-deferred. Existing releases/tags remain unchanged.
[Exact validation, independent review, preserved evidence and build/run instructions](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/{checkpoint}/harness/release-save-diagnostics-validation-20261001.md)
identify the separate source/build/package scopes. This tag points to the
reviewed evidence-only checkpoint **{checkpoint}**, with production inputs unchanged.
'''
with (root / 'release-notes.md').open('x', encoding='utf-8', newline='\n') as f:
f.write(body)
print('Prepared release notes for ' + checkpoint)
@@ -0,0 +1,9 @@
from pathlib import Path
root = Path(__file__).resolve().parent
source = Path('C:/ar-compact-01a0d717/.local/package39/release-assets.py').read_text(encoding='utf-8')
before = 'v0.2.0-preview.compact-help.20261001'
assert source.count(before) == 1
source = source.replace(before, 'v0.2.0-preview.save-diagnostics.20261001')
with (root / 'release-assets.py').open('x', encoding='utf-8', newline='\n') as f:
f.write(source)
print('Prepared new-tag-only uploader/readback helper. No network requests performed.')
@@ -0,0 +1,28 @@
{
"mode": "publish",
"release_id": 9,
"tag": "v0.2.0-preview.save-diagnostics.20261001",
"source": "e144e32e9984477a258759a9dcc75f6e499fc224",
"url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.save-diagnostics.20261001",
"draft": false,
"assets": {
"ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip": {
"bytes": 34191561,
"sha256": "8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7",
"asset_id": 36,
"url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/download/v0.2.0-preview.save-diagnostics.20261001/ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip"
},
"ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip.sha256": {
"bytes": 150,
"sha256": "de08984ea2cbaf95b6241ac817f1ad8459a0b863adf7ee9fe51de0834bcd2d54",
"asset_id": 37,
"url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/download/v0.2.0-preview.save-diagnostics.20261001/ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip.sha256"
},
"VALIDATION.md": {
"bytes": 2930,
"sha256": "de5ecaf07b5a0014318e809cea152c738dfdfc55ff0aa8ed3d7ef78b701df9e4",
"asset_id": 38,
"url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/download/v0.2.0-preview.save-diagnostics.20261001/VALIDATION.md"
}
}
}
@@ -0,0 +1,68 @@
"""Upload/read back only this new scoped draft release; never replace assets."""
from pathlib import Path
import hashlib, json, sys, tomllib, urllib.error, urllib.parse, urllib.request, uuid
root = Path(__file__).resolve().parent
base = 'http://217.177.34.108:3000'
api = base + '/api/v1/repos/sorokin.oleg.edu/ARCADIA-Studio'
tag = 'v0.2.0-preview.save-diagnostics.20261001'
token = tomllib.loads((Path.home()/'.codex/config.toml').read_text(encoding='utf-8'))['mcp_servers']['gitea']['env']['GITEA_ACCESS_TOKEN']
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, *args, **kwargs):
raise RuntimeError('Unexpected redirect; credentials are not forwarded')
opener = urllib.request.build_opener(NoRedirect)
def request(url, method='GET', data=None, content_type=None):
assert url.startswith(base+'/')
headers = {'Authorization': 'token '+token}
if content_type: headers['Content-Type'] = content_type
with opener.open(urllib.request.Request(url, data=data, headers=headers, method=method), timeout=60) as response:
return response.read()
def get(url): return json.loads(request(url))
def pin(data): return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
mode, release_id, source = sys.argv[1:]
assert mode in ('upload', 'publish', 'verify')
release_url = api+'/releases/'+str(int(release_id))
release = get(release_url)
assert release['tag_name'] == tag and release['target_commitish'] == source
assert release['prerelease'] is True
assets = root/'release-assets-ready01'
files = sorted(p for p in assets.iterdir() if p.is_file())
assert len(files) == 3
records = {}
if mode == 'upload':
assert release['draft'] is True, 'Only a fresh draft is uploadable'
for p in files:
before = get(release_url+'/assets')
same = [a for a in before if a['name']==p.name]
assert len(same) <= 1
data = p.read_bytes()
if same:
assert pin(request(same[0]['browser_download_url'])) == pin(data), 'Existing asset differs; never replace'
asset = same[0]
else:
boundary = 'arcadia-'+uuid.uuid4().hex
payload = ('--'+boundary+'\r\nContent-Disposition: form-data; name="attachment"; filename="'+p.name+'"\r\nContent-Type: application/octet-stream\r\n\r\n').encode()+data+('\r\n--'+boundary+'--\r\n').encode()
asset = json.loads(request(release_url+'/assets?name='+urllib.parse.quote(p.name), 'POST', payload, 'multipart/form-data; boundary='+boundary))
downloaded = request(asset['browser_download_url'])
assert pin(downloaded) == pin(data), p.name
records[p.name] = {**pin(data), 'asset_id': asset['id'], 'url': asset['browser_download_url']}
print(json.dumps({'verified_asset': p.name, **pin(data)}), flush=True)
else:
existing = get(release_url+'/assets')
assert {a['name'] for a in existing} == {p.name for p in files}
for p in files:
asset = next(a for a in existing if a['name']==p.name)
assert pin(request(asset['browser_download_url'])) == pin(p.read_bytes())
records[p.name] = {**pin(p.read_bytes()), 'asset_id': asset['id'], 'url': asset['browser_download_url']}
if mode == 'publish':
assert release['draft'] is True
body = (root/'release-notes.md').read_text(encoding='utf-8')
request(release_url, 'PATCH', json.dumps({'draft': False, 'prerelease': True, 'body': body}).encode(), 'application/json')
release = get(release_url)
if mode in ('publish', 'verify'):
assert release['draft'] is False and release['prerelease'] is True
assert release['body'] == (root/'release-notes.md').read_text(encoding='utf-8')
assert get(api+'/releases/tags/'+urllib.parse.quote(tag, safe=''))['id'] == release['id']
receipt = {'mode': mode, 'release_id': release['id'], 'tag': tag, 'source': source, 'url': release['html_url'], 'draft': release['draft'], 'assets': records}
with (root/(mode+'-readback.json')).open('x', encoding='utf-8') as f:
json.dump(receipt, f, indent=2)
print(json.dumps({k:v for k,v in receipt.items() if k!='assets'}, indent=2), flush=True)
@@ -0,0 +1,68 @@
"""Upload/read back only this new scoped draft release; never replace assets."""
from pathlib import Path
import hashlib, json, sys, tomllib, urllib.error, urllib.parse, urllib.request, uuid
root = Path(__file__).resolve().parent
base = 'http://217.177.34.108:3000'
api = base + '/api/v1/repos/sorokin.oleg.edu/ARCADIA-Studio'
tag = 'v0.2.0-preview.save-diagnostics.20261001'
token = tomllib.loads((Path.home()/'.codex/config.toml').read_text(encoding='utf-8'))['mcp_servers']['gitea']['env']['GITEA_ACCESS_TOKEN']
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, *args, **kwargs):
raise RuntimeError('Unexpected redirect; credentials are not forwarded')
opener = urllib.request.build_opener(NoRedirect)
def request(url, method='GET', data=None, content_type=None):
assert url.startswith(base+'/')
headers = {'Authorization': 'token '+token}
if content_type: headers['Content-Type'] = content_type
with opener.open(urllib.request.Request(url, data=data, headers=headers, method=method), timeout=60) as response:
return response.read()
def get(url): return json.loads(request(url))
def pin(data): return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
mode, release_id, source = sys.argv[1:]
assert mode in ('upload', 'publish', 'verify')
release_url = api+'/releases/'+str(int(release_id))
release = get(release_url)
assert release['tag_name'] == tag and release['target_commitish'] == source
assert release['prerelease'] is True
assets = root/'release-assets'
files = sorted(p for p in assets.iterdir() if p.is_file())
assert len(files) == 3
records = {}
if mode == 'upload':
assert release['draft'] is True, 'Only a fresh draft is uploadable'
for p in files:
before = get(release_url+'/assets')
same = [a for a in before if a['name']==p.name]
assert len(same) <= 1
data = p.read_bytes()
if same:
assert pin(request(same[0]['browser_download_url'])) == pin(data), 'Existing asset differs; never replace'
asset = same[0]
else:
boundary = 'arcadia-'+uuid.uuid4().hex
payload = ('--'+boundary+'\r\nContent-Disposition: form-data; name="attachment"; filename="'+p.name+'"\r\nContent-Type: application/octet-stream\r\n\r\n').encode()+data+('\r\n--'+boundary+'--\r\n').encode()
asset = json.loads(request(release_url+'/assets?name='+urllib.parse.quote(p.name), 'POST', payload, 'multipart/form-data; boundary='+boundary))
downloaded = request(asset['browser_download_url'])
assert pin(downloaded) == pin(data), p.name
records[p.name] = {**pin(data), 'asset_id': asset['id'], 'url': asset['browser_download_url']}
print(json.dumps({'verified_asset': p.name, **pin(data)}), flush=True)
else:
existing = get(release_url+'/assets')
assert {a['name'] for a in existing} == {p.name for p in files}
for p in files:
asset = next(a for a in existing if a['name']==p.name)
assert pin(request(asset['browser_download_url'])) == pin(p.read_bytes())
records[p.name] = {**pin(p.read_bytes()), 'asset_id': asset['id'], 'url': asset['browser_download_url']}
if mode == 'publish':
assert release['draft'] is True
body = (root/'release-notes.md').read_text(encoding='utf-8')
request(release_url, 'PATCH', json.dumps({'draft': False, 'prerelease': True, 'body': body}).encode(), 'application/json')
release = get(release_url)
if mode in ('publish', 'verify'):
assert release['draft'] is False and release['prerelease'] is True
assert release['body'] == (root/'release-notes.md').read_text(encoding='utf-8')
assert get(api+'/releases/tags/'+urllib.parse.quote(tag, safe=''))['id'] == release['id']
receipt = {'mode': mode, 'release_id': release['id'], 'tag': tag, 'source': source, 'url': release['html_url'], 'draft': release['draft'], 'assets': records}
with (root/(mode+'-readback.json')).open('x', encoding='utf-8') as f:
json.dump(receipt, f, indent=2)
print(json.dumps({k:v for k,v in receipt.items() if k!='assets'}, indent=2), flush=True)
@@ -0,0 +1,45 @@
Save As destination collisions now explain that existing files are protected
and offer clear recovery: choose a fresh source directory, or use Save All at
the current entry. Genuine observed external edits keep their distinct
external-change diagnosis. This preview includes the prior compact diagram
controls and contextual Help; model/source/history semantics and REST contracts
are unchanged.
Download the Windows x86-64 Studio ZIP and checksum, verify SHA256 and extract
the whole folder. Launch `arcadia-studio.exe`, keeping `libunwind.dll` beside both
executables. Read `START-HERE.txt` and the attached `VALIDATION.md`. Copy a complete
example before editing; Save As copies model source with existing include paths,
so companion/external artifacts need separate copying. The optional REST server,
examples, offline guide and notices are included.
Desktop source **0e83157e09d52e6152df91208e41693b62da2d46**; packaged documentation
**ef28f1784efe6717b0ca72c0eb3c97bc30ebfe47**. The server is the unchanged released
715 artifact with recovered original build provenance and fresh tests of this
bundle's selected runtime. Both binaries use the dev/unoptimized profile;
packaging did not rebuild them.
Verified: 29 targeted desktop save checks, formatting, strict Clippy and matching
GUI build; exact archive/extraction/notice/documentation identities; fresh
independent source/artifact/native/REST/claims review. Two actual extracted
desktop sessions exercise Apply, accurate refusal and recovery, genuine external
edit protection, fresh Save As, reopen and no-op Save All. Complete 37-file byte
oracles and full 30-source-file parsed Projects allow only the declared Activity
name change. Both desktop processes exit 0 with empty logs and all 565 package
files unchanged. Fresh server testing passes 23 scoped assertions, including exact
OpenAPI, Unicode/CRLF, stale 412 and acknowledged-write persistence after owned
forced restart. No new full-suite or graceful/power-loss claim is made.
ZIP: **34,191,561 bytes**, SHA256
`8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7`.
This is an unfinished scoped Windows development prerelease, not the complete
OA/SA release or separately owned follow-up union. Dense diagrams, remaining
Scenario group adapters, quantities/calculations/constraints, maintained
libraries and broad accessibility/DPI remain unfinished. Native testing used
one existing account/machine at 1442×932 with system-only child PATH. The footer's
complete guidance was read with a pointer tooltip; keyboard-only access remains
untested. Linux/WSL remains user-deferred. Existing releases/tags remain unchanged.
[Exact validation, independent review, preserved evidence and build/run instructions](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/e144e32e9984477a258759a9dcc75f6e499fc224/harness/release-save-diagnostics-validation-20261001.md)
identify the separate source/build/package scopes. This tag points to the
reviewed evidence-only checkpoint **e144e32e9984477a258759a9dcc75f6e499fc224**, with production inputs unchanged.
@@ -0,0 +1,28 @@
{
"mode": "upload",
"release_id": 9,
"tag": "v0.2.0-preview.save-diagnostics.20261001",
"source": "e144e32e9984477a258759a9dcc75f6e499fc224",
"url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.save-diagnostics.20261001",
"draft": true,
"assets": {
"ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip": {
"bytes": 34191561,
"sha256": "8b4e353e075f22350a07794ee47a02cf85725501223299cf367134aa1f5b63b7",
"asset_id": 36,
"url": "http://217.177.34.108:3000/attachments/3d9dfc28-1040-499b-9735-6d387baa13a1"
},
"ArcadiaStudio-0.2.0-preview.save-diagnostics.20261001-x86_64-pc-windows-gnullvm.zip.sha256": {
"bytes": 150,
"sha256": "de08984ea2cbaf95b6241ac817f1ad8459a0b863adf7ee9fe51de0834bcd2d54",
"asset_id": 37,
"url": "http://217.177.34.108:3000/attachments/4b3244eb-d238-40c7-8818-5ca4ccf07a4b"
},
"VALIDATION.md": {
"bytes": 2930,
"sha256": "de5ecaf07b5a0014318e809cea152c738dfdfc55ff0aa8ed3d7ef78b701df9e4",
"asset_id": 38,
"url": "http://217.177.34.108:3000/attachments/f9b3e960-ac16-4648-a0a4-171da67e1fc7"
}
}
}
@@ -28,12 +28,15 @@ are unchanged. Neither binary was rebuilt during packaging.
ZIP: 34,191,561 bytes, 565 files. The [evidence packet](experiments/save-diagnostics-package-20261001/README.md) preserves exact provenance,
scripts/receipts, native captures, full source/model and HTTP records; its index
allows byte verification. This record is a pre-publication validation checkpoint;
release/tag and download readback are recorded only after confirmed publication.
allows byte verification. [Confirmed publication](experiments/save-diagnostics-package-20261001/publication.md)
delivers release 9 from evidence checkpoint `e144e32e9984477a258759a9dcc75f6e499fc224`,
with all three assets downloaded and matched. The tag's original validation
checkpoint predates publication; these later receipts do not rewrite its history.
The [fresh independent final review](experiments/save-diagnostics-package-20261001/raw/independent-review.md)
finds no material blocker in this exact bounded artifact. Parent collection and
offline and Git index verification pass for 164 indexed evidence files and
637 source inputs. Publication/download verification remains a separate gate.
637 source inputs. Publication/download verification is a separate completed gate
in the linked receipts.
The [independent packet closure review](experiments/save-diagnostics-package-20261001/packet-review.md)
also verifies every copied artifact against its original and passes the collected
verifier with staged-index/current-source checks.
+11 -5
View File
@@ -9,7 +9,8 @@ adds published compact Help evidence from `6ea7518e` without changing any crate,
Cargo, example, documentation or specification inputs relative to the tested code.
The bounded contribution validation below is complete. [Fresh scoped package
validation](release-save-diagnostics-validation-20261001.md) supplies later
extracted-runtime evidence; publication and broader integration remain separate.
extracted-runtime evidence and links confirmed scoped publication. Broader
follow-up integration remains separate.
Windows only; no Linux/WSL validation is claimed
or requested. The earlier #39 release remains separate and retains its old wording.
@@ -127,15 +128,20 @@ Its inventory and read-only `verify.py` allow another checkout to check hashes,
phase receipt byte sets and complete source/model equality without the local
binaries or live server store. Replaying native interaction is a separate check.
## Limits and remaining delivery
## Contribution limits and subsequent delivery
The longer persistent collision footer truncates; its pointer tooltip is readable.
Keyboard-only tooltip access remains untested. On a clean document, the header
“All changes saved” describes absence of local edits; it does not override the
explicit external-conflict footer. No exhaustive save-error, concurrency-race,
new-platform, packaged #46 release or complete OA/SA acceptance is claimed.
new-platform or complete OA/SA acceptance is claimed. The original contribution
review alone did not establish packaged delivery; the later
[fresh package validation](release-save-diagnostics-validation-20261001.md) and
[confirmed publication](experiments/save-diagnostics-package-20261001/publication.md)
supply that separate evidence.
The independent final review found no material blocker within this bounded
contribution. Source and its byte-preserved evidence are published; broader
integration, packaged delivery and issue closure remain pending in Gitea.
contribution. Source and its byte-preserved evidence are published, and scoped
release 9 delivers the correction. Broader follow-up integration and live
coordination remain in [Gitea issue 46](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/46).
Earlier #39 release 8 remains unchanged and does not contain this diagnostic fix.