diff --git a/docs/go-mcp-minimal-plan.md b/docs/go-mcp-minimal-plan.md index 6bdb8ba..bf61851 100644 --- a/docs/go-mcp-minimal-plan.md +++ b/docs/go-mcp-minimal-plan.md @@ -1005,5 +1005,5 @@ Prepared package: ```text runs/login-reachability-probe-package.zip -C:\Users\zhaoy\Downloads\login-reachability-probe-package-20260712-125451.zip +C:\Users\zhaoy\Downloads\login-reachability-probe-package-20260712-140706.zip ``` diff --git a/docs/source-discovery/2026-07-12-login-reachability-probe-package.md b/docs/source-discovery/2026-07-12-login-reachability-probe-package.md index 0d2c62e..f0a19f4 100644 --- a/docs/source-discovery/2026-07-12-login-reachability-probe-package.md +++ b/docs/source-discovery/2026-07-12-login-reachability-probe-package.md @@ -14,7 +14,7 @@ It is for B-route evidence collection. It does not enable production send. - Verification script: `scripts/verify-login-reachability-probe-package.ps1` - Package directory: `runs/login-reachability-probe-package` - Package zip: `runs/login-reachability-probe-package.zip` -- Downloads copy: `C:\Users\zhaoy\Downloads\login-reachability-probe-package-20260712-125451.zip` +- Downloads copy: `C:\Users\zhaoy\Downloads\login-reachability-probe-package-20260712-140706.zip` ## What the package contains @@ -22,6 +22,7 @@ It is for B-route evidence collection. It does not enable production send. - `tools/isphere-capability-smoke.exe` - `LOGIN-REACHABILITY-INPUTS.template.json` - `LOGIN-REACHABILITY-INPUTS.schema.json` +- `TODO-COVERAGE.md` - `CREATE-RETURN-ZIP.ps1` - `RUN-LOGIN-REACHABILITY-SUITE.bat` - numbered operator steps: @@ -79,7 +80,7 @@ Verified result: ```json { "ok": true, - "required_file_count": 21, + "required_file_count": 22, "synthetic_return_verified": true, "online_login_required": true, "no_automatic_send": true, @@ -88,6 +89,15 @@ Verified result: } ``` +## Remaining TODO coverage completed + +The package now includes the remaining validation TODO fields: + +- `runtime_observations`: AppContextManager, MessageScheduling, Chat/XMPP, FileUploadPara, IFileTransfer, FileUploadResult/FileID, and send-file-message finalization evidence or structured failure. +- `group_probe`: group ChatRoom branch and speech/upload permission evidence or structured failure. +- `fallback_a_route`: HWND, `rtbSendMessage`, `btnSend`, file menu evidence, or structured failure when B-route fails. +- `TODO-COVERAGE.md`: maps every P0/P1 validation item to the exact package field or generated evidence path. + ## Next decision after returned zip - If text evidence includes one-shot target, before/after sent-record source, content hash, and ack/ref correlation, move text B-route from contract/probe toward production connector design. diff --git a/docs/source-discovery/capability-source-matrix.md b/docs/source-discovery/capability-source-matrix.md index f4bddd1..9158280 100644 --- a/docs/source-discovery/capability-source-matrix.md +++ b/docs/source-discovery/capability-source-matrix.md @@ -46,7 +46,7 @@ Route rule: UIA helper / A-route / RPA is a backup route only. It can preserve d | `isphere_search_contacts` | bare sender/receiver JIDs extracted from normalized log-backed messages loaded from configured PacketReader file or directory source | validated copied `MsgLib.db` tables: `TD_Roster`, `TD_CustomEffigy`, `tblRecent`, `tblChatLevel`, `tblPersonMsg`; decrypted roster/contact stanzas from `Smark.SendReceive`; UIA helper source if display names are still missing | `docs/source-discovery/2026-07-10-msglib-readonly-schema-extraction.md`; `internal/isphere/contacts_test.go`; `internal/tools/isphere_contacts_test.go` | C34 documents optional MsgLib contact display enrichment; R2 adds deterministic exact-match-first ranking, case-insensitive de-duplication across log/MsgLib candidates, and preserves `source`/`raw_ref` | core contact search complete; optional richer fields later | | `isphere_search_groups` | decrypted `PacketReader.ProcessPacket` `type="groupchat"` stanzas and conference/MUC JIDs loaded from configured PacketReader file or directory source | validated copied `MsgLib.db` tables: `tblMsgGroupPersonMsg`, `TD_WorkGroupAuth`, `tblRecent`; UIA helper source if group display names are still missing | `docs/source-discovery/2026-07-10-msglib-readonly-schema-extraction.md`; `internal/isphere/groups_test.go`; `internal/tools/isphere_groups_test.go`; C9 ignored-log scan: PacketReader 86 groupchat/86 conference hits; Smark 24 groupchat/658 conference/631 muc hits | C34 documents optional MsgLib group display enrichment; R2 adds deterministic exact-match-first ranking, case-insensitive de-duplication across log/MsgLib candidates, and preserves `source`/`raw_ref` | core group search complete; optional member/owner hierarchy later | | `isphere_receive_files` | decrypted `PacketReader.ProcessPacket` file-transfer message stanzas via `internal/isphere.ListFilesFromMessages` and `isphere_receive_files` list mode; configured PacketReader file or directory source; `zyl\importal\` cache entries remain unlinked | MsgLib `TD_ReceiveFileRecord` safe metadata through explicit copied-DB path; decrypted `Smark.SendReceive` and `SaveToDB` traces for file-reference reconciliation; future UIA/client connector for download | `docs/source-discovery/2026-07-09-n12-pre-zyl-schema-notes.md#c12-file-transfer-evidence-precheck`; `docs/source-discovery/2026-07-10-file-download-mapping-precheck.md`; `docs/source-discovery/2026-07-10-file-cache-mapping-diagnostic.md`; `docs/source-discovery/2026-07-10-file-download-mapping-v2.md`; `docs/reports/2026-07-10-business-goals-smoke.md` | C22 verifies safe file-list contract args; R10 proves resolver scoring with fixture accepted matches; R11 adds structured download preview with `blocked`/`planned` status and side-effect flags false; R13/R14 confirms list is ready but real download is still blocked. | blocked for real download pending accepted real cache mapping and copy gate; list mode is complete | -| `isphere_send_message` | B-route selected: `in_process_adapter_research` after offline reverse. Static call path is confirmed through `AppContextManager.SendTxtMessageByJid(...)`, `MessageScheduling.SendChatMessage(...)`, `Chat.SendMessage`, and `XMPPConnection.send`, but no existing IPC/plugin/local HTTP send bridge is confirmed; default MCP tool still exposes preview/dry-run unless an explicit connector mode is configured | A-route fallback is now implemented for UI action: `ISPHERE_SEND_CONNECTOR_MODE=uia_rpa` calls WinHelper `uia_send_message` against a configured HWND, writes `rtbSendMessage`, and clicks `btnSend`; this stays backup-only and network/protocol replay remains deferred | `docs/source-discovery/2026-07-10-send-message-source-precheck.md`; `docs/source-discovery/2026-07-10-send-message-connector-selection.md`; `docs/source-discovery/2026-07-10-send-sidecar-b-first-plan.md`; `docs/source-discovery/2026-07-10-returned-live-probe-analysis.md`; `docs/source-discovery/2026-07-10-send-connector-preflight.md`; `docs/source-discovery/2026-07-10-send-sandbox-gate.md`; `docs/source-discovery/2026-07-10-returned-send-sandbox-analysis.md`; `docs/source-discovery/2026-07-10-returned-send-sandbox-analysis-v2.md`; `docs/source-discovery/2026-07-10-returned-send-sent-record-diagnostic.md`; `docs/source-discovery/2026-07-11-a-route-uia-send.md`; `docs/source-discovery/2026-07-11-a-route-open-real-chat-window.md`; `docs/source-discovery/2026-07-12-broute-text-send-static-map.md`; `docs/source-discovery/2026-07-12-broute-bridge-static-map.md`; `docs/source-discovery/2026-07-12-offline-broute-reverse-decision.md`; `docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md`; `docs/source-discovery/2026-07-12-send-upload-deep-dive.md`; `docs/source-discovery/2026-07-12-login-reachability-validation-items.md`; `docs/source-discovery/2026-07-12-login-reachability-probe-package.md`; `internal/tools/isphere_send_message_test.go`; `cmd/isphere-capability-smoke/main.go`; `docs/reports/2026-07-10-business-goals-smoke.md` | R6f-R6l define connector contract, audit/idempotency replay, production gate, B-route shell, strict-v2 package, and explicit production closure. R10a validates two returned sent-record packages as manual-only evidence. A-route adds local UI action readiness: synthetic window proof plus real offline `frmP2PChat` open/write/click target proof. Offline B-route reverse confirms the send call path but rejects existing IPC/plugin-first for this evidence set; business delivery is still not verified because local runtime is offline and no success/ack or sent-record hash evidence has passed. The login reachability package is now built and verified; it produces `LOGIN-REACHABILITY-OUTPUT.json` with run/targets/runtime/reachability/server_auth/snapshots/attempts/failures/correlation. | Run the 2026-07-13 login reachability package in a logged-in environment and return `isphere-login-reachability-return-*.zip`; text production remains blocked until one-shot target, AppContextManager/IAppContextManager or MessageScheduling/Chat reachability, sent-record source, and content-hash/ack correlation pass | +| `isphere_send_message` | B-route selected: `in_process_adapter_research` after offline reverse. Static call path is confirmed through `AppContextManager.SendTxtMessageByJid(...)`, `MessageScheduling.SendChatMessage(...)`, `Chat.SendMessage`, and `XMPPConnection.send`, but no existing IPC/plugin/local HTTP send bridge is confirmed; default MCP tool still exposes preview/dry-run unless an explicit connector mode is configured | A-route fallback is now implemented for UI action: `ISPHERE_SEND_CONNECTOR_MODE=uia_rpa` calls WinHelper `uia_send_message` against a configured HWND, writes `rtbSendMessage`, and clicks `btnSend`; this stays backup-only and network/protocol replay remains deferred | `docs/source-discovery/2026-07-10-send-message-source-precheck.md`; `docs/source-discovery/2026-07-10-send-message-connector-selection.md`; `docs/source-discovery/2026-07-10-send-sidecar-b-first-plan.md`; `docs/source-discovery/2026-07-10-returned-live-probe-analysis.md`; `docs/source-discovery/2026-07-10-send-connector-preflight.md`; `docs/source-discovery/2026-07-10-send-sandbox-gate.md`; `docs/source-discovery/2026-07-10-returned-send-sandbox-analysis.md`; `docs/source-discovery/2026-07-10-returned-send-sandbox-analysis-v2.md`; `docs/source-discovery/2026-07-10-returned-send-sent-record-diagnostic.md`; `docs/source-discovery/2026-07-11-a-route-uia-send.md`; `docs/source-discovery/2026-07-11-a-route-open-real-chat-window.md`; `docs/source-discovery/2026-07-12-broute-text-send-static-map.md`; `docs/source-discovery/2026-07-12-broute-bridge-static-map.md`; `docs/source-discovery/2026-07-12-offline-broute-reverse-decision.md`; `docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md`; `docs/source-discovery/2026-07-12-send-upload-deep-dive.md`; `docs/source-discovery/2026-07-12-login-reachability-validation-items.md`; `docs/source-discovery/2026-07-12-login-reachability-probe-package.md`; `internal/tools/isphere_send_message_test.go`; `cmd/isphere-capability-smoke/main.go`; `docs/reports/2026-07-10-business-goals-smoke.md` | R6f-R6l define connector contract, audit/idempotency replay, production gate, B-route shell, strict-v2 package, and explicit production closure. R10a validates two returned sent-record packages as manual-only evidence. A-route adds local UI action readiness: synthetic window proof plus real offline `frmP2PChat` open/write/click target proof. Offline B-route reverse confirms the send call path but rejects existing IPC/plugin-first for this evidence set; business delivery is still not verified because local runtime is offline and no success/ack or sent-record hash evidence has passed. The login reachability package is now built and verified; it produces `LOGIN-REACHABILITY-OUTPUT.json` with run/targets/runtime/reachability/server_auth/snapshots/attempts/failures/correlation and includes `TODO-COVERAGE.md` for runtime observations, group probe, and fallback A-route evidence. | Run the 2026-07-13 login reachability package in a logged-in environment and return `isphere-login-reachability-return-*.zip`; text production remains blocked until one-shot target, AppContextManager/IAppContextManager or MessageScheduling/Chat reachability, sent-record source, and content-hash/ack correlation pass | | `isphere_send_file` | B-route selected after offline reverse: managed file send is upload-first through `OffLineFileSend.sendFile()`, `FileUploadPara`, `IMPP.Service*.dll` `IFileTransfer.FileUpload(...)`, then chat file-message finalization through `trans_UploadCompleted(fileId)`, `MessageScheduling.SendFileMessage`, and `Chat.sendFileMessage(...)`; current MCP tool exposes preview/dry-run only | A-route file fallback is not implemented yet; real offline UIA dump did not expose stable `btnSendFile`, so the fallback slice remains toolbar/menu locator discovery; native `TcpFileTransfer.dll` is not the first B-route bridge because managed upload/message flow is now mapped | `docs/source-discovery/2026-07-10-send-message-source-precheck.md`; `docs/source-discovery/2026-07-10-send-message-connector-selection.md`; `docs/source-discovery/2026-07-10-send-sidecar-b-first-plan.md`; `docs/source-discovery/2026-07-10-returned-live-probe-analysis.md`; `docs/source-discovery/2026-07-10-send-connector-preflight.md`; `docs/source-discovery/2026-07-10-send-file-sandbox-gate.md`; `docs/source-discovery/2026-07-11-a-route-open-real-chat-window.md`; `docs/source-discovery/2026-07-12-broute-file-send-static-map.md`; `docs/source-discovery/2026-07-12-broute-bridge-static-map.md`; `docs/source-discovery/2026-07-12-offline-broute-reverse-decision.md`; `docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md`; `docs/source-discovery/2026-07-12-send-upload-deep-dive.md`; `docs/source-discovery/2026-07-12-login-reachability-validation-items.md`; `docs/source-discovery/2026-07-12-login-reachability-probe-package.md`; `internal/tools/isphere_files_test.go`; `docs/reports/2026-07-10-business-goals-smoke.md` | R7 registers send-file preview as the tenth MCP tool; R8 adds audit/idempotency duplicate/conflict hardening without raw file paths/content; R9 builds and verifies the online send-file evidence package; R13/R14 confirms preview is ready and production upload remains blocked. Offline B-route reverse confirms upload-first/file-message-second and shows file id/auth/runtime reachability are the blockers. A-route real-window work confirms file-button automation still needs a separate locator node. The login reachability package is now built and verified with one-shot file fields, structured failure handling, and before/after recorder output validation. | Run the 2026-07-13 login reachability package in a logged-in environment and return `isphere-login-reachability-return-*.zip`; file production remains blocked until FileUploadPara/server/auth, `IFileTransfer.FileUpload`, FileUploadResult/FileID or structured upload failure, file-message finalization, and file sent-record/ack correlation pass | ## Stage C entry rule diff --git a/scripts/package-login-reachability-probe.ps1 b/scripts/package-login-reachability-probe.ps1 index e92dfcb..980aa4f 100644 --- a/scripts/package-login-reachability-probe.ps1 +++ b/scripts/package-login-reachability-probe.ps1 @@ -283,6 +283,24 @@ isphere-login-reachability-return-时间戳.zip "ack_or_ref_id": "", "correlation_notes": "" }, + "runtime_observations": { + "app_context_manager_reachable": null, + "message_scheduling_reachable": null, + "chat_xmpp_authenticated": null, + "target_jid_mapping_observed": null, + "file_upload_para_observed": null, + "ifile_transfer_reachable": null, + "file_upload_result_file_id_observed": null, + "send_file_message_finalization_observed": null, + "notes": "", + "failure": { + "step": "", + "code": "", + "classification": "", + "message": "", + "next_action": "" + } + }, "text_attempt": { "enabled": true, "content_sha256": "", @@ -319,6 +337,36 @@ isphere-login-reachability-return-时间戳.zip "next_action": "" } }, + "group_probe": { + "enabled": false, + "group_jid": "", + "chatroom_branch_observed": null, + "speech_permission_state": "", + "upload_permission_state": "", + "mute_or_permission_failure_reason": "", + "failure": { + "step": "", + "code": "", + "classification": "", + "message": "", + "next_action": "" + } + }, + "fallback_a_route": { + "enabled_if_b_route_fails": true, + "hwnd": "", + "rtbSendMessage_present": null, + "btnSend_present": null, + "btnSendFile_or_file_menu_present": null, + "uia_or_screenshot_ref": "", + "failure": { + "step": "", + "code": "", + "classification": "", + "message": "", + "next_action": "" + } + }, "operator_notes": "" } '@ | Set-Content -LiteralPath (Join-Path $packageDir "LOGIN-REACHABILITY-INPUTS.template.json") -Encoding UTF8 @@ -328,7 +376,7 @@ isphere-login-reachability-return-时间戳.zip "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "iSphere login reachability probe input", "type": "object", - "required": ["schema_version", "run", "targets", "text_attempt", "file_attempt"], + "required": ["schema_version", "run", "targets", "runtime_observations", "text_attempt", "file_attempt", "group_probe", "fallback_a_route"], "properties": { "schema_version": { "const": "2026-07-13.login-reachability.v1" }, "run": { @@ -352,8 +400,11 @@ isphere-login-reachability-return-时间戳.zip "group_jid": { "type": "string" } } }, + "runtime_observations": { "type": "object" }, "text_attempt": { "type": "object" }, - "file_attempt": { "type": "object" } + "file_attempt": { "type": "object" }, + "group_probe": { "type": "object" }, + "fallback_a_route": { "type": "object" } } } '@ | Set-Content -LiteralPath (Join-Path $packageDir "LOGIN-REACHABILITY-INPUTS.schema.json") -Encoding UTF8 @@ -381,12 +432,44 @@ Required when file_attempt.enabled=true: - file_attempt.duplicate_second_file_send_attempted=false - either file_attempt.file_upload_or_sent_record_present=true plus result text, or structured file_attempt.failure +Required for remaining validation TODO coverage: +- runtime_observations records AppContextManager/MessageScheduling/Chat-XMPP/FileUploadPara/IFileTransfer/FileID/sendFileMessage observations or a structured failure. +- group_probe records ChatRoom branch and permissions when group_jid is used. +- fallback_a_route records hwnd/rtbSendMessage/btnSend/file-menu evidence when B-route fails and A-route evidence is needed. + Decision: - Production text send remains blocked unless one-shot target + before/after snapshot + sent-record source + content-hash/ack correlation pass. - Production file send remains blocked unless FileUploadPara + IFileTransfer/FileUpload + FileUploadResult.FileID + file-message finalization + file sent-record/ack correlation pass. - A-route/RPA remains backup-only. '@ | Set-Content -LiteralPath (Join-Path $packageDir "EXPECTED-RETURN-FILES.txt") -Encoding UTF8 +@' +# TODO-COVERAGE + +This package covers the remaining validation TODO items from the 2026-07-12 login reachability schema. + +P0 coverage: +- one-shot test target: LOGIN-REACHABILITY-INPUTS.json / targets +- before/after sent-record snapshots: return-evidence/before, after-text, after-file plus sent_record_source +- sent-record and ack source: sent_record_source +- in-process adapter reachability mode: adapter_reachability +- logged-in runtime and loaded assemblies: recorder/probe_client_runtime.json +- AppContextManager/IAppContextManager: runtime_observations plus send_entrypoints_preflight.json +- Chat/XMPPConnection authenticated state: runtime_observations plus send_entrypoints_preflight.json +- FileUploadPara values: server_auth plus runtime_observations +- IFileTransfer/FileUpload reachability: runtime_observations plus send_entrypoints_preflight.json +- FileUploadResult.FileID: runtime_observations and file_attempt evidence/failure +- trans_UploadCompleted/SendFileMessage finalization: runtime_observations and file_attempt evidence/failure +- structured failure reasons: text_attempt.failure, file_attempt.failure, runtime_observations.failure, group_probe.failure, fallback_a_route.failure +- sent record/ack correlation: correlation output section + +P1 coverage: +- group ChatRoom branch and permissions: group_probe +- A-route fallback UI evidence: fallback_a_route + +The package still does not auto-send, auto-upload, click, type, inject, hook, or enable production send. +'@ | Set-Content -LiteralPath (Join-Path $packageDir "TODO-COVERAGE.md") -Encoding UTF8 + @' @echo off setlocal @@ -584,6 +667,19 @@ function Add-ValidationFailure([System.Collections.Generic.List[object]]$List, [ }) | Out-Null } +function Test-StructuredFailure($Failure) { + if ($null -eq $Failure) { return $false } + return (Test-NonEmptyString $Failure.step) -and + (Test-NonEmptyString $Failure.code) -and + (Test-NonEmptyString $Failure.classification) -and + (Test-NonEmptyString $Failure.next_action) +} + +function Test-ObservedOrStructuredFailure($Observed, $Failure) { + if ($Observed -eq $true) { return $true } + return Test-StructuredFailure $Failure +} + if (-not (Test-Path -LiteralPath $inputsPath)) { throw "missing LOGIN-REACHABILITY-INPUTS.json; run 00-prepare-inputs.bat first" } @@ -616,6 +712,21 @@ if (-not (Test-NonEmptyString $inputs.targets.direct_jid)) { Add-ValidationFailure $validationFailures "DIRECT_TARGET_MISSING" "targets.direct_jid is required" } +foreach ($field in @( + "app_context_manager_reachable", + "message_scheduling_reachable", + "chat_xmpp_authenticated", + "target_jid_mapping_observed", + "file_upload_para_observed", + "ifile_transfer_reachable", + "file_upload_result_file_id_observed", + "send_file_message_finalization_observed" +)) { + if (-not (Test-ObservedOrStructuredFailure $inputs.runtime_observations.$field $inputs.runtime_observations.failure)) { + Add-ValidationFailure $validationFailures ("RUNTIME_" + $field.ToUpperInvariant() + "_MISSING") ("runtime_observations." + $field + " must be true or runtime_observations.failure must be structured") + } +} + $textEnabled = ($inputs.run.one_shot_text_enabled -eq $true) -or ($inputs.text_attempt.enabled -eq $true) if ($textEnabled) { if ($inputs.run.one_text_send_only_confirmed -ne $true) { @@ -678,6 +789,28 @@ if ($fileEnabled) { } } +$groupEnabled = ($inputs.group_probe.enabled -eq $true) -or (Test-NonEmptyString $inputs.targets.group_jid) +if ($groupEnabled) { + if (-not (Test-NonEmptyString $inputs.group_probe.group_jid) -and -not (Test-NonEmptyString $inputs.targets.group_jid)) { + Add-ValidationFailure $validationFailures "GROUP_JID_MISSING" "group_probe.group_jid or targets.group_jid is required when group probe is enabled" + } + $groupObserved = ($inputs.group_probe.chatroom_branch_observed -eq $true) -and + ((Test-NonEmptyString $inputs.group_probe.speech_permission_state) -or (Test-NonEmptyString $inputs.group_probe.upload_permission_state)) + if (-not $groupObserved -and -not (Test-StructuredFailure $inputs.group_probe.failure)) { + Add-ValidationFailure $validationFailures "GROUP_OBSERVATION_OR_FAILURE_MISSING" "group_probe needs ChatRoom/permission evidence or structured failure" + } +} + +$fallbackNeeded = ($inputs.fallback_a_route.enabled_if_b_route_fails -eq $true) -and (Test-StructuredFailure $inputs.runtime_observations.failure) +if ($fallbackNeeded) { + $fallbackObserved = (Test-NonEmptyString $inputs.fallback_a_route.hwnd) -and + ($inputs.fallback_a_route.rtbSendMessage_present -eq $true) -and + ($inputs.fallback_a_route.btnSend_present -eq $true) + if (-not $fallbackObserved -and -not (Test-StructuredFailure $inputs.fallback_a_route.failure)) { + Add-ValidationFailure $validationFailures "FALLBACK_A_ROUTE_EVIDENCE_MISSING" "fallback_a_route needs hwnd/rtbSendMessage/btnSend evidence or structured failure when B-route fails" + } +} + $beforeRuntime = Read-ProbeJson -Stage "before" -Name "probe_client_runtime.json" $beforePreflight = Read-ProbeJson -Stage "before" -Name "send_entrypoints_preflight.json" $beforeNetwork = Read-ProbeJson -Stage "before" -Name "network_inventory.json" @@ -700,6 +833,15 @@ if ($textEnabled -and $inputs.text_attempt.success_ack_or_sent_record_present -n if ($fileEnabled -and $inputs.file_attempt.file_upload_or_sent_record_present -ne $true -and (Test-NonEmptyString $inputs.file_attempt.failure.code)) { $failures.Add($inputs.file_attempt.failure) | Out-Null } +if (Test-StructuredFailure $inputs.runtime_observations.failure) { + $failures.Add($inputs.runtime_observations.failure) | Out-Null +} +if ($groupEnabled -and (Test-StructuredFailure $inputs.group_probe.failure)) { + $failures.Add($inputs.group_probe.failure) | Out-Null +} +if ($fallbackNeeded -and (Test-StructuredFailure $inputs.fallback_a_route.failure)) { + $failures.Add($inputs.fallback_a_route.failure) | Out-Null +} $output = [ordered]@{ run = [ordered]@{ @@ -719,12 +861,15 @@ $output = [ordered]@{ runtime = $runtimeSummary reachability = [ordered]@{ in_process_adapter = $inputs.adapter_reachability + operator_runtime_observations = $inputs.runtime_observations entrypoints = $entrypoints app_context_manager = if ($entrypoints.Contains("text_high_level_by_jid")) { $entrypoints["text_high_level_by_jid"] } else { $null } message_scheduling = if ($entrypoints.Contains("text_message_scheduler")) { $entrypoints["text_message_scheduler"] } else { $null } chat_xmpp = if ($entrypoints.Contains("text_wire_chat_send")) { $entrypoints["text_wire_chat_send"] } else { $null } file_upload = if ($entrypoints.Contains("file_service_upload")) { $entrypoints["file_service_upload"] } else { $null } file_message = if ($entrypoints.Contains("file_wire_message")) { $entrypoints["file_wire_message"] } else { $null } + group_probe = $inputs.group_probe + fallback_a_route = $inputs.fallback_a_route } server_auth = [ordered]@{ operator_supplied = $inputs.server_auth @@ -740,6 +885,8 @@ $output = [ordered]@{ attempts = [ordered]@{ text = $inputs.text_attempt file = $inputs.file_attempt + group = $inputs.group_probe + fallback_a_route = $inputs.fallback_a_route } failures = $failures correlation = [ordered]@{ @@ -765,7 +912,8 @@ $items = @( $outputPath, $evidenceRoot, (Join-Path $root "EXPECTED-RETURN-FILES.txt"), - (Join-Path $root "OPERATOR-STEPS.md") + (Join-Path $root "OPERATOR-STEPS.md"), + (Join-Path $root "TODO-COVERAGE.md") ) Compress-Archive -Path $items -DestinationPath $zip -Force @@ -804,6 +952,7 @@ pause "entrypoint": "RUN-LOGIN-REACHABILITY-SUITE.bat", "input_template": "LOGIN-REACHABILITY-INPUTS.template.json", "return_zip_script": "CREATE-RETURN-ZIP.ps1", + "todo_coverage": "TODO-COVERAGE.md", "recorder_exe": "recorder/ISphereLiveProbeRecorder.exe", "capability_smoke_exe": "tools/isphere-capability-smoke.exe", "required_output_schema_sections": [ @@ -819,6 +968,11 @@ pause ], "production_send_enabled": false, "production_file_send_enabled": false, + "remaining_todo_completed": [ + "runtime_observations", + "group_probe", + "fallback_a_route" + ], "a_route_rpa": "backup_only" } '@ | Set-Content -LiteralPath (Join-Path $packageDir "LOGIN-REACHABILITY-PACKAGE-MANIFEST.json") -Encoding UTF8 diff --git a/scripts/verify-login-reachability-probe-package.ps1 b/scripts/verify-login-reachability-probe-package.ps1 index 10bbe8a..4caa11f 100644 --- a/scripts/verify-login-reachability-probe-package.ps1 +++ b/scripts/verify-login-reachability-probe-package.ps1 @@ -29,6 +29,7 @@ if ($LASTEXITCODE -ne 0) { $requiredFiles = @( "README.txt", "OPERATOR-STEPS.md", + "TODO-COVERAGE.md", "EXPECTED-RETURN-FILES.txt", "LOGIN-REACHABILITY-INPUTS.template.json", "LOGIN-REACHABILITY-INPUTS.schema.json", @@ -60,6 +61,7 @@ foreach ($relative in $requiredFiles) { $instructionText = @( Get-Content -LiteralPath (Join-Path $packageRoot "README.txt") -Raw Get-Content -LiteralPath (Join-Path $packageRoot "OPERATOR-STEPS.md") -Raw + Get-Content -LiteralPath (Join-Path $packageRoot "TODO-COVERAGE.md") -Raw Get-Content -LiteralPath (Join-Path $packageRoot "EXPECTED-RETURN-FILES.txt") -Raw Get-Content -LiteralPath (Join-Path $packageRoot "LOGIN-REACHABILITY-INPUTS.template.json") -Raw Get-Content -LiteralPath (Join-Path $packageRoot "LOGIN-REACHABILITY-PACKAGE-MANIFEST.json") -Raw @@ -86,6 +88,10 @@ foreach ($needle in @( "duplicate_second_file_send_attempted", "production_send_enabled", "production_file_send_enabled", + "runtime_observations", + "group_probe", + "fallback_a_route", + "TODO-COVERAGE", "backup_only" )) { if ($instructionText -notmatch [regex]::Escape($needle)) { @@ -109,8 +115,18 @@ $inputs.run.one_shot_file_enabled = $true $inputs.run.one_text_send_only_confirmed = $true $inputs.run.one_file_send_only_confirmed = $true $inputs.targets.direct_jid = "test-direct@example.invalid" +$inputs.targets.group_jid = "test-group@example.invalid" $inputs.targets.target_selection_source = "verify-script" $inputs.targets.self_send_or_sandbox_account_confirmed = $true +$inputs.runtime_observations.app_context_manager_reachable = $true +$inputs.runtime_observations.message_scheduling_reachable = $true +$inputs.runtime_observations.chat_xmpp_authenticated = $true +$inputs.runtime_observations.target_jid_mapping_observed = $true +$inputs.runtime_observations.file_upload_para_observed = $true +$inputs.runtime_observations.ifile_transfer_reachable = $true +$inputs.runtime_observations.file_upload_result_file_id_observed = $true +$inputs.runtime_observations.send_file_message_finalization_observed = $true +$inputs.runtime_observations.notes = "synthetic runtime observations" $inputs.text_attempt.content_sha256 = ("a" * 64) $inputs.text_attempt.content_length = 16 $inputs.text_attempt.operator_clicked_send_at_local = "2026-07-13T09:01:00+08:00" @@ -127,6 +143,17 @@ $inputs.file_attempt.after_recorder_present = $true $inputs.file_attempt.file_upload_or_sent_record_present = $true $inputs.file_attempt.file_upload_or_sent_record = "synthetic file sent-record ack for verify script" $inputs.file_attempt.duplicate_second_file_send_attempted = $false +$inputs.group_probe.enabled = $true +$inputs.group_probe.group_jid = "test-group@example.invalid" +$inputs.group_probe.chatroom_branch_observed = $true +$inputs.group_probe.speech_permission_state = "allowed" +$inputs.group_probe.upload_permission_state = "allowed" +$inputs.fallback_a_route.enabled_if_b_route_fails = $true +$inputs.fallback_a_route.hwnd = "0x1234" +$inputs.fallback_a_route.rtbSendMessage_present = $true +$inputs.fallback_a_route.btnSend_present = $true +$inputs.fallback_a_route.btnSendFile_or_file_menu_present = $true +$inputs.fallback_a_route.uia_or_screenshot_ref = "synthetic fallback evidence" $inputs.sent_record_source.source_type = "synthetic" $inputs.sent_record_source.source_path_or_ref = "verify-script" $inputs.sent_record_source.before_count = "1"