Skip to content

Rectify: Contracted Update, Install, and Plugin Publication Transaction - #4423

Merged
Trecek merged 68 commits into
developfrom
impl-rectify-update-install-publication-20260729-204232
Jul 31, 2026
Merged

Rectify: Contracted Update, Install, and Plugin Publication Transaction#4423
Trecek merged 68 commits into
developfrom
impl-rectify-update-install-publication-20260729-204232

Conversation

@Trecek

@Trecek Trecek commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

Issue #4409 is a split-transaction defect, not a Cook artifact-selection defect. An update can advance the AutoSkillit package, decline the required Claude plugin refresh, lose that semantic decline at the CLI boundary, verify only package metadata, and then report success and restart. Claude later selects installed-plugin mode and correctly fails closed because the exact current-version artifact does not exist. Codex continues through generated-home mode and masks the skew.

Related issue: #4409 — Codex-scoped update silently skips Claude plugin refresh and breaks Cook

Closes #4409

Implementation Plan

Plan file: /home/talon/projects/generic_automation_mcp/.autoskillit/temp/rectify/rectify_update_install_publication_transaction_2026-07-29_192008.md

🤖 Generated with Claude Code via AutoSkillit

@Trecek Trecek left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AutoSkillit PR Review — Verdict: changes_requested

Comment thread src/autoskillit/cli/_install_contract.py
Comment thread src/autoskillit/cli/_install_snapshot/_snapshot.py
Comment thread src/autoskillit/cli/_install_snapshot/_snapshot.py Outdated
Comment thread src/autoskillit/cli/_marketplace.py Outdated
Comment thread src/autoskillit/cli/_marketplace.py Outdated
Comment thread src/autoskillit/cli/update/_transaction.py
Comment thread src/autoskillit/workspace/_install_state.py Outdated
Comment thread src/autoskillit/workspace/_installed_artifact.py
Comment thread src/autoskillit/workspace/_installed_artifact.py
Comment thread tests/workspace/test_installed_artifact.py Outdated

@Trecek Trecek left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AutoSkillit review: blocking findings detected. GitHub does not allow the PR author to request changes on their own PR; see the 13 inline comments for required fixes.

@Trecek Trecek left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AutoSkillit PR Review — Verdict: approved_with_comments

Five warning-level findings posted inline below. Five info-level observations (no-op callback, dead params, asymmetric result builder, self-alias re-export, dead nested install_result field) are summarised here:

  • L224 [info/cohesion] src/autoskillit/cli/update/_update_checks.py: [info] cohesion: _run_update_sequence keeps info and current in its signature only to discard them immediately via del info, current, and
  • L710 [info/cohesion] src/autoskillit/cli/_marketplace.py: [info] cohesion: Every other terminal in install() builds its result through _typed_result(...), which is also the single place findings are
  • L35 [info/cohesion] src/autoskillit/cli/_marketplace.py: [info] cohesion: from autoskillit.cli._install_snapshot import _installed_plugins_json_path as _installed_plugins_json_path is a pure re-exp
  • L141 [info/abstraction-surface] src/autoskillit/cli/update/_transaction.py: [info] abstraction-surface: UpdateTransactionResult.install_result (line 141) carries the nested InstallResult through every progress.finish
  • L284 [info/abstraction-surface] src/autoskillit/cli/_install_snapshot/_snapshot.py: [info] abstraction-surface: _InstallSnapshot.track_retirement (line 284) is a no-op method - body is a single docstring, _record_id paramete

Comment thread src/autoskillit/workspace/_installed_artifact.py Outdated
Comment thread src/autoskillit/workspace/_installed_artifact.py Outdated
Comment thread src/autoskillit/cli/_marketplace.py
class UpdateProcessStatus(IntEnum):
"""Stable public statuses for the explicit update process boundary."""

SUCCESS = int(InstallProcessStatus.SUCCESS)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] abstraction-surface: UpdateProcessStatus (lines 96-106) is a parallel enum that re-aliases every value as int(InstallProcessStatus.X) - eight of eight members map 1:1 to the public InstallProcessStatus enum defined in _install_contract.py:52-62, and the only production consumer (_update.py:36) compares the result against UpdateProcessStatus.SUCCESS only. The _PROCESS_STATUS_BY_OUTCOME table (lines 109-124) reproduces the same mapping that process_status_for_result(result.install_result) would already express: UpdateTransactionOutcome values are derived inside _map_install_result from InstallOutcome (lines 218-231) and then re-projected onto the identical InstallProcessStatus codes. The two enums and the lookup table form a duplicated policy layer with no observable behavior change - run_update_command could call process_status_for_result(result.install_result) directly and UpdateProcessStatus would vanish.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a design decision. Direct canonical install-status mapping cannot represent pre-install or upgrade failures where no install_result exists; changing the public boundary requires an explicit contract decision.

irreversible_pivot_crossed: bool = False


class _TransactionProgress:

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] abstraction-surface: _TransactionProgress (lines 148-189) maintains a strict phase-prepend state machine with two surface fields - phase_history (line 144) and irreversible_pivot_crossed (line 145) - that have zero production readers: grep across src/ for .phase_history and .irreversible_pivot_crossed returns no matches. Every enforcement call (enter(...) lines 257-477) and every record in UpdateTransactionResult carries this state, but the only readers are tests/cli/test_update_transaction.py asserting result.phase_history == UPDATE_TRANSACTION_PHASES. The IRREVERSIBLE_PIVOT_PHASE constant (line 80) likewise has only test-side readers. This is generic state machinery whose invariants cannot be violated by any caller because no caller observes the result - either expose the state to a real consumer (e.g., logging, retry routing) or remove the surface fields, the phase enum, and the progress wrapper in favor of plain function calls.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a design decision. Transaction history and pivot currently have no production reader, while progress.enter actively enforces phase and finalization ordering; surfacing or removing that audit state changes the contract.

@Trecek Trecek left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AutoSkillit PR Review — Follow-up: posting the 5 info-level findings inline as requested. Verdict remains approved_with_comments.

Comment thread src/autoskillit/workspace/_installed_artifact.py Outdated
Comment thread src/autoskillit/workspace/_installed_artifact.py Outdated
Comment thread src/autoskillit/cli/_marketplace.py
Comment thread src/autoskillit/cli/update/_update_checks.py Outdated
Comment thread src/autoskillit/cli/_marketplace.py Outdated
Comment thread src/autoskillit/cli/_marketplace.py Outdated
class UpdateProcessStatus(IntEnum):
"""Stable public statuses for the explicit update process boundary."""

SUCCESS = int(InstallProcessStatus.SUCCESS)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] abstraction-surface: UpdateProcessStatus (lines 96-106) is a parallel enum that re-aliases every value as int(InstallProcessStatus.X) - eight of eight members map 1:1 to the public InstallProcessStatus enum defined in _install_contract.py:52-62, and the only production consumer (_update.py:36) compares the result against UpdateProcessStatus.SUCCESS only. The _PROCESS_STATUS_BY_OUTCOME table (lines 109-124) reproduces the same mapping that process_status_for_result(result.install_result) would already express: UpdateTransactionOutcome values are derived inside _map_install_result from InstallOutcome (lines 218-231) and then re-projected onto the identical InstallProcessStatus codes. The two enums and the lookup table form a duplicated policy layer with no observable behavior change - run_update_command could call process_status_for_result(result.install_result) directly and UpdateProcessStatus would vanish.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a design decision. Direct canonical install-status mapping cannot represent pre-install or upgrade failures where no install_result exists; changing the public boundary requires an explicit contract decision.

Comment thread src/autoskillit/cli/update/_transaction.py
irreversible_pivot_crossed: bool = False


class _TransactionProgress:

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] abstraction-surface: _TransactionProgress (lines 148-189) maintains a strict phase-prepend state machine with two surface fields - phase_history (line 144) and irreversible_pivot_crossed (line 145) - that have zero production readers: grep across src/ for .phase_history and .irreversible_pivot_crossed returns no matches. Every enforcement call (enter(...) lines 257-477) and every record in UpdateTransactionResult carries this state, but the only readers are tests/cli/test_update_transaction.py asserting result.phase_history == UPDATE_TRANSACTION_PHASES. The IRREVERSIBLE_PIVOT_PHASE constant (line 80) likewise has only test-side readers. This is generic state machinery whose invariants cannot be violated by any caller because no caller observes the result - either expose the state to a real consumer (e.g., logging, retry routing) or remove the surface fields, the phase enum, and the progress wrapper in favor of plain function calls.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a design decision. Transaction history and pivot currently have no production reader, while progress.enter actively enforces phase and finalization ordering; surfacing or removing that audit state changes the contract.

Comment thread src/autoskillit/cli/_install_snapshot/_snapshot.py Outdated

@Trecek Trecek left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FALLBACK: I was unable to post inline comments (GitHub secondary rate limit blocked the batch POST for 24+ minutes). Posting summary as review body instead. This is a DEGRADED review.

AutoSkillit Review Findings

Verdict: changes_requested (2 critical blocking, 16 warning, 11 info, 1 decision; 30 total after suppressing 3 prior-resolved matches)

src/autoskillit/cli/_install_contract.py

  • L1 [info/slop]: Module docstring at L1-L5 ('dependency leaf: performs no I/O and imports only from stdlib') is boilerplate that restates
  • L107 [info/defense]: InstallResult.post_init allowlist duplicates _FAILED_STATUS_BY_KIND.keys() at [L107]. Iterate the registry to keep o
  • L116 [info/slop]: _FAILED_STATUS_BY_KIND and _OUTCOME_BY_STATUS are two parallel lookup tables; could be unified into a single enum-to-enu
  • L116 [warning/abstraction_surface]: Three parallel lookup tables encode install-outcome <-> process-status: _FAILED_STATUS_BY_KIND (L116-120), _OUTCOME_BY_S

src/autoskillit/cli/_install_snapshot/_snapshot.py

  • L31 [info/arch]: Two version authorities inside one install transaction. _installed_plugin_root(version=None) falls back to a lazy `fro
  • L51 [warning/arch]: New cross-subpackage reach into cli/update/ private internals. _InstallSnapshot.__init__ lazily imports `autoskillit
  • L180 [info/slop]: Multi-line comment at L180-L182 in _restore_owned_lease_entry explains the obvious rationale for keeping an inode-locked
  • L352 [warning/reachability]: The if lease_entry is None: branch is unreachable. self._lease_path is unconditionally added to self._paths in _init
  • L423 [warning/defense]: commit() catches Exception when removing staged directory at [L792]. Broad clause masks ValueError/TypeError/AttributeEr

src/autoskillit/cli/_marketplace.py

  • L271 [info/reachability]: _run_claude_admin raises ValueError when argv is empty, but both production call sites pass hard-coded non-empty tuples.
  • L281 [info/slop]: _typed_result helper (L281-L299) prints every finding to stdout as a side-effect; tests use capsys to assert findings -
  • L362 [warning/arch]: _verify_cleanup re-implements the nested settings.json hook-traversal that _hooks._evict_stale_autoskillit_hooks own
  • L414 [info/slop]: Old multi-paragraph prose about a dangling-pointer incident was deleted from _InstallSnapshot docstring at L243-L247 but
  • L509 [critical/bugs]: The new install transaction removed the with _InstallLock(): wrapper that previously serialized concurrent installs. _
  • L721 [critical/defense]: _compensated_result assigns failure_kind=primary.kind. If primary.kind is InstallFailureKind.ROLLBACK, the resulting Ins
  • L721 [warning/defense]: install() catches BaseException at [L1676] but _compensated_result can itself raise (e.g., from _restore_owned_lease_ent

src/autoskillit/cli/update/_transaction.py

  • L56 [info/slop]: MAINTENANCE_EXTRAS module-level dict at L56-L59 holds AUTOSKILLIT_SKIP* keys consumed only inside build_maintenance_en
  • L113 [warning/slop]: PROCESS_STATUS_BY_OUTCOME table reproduces the InstallProcessStatus mapping already expressible through process_status
  • L165 [warning/bugs]: _TransactionProgress.enter(RESULT_FINALIZATION) only guards against double-finalization; it does NOT enforce that all pr
  • L196 [info/slop]: _process_finding and _upgrade_failure are tiny shims used once each in the same file - inlining both would shrink the fi
  • L482 [warning/defense]: UpdateTransactionResult.verified_identity is populated from two sources depending on completion path: install_result.ver

src/autoskillit/core/_claude_env.py

  • L168 [warning/defense]: is_protected_maintenance_extra at [L3140-L3151] protects only AUTOSKILLIT{BACKEND,SESSION,CAMPAIGN,ORDER}. An attacker

src/autoskillit/workspace/_install_state.py

  • L232 [warning/arch]: Duplicated contract expressed as a bare string literal across a module boundary. `_record_matches_current_installed_arti

src/autoskillit/workspace/_installed_artifact.py

  • L110 [warning/slop]: from_managed_root reconstructs home via positional parents[5] rule - duplicates the managed-root layout that _install_sn
  • L180 [info/arch]: IL-1 workspace diagnostics embed CLI operator instructions (e.g., 'Run autoskillit install to reinstall the plugin.')
  • L312 [warning/reachability]: Defensive post-read re-validation `if identity.semantic_key != spec.semantic_key or identity.managed_path != spec.manage
  • L355 [warning/defense]: The no-create fast path at [L3761-L3766] uses is_symlink() OR exists() - a dangling symlink returns True from is_symlink
  • L355 [warning/defense]: _validate_supplied_lease catches (OSError, RuntimeError, ValueError) at [L3736] and reduces them to a single string find
  • L355 [warning/defense]: verify_installed_plugin_artifact catches BaseException to release the lease. While it re-raises at [L3853], pairing a Ba

tests/cli/test_doctor.py

  • L24 [info/slop]: _filesystem_snapshot helper at L24-L40 is a once-used fixture-style helper for a single parametrized test; same logic re

@Trecek Trecek left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved the findings from review 4824384286. GitHub placed that review in the top-level body after the inline batch hit a secondary rate limit, so this is the corresponding consolidated response.

Addressed 7 findings:

  • Centralized the unreadable installed-artifact check name (79f771d).
  • Moved fetch-cache path policy to the shared install-snapshot layer (5b617f7).
  • Shared hook cleanup traversal between eviction and verification (74edd47).
  • Derived failed-kind validation and reverse failed-status entries from one mapping, addressing two findings (16e0a7b).
  • Removed redundant installed-artifact identity revalidation (3f67834).
  • Preserved KeyboardInterrupt/SystemExit when compensation itself fails, with regression tests (257e16c).
  • Updated the existing line-based JSON-write allowlist after the helper move (80535c0).

I also investigated all 23 remaining findings and did not change code where the claim did not hold:

Rejected findings and evidence
  1. Workspace installation guidance is the intentional domain diagnostic surfaced unchanged by multiple callers.
  2. The install transaction always derives its target from explicit expected_version; there is no second transaction authority.
  3. RESULT_FINALIZATION is intentionally valid after every operational prefix, as enforced by transaction-progress tests.
  4. install() still holds _InstallLock across staging, leases, child commands, publication, and verification; _lock_owned only prevents nested acquisition.
  5. Update-saga outcomes such as FAILED_UPGRADE are not representable by the install-result mapping.
  6. The rollback comment documents the non-obvious inode-descriptor versus lexical-path distinction.
  7. The dependency-leaf docstring records a useful enforced architecture boundary.
  8. Moving managed-root inversion into the IL-3 CLI snapshot module would violate the import-layer boundary; InstallStateSpec.from_managed_root is already the validated inverse.
  9. The alleged relocated incident narrative is absent from the current marketplace file.
  10. _typed_result is the CLI presentation boundary; printing findings is required and tested behavior.
  11. The doctor and install-transaction filesystem helpers have different snapshot contracts and test domains.
  12. Core owns the allowed-key taxonomy; _MAINTENANCE_EXTRAS owns this caller's choice to set both guards.
  13. _upgrade_failure has multiple callers, and _process_finding serves both child processes.
  14. The staged-lease fallback converts future invariant corruption into recovery diagnostics instead of a secondary unpacking failure.
  15. Rejecting empty argv is a valid subprocess boundary invariant.
  16. Only the two install-contract mapping directions overlap; the update mapping belongs to a separate domain.
  17. No production _compensated_result caller supplies ROLLBACK as the primary failure kind.
  18. The dangling-symlink branch was read in reverse: lexical evidence prevents the no-create return and causes lease acquisition.
  19. Expected lease failures intentionally normalize into structured findings; no consumer branches on the original exception type.
  20. Verifier-owned leases must close for control-flow exceptions too, and close_preserving retains the primary outcome.
  21. Broad staged-directory cleanup suppression is deliberate post-commit finality with regression coverage.
  22. Failure paths preserve available child identity evidence, while successful registered-plugin paths require fresh verification; those sources are intentionally lifecycle-specific.
  23. Unsupported AUTOSKILLIT extras, including RUNTIME and DEBUG, are rejected by the independent two-key allowlist.

Validation is green at head 80535c0: 32,853 passed, 570 skipped, 27 expected failures; pre-commit run --all-files also passed. The four older unresolved inline discussion threads already contain prior autoskillit resolution replies and were left untouched by the idempotency guard.

Trecek added 19 commits July 31, 2026 09:07
Remove ambient executable discovery and require the typed install result at the CLI boundary.

Verification-Tree: 3e58b3ef88770563252501f2f31a1a8a60fde1fb

Task-Test-Check: PASS (32619 passed, 564 skipped, 26 xfailed)

Task-Test-Check-Log-SHA256: 55c9eff8c4f7386f4ae08a7d1e28c9afdd986450876da2915ca76c960e6b7a95

Task-Test-All: PASS (32619 passed, 564 skipped, 26 xfailed)

Task-Test-All-Log-SHA256: 648e8dbeea511fd83adf0f349a0ea9110a60bfeba16f09f9dc5a955224ff70e7

Pre-Commit: PASS

Pre-Commit-Log-SHA256: 3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998
Bind the final repository gates to the unchanged post-rebase tree for immutable audit evidence.

Verification-Tree: 1a22017

Task-Test-Check: PASS (32839 passed, 564 skipped, 27 xfailed)

Task-Test-Check-Log-SHA256: 6d58bee9ebce95596577d9f7dca0c08e7db1ac07aa060a4a3e27a2597fe98dcf

Task-Test-All: PASS (32839 passed, 564 skipped, 27 xfailed)

Task-Test-All-Log-SHA256: ad7b99a00d145f9963d8806b75675c8d89289aac56abc178790e6b60a38a44ef

Pre-Commit: PASS

Pre-Commit-Log-SHA256: 3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998

Prior-Audit-Authority-SHA256: 0ffce20b4bb0a365fa50e90f6d539db1ce35c754d56ab81a6c43134744b28812
Require fresh expected-version cache materialization, compensate lease-sidecar creation under the owned inode, and preserve distinct explicit update exit statuses. Extract install snapshot mechanics behind a documented private facade and keep lifecycle mutation ratchets exact.

Verification-Tree: b661b76
Task-Test-Check: PASS (32856 passed, 567 skipped, 27 xfailed)
Task-Test-Check-Log-SHA256: 39b4cb1a09e44d6868dbc49f781d879e5b5c736b3e7e701d33af1493399d0cdf
Task-Test-All: PASS (34327 passed, 634 skipped, 27 xfailed)
Task-Test-All-Log-SHA256: 59d0f67b39244b552c76c54ca02bcef0d92f41a0fa8efc8a2aab3c71910fd0a6
Pre-Commit: PASS
Pre-Commit-Log-SHA256: 3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998
Prior-Audit-Authority-SHA256: 5e6a805d2c75f7f5c9927c7d0375e4acf82039e2369e4800565d4f9613ad34fa
Restore direct-workspace temp directory shape during compensation, compose required real install children through coordinator and public update consumers, and make the shared fresh current-state verifier the sole doctor authority.

Verification-Tree: d6dab3c
Task-Test-Check: PASS (32868 passed, 568 skipped, 27 xfailed)
Task-Test-Check-Log-SHA256: c27eb2d212161cc1009c48db9c446a89f3d46456096f705267c1a110855a8cd0
Task-Test-All: PASS (34334 passed, 634 skipped, 27 xfailed)
Task-Test-All-Log-SHA256: ad9fd0a33215383b7693632635645fd9672c0018dc85aeb61e7d13bab5d169eb
Pre-Commit: PASS
Pre-Commit-Log-SHA256: 3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998
Prior-Audit-Authority-SHA256: f8c7be77a28fc3afd2c84a859b057f6fc377edd59473931201784da847ce003f
Remove the obsolete flat-cache version mismatch check so doctor uses the shared current install-state authority exclusively. Retire the duplicate tests and synchronize the documented check count.

Verification-Tree: fce0c7d

Task-Test-Check: PASS (32863 passed, 568 skipped, 27 xfailed); log-sha256=8adf2ead258bf470404e51776b66eb9f11d7168182c067eff143dd2028aa8165

Task-Test-All: PASS (34329 passed, 634 skipped, 27 xfailed); log-sha256=71548f2d92b703387a3007d258390b2223b5d15f81438f8a3bcc4d6798fa5574

Pre-Commit: PASS; log-sha256=3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998

Prior-Audit-Authority-SHA256: d0ffb715659135efd211000fb7fad433cc687770b592ef22e568daa8e9973fb9
Remove the disconnected metadata-only update verifier and its helper-only tests. Synchronize user-facing doctor documentation with the shared exact install-state authority and update the shifted schema-write ratchet coordinate.

Verification-Tree: 4afbd34

Task-Test-Check: PASS (32860 passed, 568 skipped, 27 xfailed); log-sha256=5680886e295d6246ff917ab55ab356f72356ef0ed1134236f6d055940a6e8e87

Task-Test-All: PASS (34326 passed, 634 skipped, 27 xfailed); log-sha256=d4f878a7dc02719721b098542bcf36757a847653f777549478b2dfa5ef5de1bd

Pre-Commit: PASS; log-sha256=3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998

Prior-Audit-Authority-SHA256: c60c4e64cb14c289e72922a7de75cb1c37dfc9be9c2f1f2e79de3eb3edfcda3e
Cover protected inherited environment families, log non-disclosure, and coordinator invocation from real temporary Git worktrees. Synchronize the doctor table with its orthogonal cache-integrity check.

Verification-Tree: b455d58

Task-Test-Check: PASS (32867 passed, 568 skipped, 27 xfailed); log-sha256=7627e1986703b262763106c9425238531a299d0bd34cb4298b35c41be5ef1086

Task-Test-All: PASS (34333 passed, 634 skipped, 27 xfailed); log-sha256=97a569c476e3d552ff808a37f05a54fea05fd8266b1f30869b5e012cbc90318a

Pre-Commit: PASS; log-sha256=3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998

Prior-Audit-Authority-SHA256: dc483cb7f38af44f77625f5d28cd7a73ee883ba61e0359f70c305aab9222fa4c
Synchronize the CLI and installation guides with run_doctor source numbering, check decomposition, and the complete backend/runtime table while preserving the shared install-state authority.

Verification-Tree: 2e744f5

Task-Test-Check: PASS (32867 passed, 568 skipped, 27 xfailed); log-sha256=e014dc6a482936ca76c47c80ba615644697ef1f22e8685299679313ee4b8a7bb

Task-Test-All: PASS (34333 passed, 634 skipped, 27 xfailed); log-sha256=90a7cd1691fdc455a01f70b9818b9598e516e76186f2a3e95fbff65419e30275

Pre-Commit: PASS; log-sha256=3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998

Prior-Audit-Authority-SHA256: d8843828601a40f1d7283dcf330fbdde0f9147128acc84d54ac988db53e42df6
Verification-Tree: a5d4b3b

Test-Check: 34336 passed, 634 skipped, 27 xfailed

Test-Check-SHA256: 29130c0cc345d427820f64cc2b87467e54d90e6b5716945ae7a045fda471f709

Test-All: 34336 passed, 634 skipped, 27 xfailed

Test-All-SHA256: da82b9db8bcb4acd07ff20c57d3bdb826afde96efbd429dde11351a242975cb1

Pre-Commit-SHA256: 3d5ddb6e5709e7a5ca872d3df964b6bf72355850c622aa7ed43e86f2df3f8998

Prior-Audit-Authority-SHA256: 04faaf600133ed2539d08bd14959b9fba6c140d3b2aafca4a31d7c1999fc1779
@Trecek
Trecek force-pushed the impl-rectify-update-install-publication-20260729-204232 branch from 093c33e to ffd0e9c Compare July 31, 2026 16:14
@Trecek
Trecek enabled auto-merge July 31, 2026 16:21
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