Задания, отчёты и патчи, лежавшие в C:\Users\Ochenstarik\projects и в домашней папке, перенесены в agents/. Разложено по агентам там, где имя файла позволяло определить автора; остальное — в _salvage-2026-08-18/ и разбирается вручную. Патчи в notes/salvage-2026-08-18/ — незакоммиченная работа из брошенных рабочих копий: она существовала только на диске. Тяжёлое (релизные архивы, инсталляторы, наборы данных) в репозиторий не попало: оно лежит рядом, в Agent_projects/_archive и Agent_projects/_data. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
16 KiB
INDEPENDENT REVIEW — merged Block B-3 + B-3R
Verdict: APPROVE
Reviewed immutable main commit 00dadf27cebbb8f311337f21ebdeadd90c1a9f8c against base b11c277ac7f79a18670932eca4622982d9ff48e0, covering the complete 25-file base..merge diff: 1,895 insertions and 161 deletions.
The following four normative documents were read completely before assessing the implementation:
smm-task-B3-spec-2026-08-03.mdsmm-task-B3R-spec-2026-08-04.mdsmm-hermes-task-b3r-2026-08-06.mdsmm-hermes-task-b3r-deliver-2026-08-07.md
The previous INDEPENDENT_REVIEW.md was treated only as historical context.
Findings
BLOCKING
None.
HIGH
None.
MEDIUM
None.
LOW
-
The authoritative B-3R request to preserve an explicit missing-row helper regression test is only indirectly covered.
- The helper directly implements missing-row → exit 80 at
deploy/ochenstarik-smm-policy-apply:53-54. - The real-helper contract proves the same exit-80 function and exact
mesh.node-not-activatedmarker through a production-shapedreservedrow attests/bootstrap/test-bootstrap-contract.sh:142-152. - Active valid, blank/invalid/out-of-range IP, and malformed-status cases are covered at
tests/bootstrap/test-bootstrap-contract.sh:88-94,153-192. - There is no separate invocation where
targetis entirely absent fromnodes.tsv, although authoritative B-3R requested that this pre-existing case be retained.
Acceptance effect: non-blocking. The separate 2026-08-06 seven-test acceptance list does not require the absent-row case, the branch is a direct
[[ -n "$record" ]] || node_not_activated, and the exact exit-80 marker path is exercised by the reserved-row case. Adding an explicit absent-row contract remains advisable to prevent future changes from conflating “missing” with corrupt registry state. - The helper directly implements missing-row → exit 80 at
-
Two supplementary evidence logs are not integrity-covered by
SHA256SUMS.SHA256SUMS:1-49validates all 49 entries it lists, but the manifest ends without entries for:MANDATORY_LINUX_INTEGRATION.logMANDATORY_SEVEN_TESTS.log
- Those files contain evidence at
MANDATORY_LINUX_INTEGRATION.log:1-11andMANDATORY_SEVEN_TESTS.log:1-14.
Acceptance effect: non-blocking for the immutable merged implementation. All 49 listed checksums independently matched, and the omitted results are corroborated by the full Linux/Windows/CI evidence. The delivery package should regenerate its manifest after replacing this review so every final package file is covered.
Seven-test acceptance table
| # | Exact test/script | Assertions inspected | Assessment |
|---|---|---|---|
| 1 | LinkReconciliationTests.DatabaseLessOrphanIsFailedWhenDisconnectReportsSuccessButRuleRemains |
Configures DisconnectLeavesRules=true; after ReconcileAllAsync, asserts (Examined, Converged, Failed) == (1,0,1), the rule remains in the final factual listing, and FailedPolicyIds contains the synthetic orphan: ID (tests/ServerMonitorManager.Control.Tests/LinkReconciliationTests.cs:195-211). |
PASS — direct coverage. Proves helper success is insufficient without exact post-mutation cardinality. |
| 2 | LinkReconciliationTests.PersistedDisabledCleanupDoesNotProbeMissingNodeStatus |
Starts from a persisted disabled policy, reinjects its rule, configures status probing to throw node-not-activated, then asserts (1,1,0) and persisted ActualState == "Disabled" (LinkReconciliationTests.cs:213-233). |
PASS — direct behavioral coverage. The test would fail if cleanup depended on link-status; production uses the final link-list. |
| 3 | LinkReconciliationTests.MarkerIsRetainedWhenPostMutationFactCannotBeVerified plus LinkReconciliationTests.DeferredPoliciesConsumeMarkerAndDoNotCreatePromptHotLoop |
Failed final factual verification asserts (1,0,1), zero completion calls, and retained generation (LinkReconciliationTests.cs:252-277). Deferred-only completion asserts (1,0,0,1), exact deferred ID, marker consumed once, and immediate repeat throttled (LinkReconciliationTests.cs:313-347). |
PASS. Failed and Deferred sides are directly tested. A combined Converged+Deferred set is indirect, but non-blocking: production completion checks only result.Failed > 0 at LinkReconciliationBackgroundService.cs:69-85; converged-only completion is separately covered by MarkerCreatedAfterNormalPassTriggersPromptAdditionalPass at LinkReconciliationTests.cs:541-565. |
| 4 | LinkReconciliationTests.MixedPassClassifiesEveryExaminedPolicyExactlyOnce |
Builds six policies with two converged, two mutation failures, and two deferred connects; asserts Examined == 6, (Converged, Failed, Deferred) == (2,2,2), sum equals examined, two IDs in each non-success bucket, and no overlap (LinkReconciliationTests.cs:279-311). |
PASS — direct six-policy invariant coverage. Constructor-level rejection of non-exhaustive results is additionally tested at LinkReconciliationTests.cs:17-29. |
| 5 | LinkReconciliationTests.FullPassWithMultipleMutationsUsesOneInitialAndOneFinalList |
Creates four policies, removes all factual rules, runs the full pass, then asserts (4,4,0,0), exactly two additional ListRulesAsync calls, and exactly four connects (LinkReconciliationTests.cs:81-106). |
PASS — direct k=4 batching-budget proof. |
| 6 | tests/bootstrap/test-bootstrap-contract.sh |
Active four-field source/target rows produce a valid connect command (:88-94); reserved+valid IP gives exit 80 and exact marker (:142-152); active+blank, invalid, and out-of-range IP each give exit 78 and exact diagnostic (:153-182); malformed status gives exit 78 and exact diagnostic (:183-192). Script completed with BOOTSTRAP_CONTRACT=PASS. |
PASS. Production-shaped real-helper coverage. Completely absent target-row behavior is indirect as noted under LOW, but does not invalidate this mandatory seven-test item. |
| 7 | LinkReconciliationTests.DeferredPoliciesConsumeMarkerAndDoNotCreatePromptHotLoop |
Executes ten scheduled iterations; every pass is (1,0,0,1) with the exact policy ID, first pass consumes the marker, immediate extra invocation returns null, subsequent passes occur only after 30-second advances, and no “prompt exhausted” warning appears (LinkReconciliationTests.cs:313-351). |
PASS. Repeated Deferred scheduling is directly tested; real reserved-row → exit 80 is separately proven by the helper contract, so the end-to-end composition is indirect but adequate and non-blocking. |
MANDATORY_SEVEN_TESTS.log:2-14 records six focused xUnit tests passing with zero skipped plus the production-shaped helper contract passing. The apparent count of six xUnit methods is correct because DeferredPoliciesConsumeMarkerAndDoNotCreatePromptHotLoop satisfies both the Deferred half of criterion 3 and criterion 7.
Full-pass list budget versus direct paths
The required full-pass budget is satisfied:
- Initial factual snapshot:
LinkService.ReconcileAllAsynccallsListRulesAsynconce atsrc/ServerMonitorManager.Control/LinkService.cs:164-181. - Both full-pass convergence calls receive the same non-null
FullReconciliationBatch:- persisted candidates:
LinkService.cs:218-224 - factual orphans:
LinkService.cs:297-304
- persisted candidates:
- All four per-mutation
VerifyExactFactualCountAsynccalls are guarded byif (batch is null):- duplicate cleanup:
LinkService.cs:480-487 - connect:
LinkService.cs:489-496 - persisted disconnect:
LinkService.cs:498-505 - DB-less raw disconnect:
LinkService.cs:507-514
- duplicate cleanup:
- Therefore they belong only to direct Create, Disable/certificate cleanup, reconnect, TTL, and retry paths, whose callers omit a batch at
LinkService.cs:44,89,100,131-135,422-423. - A full pass with any attempted mutation takes exactly one shared final snapshot in
FinalizeBatchAsyncatLinkService.cs:342-348,565-584. - No-drift budget is asserted as one total privileged call and zero changed mutation counts by
SecondUnchangedPassDoesNotMutateFirewallatLinkReconciliationTests.cs:58-79. - Multi-mutation budget is asserted as two lists for four mutations at
LinkReconciliationTests.cs:81-106. - The native trimmed orphan run independently records
link-list, raw disconnect,link-listandHELPER_CALLS=list:2,disconnect:1atTRIMMED_NATIVE_POST_RACE_REPAIR.log:148-156.
Result: no hidden 1+k full-pass path remains.
Race, locking, batching, and result accounting
The prior stale-finalization race is adequately repaired:
- Per-item mutation work retains sorted endpoint node locks before the selected Link gate at
LinkService.cs:192-205,268-279. - Batch finalization acquires all distinct endpoint locks in ordinal order at
LinkService.cs:569-573,770-787. - It reads the current effective policy by natural key before gate selection at
LinkService.cs:574-579. - Current Link gates are deduplicated and globally sorted at
LinkService.cs:580-583,808-825. - The single final factual snapshot occurs only after those locks and gates are held at
LinkService.cs:584. - The effective natural-key row is re-read after the snapshot at
LinkService.cs:585-590. - Identity, version, desired state, or newly appearing persisted orphan state makes staged work stale at
LinkService.cs:631-646; stale work does not write state, audit, or success events. BatchFinalizationDoesNotFinalizeOrPublishStalePolicyVersionpauses after capture of the second list, changes desired version, then asserts one failure, no overwrite of the new state, and no stalelink.active/link.reappliedevent atLinkReconciliationTests.cs:108-152,825-831.- A factual orphan adopted as an active policy while waiting for node locks is not removed, as asserted by
FactualOrphanAdoptedAsActiveUnderNodeLocksIsNotRemovedatLinkReconciliationTests.cs:512-538. - No new lock class was introduced; synchronization remains sorted node locks → per-Link gate.
- Full- and node-pass constructors enforce
Converged + Failed + Deferred == ExaminedatLinkService.cs:894-928andControlStore.cs:1774-1806.
Security and privileged-helper boundary
No blocking boundary regression was found:
link-listrequires exactly one argument atdeploy/ochenstarik-smm-policy-apply:239-244.- All helper execution remains argument-list based with
UseShellExecute=false, non-interactive sudo, and no shell interpolation atLinkPolicyApplier.cs:126-141. - Exit 79 is recognized only with the exact
mesh.firewall-unavailablemarker; exit 80 only with the exact node-not-activated marker atLinkPolicyApplier.cs:148-163. LC_ALL=Cand root/test-mode boundaries remain explicit atochenstarik-smm-policy-apply:1-27.- Missing
/usr/sbin/nftis fail-closed and separate from missing-table classification atochenstarik-smm-policy-apply:83-115. link-listexposes only validatedsmm:<source>:<target>:<protocol>:<port>comments; foreign rules are skipped, malformed managed-looking comments are diagnosed, and duplicates are retained for reconciliation atochenstarik-smm-policy-apply:158-189.- Raw disconnect deletes every handle with the exact managed comment and no longer consults
nodes.tsvatochenstarik-smm-policy-apply:140-155. - Marker observation/completion is generation-aware under the privileged lock at
ochenstarik-smm-policy-apply:205-237. - The factual interfaces are compile-time mandatory:
ListRulesAsyncand rawApplyDisconnectAsync(LinkRule, …)have no default implementation atLinkPolicyApplier.cs:7-13; all production/test implementations implement both.
Audit, retention, Desktop, and scope boundaries
- DB-less orphan success is finalized only after exact zero cardinality; orphan audit is persisted before
link.orphan-removedpublication atLinkService.cs:648-675. - Audit details use named
LinkOrphanAuditDetailsand source-generatedControlJsonContextatControlJsonContext.cs:5-13andControlStore.cs:1376-1398. - Retention removes the complete history only when the latest natural-key row is old
Disabled/Disabled; Active and drifted latest policies are preserved atControlStore.cs:355-388. The regression test asserts two completed rows deleted, Active and Failed rows retained, and no older version resurrected atControlMaintenanceTests.cs:112-166. LinkRetentionDayshas a default, startup validation, appsettings value, and bootstrap environment value atControlOptions.cs:28-36,Program.cs:34-54,appsettings.json:6-16, anddeploy/ochenstarik-server-monitor-manager.sh:493-503.- Desktop defaults to latest effective Active or drifted policies, offers an explicit history toggle, and calculates counters over the displayed set at
LinksPage.xaml.cs:20-41andLinksPage.xaml:78-106. - Pending activation is presented as an informational expected state rather than an error at
MeshModels.cs:65-74andMainPage.xaml.cs:1265-1276. IsEligibleForFullReconciliationis absent.- Changes outside Link reconciliation are limited to the required configuration, documentation, tests, retention, helper, and Desktop presentation work. No Block C implementation or unrelated Desktop refactor appears in the complete diff.
Verification and evidence separation
Independently executed during this review
git diff --check b11c277..00dadf2— pass.bash -n deploy/ochenstarik-smm-policy-apply— pass.bash -n tests/acceptance/three-server-mesh.sh— pass.bash tests/bootstrap/test-bootstrap-contract.sh—BOOTSTRAP_CONTRACT=PASS.- Live GitHub query confirmed PR #16 merged with:
- base
b11c277ac7f79a18670932eca4622982d9ff48e0 - reviewed head
ee7d89c1d02cba7e0418637282ce274b60edde69 - merge
00dadf27cebbb8f311337f21ebdeadd90c1a9f8c
- base
- Live GitHub checks confirmed all 14 PR checks passed.
- Live commit-run query confirmed all three post-merge workflows completed successfully.
- Final repository status remained clean at the expected immutable merge SHA.
- All 49 checksums listed in
SHA256SUMSmatched.
Supplied deterministic/native evidence inspected
- Windows committed Control: 94 passed, zero failed/skipped at
WINDOWS_CONTROL_COMMITTED.log:1-9. - Clean WSL Linux Control: 94 passed, zero failed/skipped at
TRIMMED_NATIVE_POST_RACE_REPAIR.log:116-119. - Published self-contained
linux-x64 PublishTrimmedcompleted atTRIMMED_NATIVE_POST_RACE_REPAIR.log:120-147. - The published executable executed the orphan path and emitted the exact durable audit JSON at
TRIMMED_NATIVE_POST_RACE_REPAIR.log:148-150. - Native helper cardinality was exactly two lists and one disconnect at
TRIMMED_NATIVE_POST_RACE_REPAIR.log:151-156. - Desktop Release build completed with zero warnings/errors at
DESKTOP_BUILD_POST_RACE_REPAIR.log:1-8; Desktop contracts passed atDESKTOP_CONTRACTS_POST_RACE_REPAIR.log:1. - PR evidence reports 14/14 checks passed with zero skipped at
CI_CHECKS.txt:1-20. - Post-merge evidence reports three successful workflows and 12/12 successful jobs with zero skipped at
POST_MERGE_CI.txt:1-21, including Linux Control, Windows build/security/MSIX, native Ubuntu matrices, release archives, and Debian systemd restart matrices. - Existing
IL2026trim warnings are confined to unchanged provisioning serialization paths (TRIMMED_NATIVE_POST_RACE_REPAIR.log:124-145); they do not affect the executed B-3 orphan-audit path.
REPORT.md:3-5,72-84 and TEST_EVIDENCE.md:22-102 correctly separate Windows-local, Linux-native, PR CI, post-merge CI, and unexecuted physical acceptance. Contract/mock/native-artifact checks are not represented as physical topology acceptance.
Residual physical acceptance
Physical three-server acceptance was not run and is not claimed. All required topology inputs remain UNSET at PHYSICAL_INPUT_STATUS.txt:1-7.
The outstanding command remains:
SMM_ACCEPT_RESTORE=1 SMM_ACCEPT_REBOOT=1 tests/acceptance/three-server-mesh.sh
The harness contains factual connectivity, firewall restore, injected disabled-policy orphan cleanup, backup restore, and reboot checks at tests/acceptance/three-server-mesh.sh:183-311, but script existence and syntax do not establish physical behavior.
Final delivery status remains:
merged / verified, physical acceptance pending
Review side effects
- Repository or evidence files created or modified: none
- Commits, pushes, PR actions, merges, or evidence rewrites: none