tools: complete login probe todo coverage

This commit is contained in:
zhaoyilun
2026-07-12 14:08:25 +08:00
parent 93c1d59809
commit 57a0c08656
5 changed files with 198 additions and 7 deletions

View File

@@ -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
```

View File

@@ -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.

View File

@@ -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\<hash>` 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

View File

@@ -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

View File

@@ -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"