diff --git a/.agents/pm/features/pm-ado-move-simulator.toon b/.agents/pm/features/pm-ado-move-simulator.toon new file mode 100644 index 0000000..d92ffd5 --- /dev/null +++ b/.agents/pm/features/pm-ado-move-simulator.toon @@ -0,0 +1,31 @@ +id: pm-ado-move-simulator +title: Preview Azure area and iteration moves with rule and relation evidence +description: "Preview an explicitly selected linked backlog with the existing project field contract, revision-bound Azure validation-only rule checks, typed refusals and direct relation scope changes. No apply or bulk update path." +type: Feature +status: in_progress +priority: 2 +tags: [] +created_at: "2026-10-23T14:29:58.189Z" +updated_at: "2026-10-23T14:47:14.976Z" +author: codex-agent +acceptance_criteria: Synthetic inherited permissions and custom iteration rules yield deterministic allowed/refused rows; No implicit bulk update and bounded request counts; Typed SDK and CLI JSON/TOON; non-git public tracker copy validation; unchanged npm and Bun CI release gates +parent: pm-ado-g4v1 +comments[6]{created_at,author,text}: + "2026-10-23T14:29:58.189Z",codex-agent,"Overlap rechecked on current CLI 2026.10.23 and sibling pm-gantt-chart: generic lifecycle update mutates tracker metadata; Gantt capacity/deferral repair and scheduling contain no Azure area/iteration ACL or conditional process semantics. Reuse discoverProjectContract from pm-ado-field-contracts, existing revision patch builder, relation URL validation and host SDK complete tracker reads; no second metadata crawler. No duplicate move-simulator item found in context/search/open inventory." + "2026-10-23T14:32:39.895Z",codex-agent,"Design: reuse the shipped project contract and AdoClient bounded batch reader plus buildUpdatePatch and same-organization relationTargetId. Single type and explicit 1..50 linked IDs; up to 200 direct links, two batch reads, 56 total requests. Azure PATCH validateOnly=true with bypassRules=false evaluates conditional rules and effective permissions without persistence; previews have no apply/save flag. Relation evidence preserves links and reports classification boundaries if all allowed proposals move; unavailable neighbors remain unknown. No transitive, atomic multi-item or future-permission claim." + "2026-10-23T14:41:11.845Z",codex-agent,"Targeted Node coverage: 11/11 tests pass; moves.ts 100% lines, branches and functions. Maximum 50-item/200-link case uses exactly 56 requests. Non-git installed JSON/TOON commands pass with no git executable on PATH, preserving authoritative files. Public tracker copy at main 3592ce90: 29 items, 63 authoritative files unchanged; raw unlinked selection refuses at 0 requests. Synthetic Azure projection of those real identities/states/relations: 7 allowed, 6 inherited area denials, 16 custom iteration rule refusals, 8 direct links, 5 boundary changes, 34 requests per preview, 11057 JSON bytes, identical reversed-selection replay and zero remote mutations. Projection timing 62 ms; no live Azure acceptance claimed." + "2026-10-23T14:42:08.672Z",codex-agent,"Behavioral revert proof: changed only simulateMove so failed validateOnly responses were treated as allowed. The inherited-permission/custom-iteration regression failed (exit 1): the expected permission_denied and process_rule refusals became allowed rows. Restored the function byte-for-byte. No baseline history rewritten. Local source lint uses the repository docstring gate and diff whitespace check; there is no standalone lint script." + "2026-10-23T14:43:32.764Z",codex-agent,"Local verification complete: npm run typecheck; npm run build; npm run build:test; npm run docstring (12 source files, 86 documented declarations); git diff --check; pm test pm-ado-move-simulator --run --progress all passed (1 linked command, 11 tests, no skips). Public-copy validation repeated with GIT_CEILING_DIRECTORIES and identical counts/immutability (107 ms repeat; initial 62 ms). Revert proof is a failing permissions/rules assertion, restored. Full release gates delegated to existing npm/Bun CI jobs to respect host CPU saturation; thresholds unchanged." + "2026-10-23T14:47:11.013Z",codex-agent,"PR ready for review: https://github.com/unbraind/pm-ado/pull/42 at implementation b5112e3. CI https://github.com/unbraind/pm-ado/actions/runs/39972236061 passed all four jobs: npm release gate, Bun release gate, Node 22 and Node 26. Each full suite passed 226/226, zero skipped; both native coverage and statement-instrumented passes succeeded at unchanged 100/100/100/100 thresholds across 8 measured source files. Docstrings: 12 files / 86 declarations; production audit: zero vulnerabilities. CodeQL passed. Live Azure validation remains unclaimed; reviewer skips/limits are missing review evidence. Implementation complete, item remains in_progress for orchestrator verification; releasing claim without closing. The final PM-only receipt commit will receive another exact-head CI run." +files[5]{path,scope}: + index.ts,project + moves.ts,project + test/fixtures/move-service.ts,project + test/moves.test.ts,project + test/real-data-moves.ts,project +tests[1]{command,scope,provenance{author,created_at,source_kind,source_ref}}: + node --test test/moves.test.ts,project,codex-agent,"2026-10-23T14:37:54.495Z",local_mutation,feat/move-simulator +docs[2]{path,scope}: + docs/move-simulator.md,project + README.md,project +body: "" diff --git a/.agents/pm/history/pm-ado-move-simulator.jsonl b/.agents/pm/history/pm-ado-move-simulator.jsonl new file mode 100644 index 0000000..9647b42 --- /dev/null +++ b/.agents/pm/history/pm-ado-move-simulator.jsonl @@ -0,0 +1,13 @@ +{"hash_algorithm":"sha256","ts":"2026-10-23T14:29:58.189Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"create","patch":[{"op":"add","path":"/metadata/id","value":"pm-ado-move-simulator"},{"op":"add","path":"/metadata/title","value":"Preview Azure area and iteration moves with rule and relation evidence"},{"op":"add","path":"/metadata/description","value":"Preview an explicitly selected linked backlog with the existing project field contract, revision-bound Azure validation-only rule checks, typed refusals and direct relation scope changes. No apply or bulk update path."},{"op":"add","path":"/metadata/type","value":"Feature"},{"op":"add","path":"/metadata/status","value":"open"},{"op":"add","path":"/metadata/priority","value":2},{"op":"add","path":"/metadata/tags","value":[]},{"op":"add","path":"/metadata/created_at","value":"2026-10-23T14:29:58.189Z"},{"op":"add","path":"/metadata/updated_at","value":"2026-10-23T14:29:58.189Z"},{"op":"add","path":"/metadata/author","value":"codex-agent"},{"op":"add","path":"/metadata/acceptance_criteria","value":"Synthetic inherited permissions and custom iteration rules yield deterministic allowed/refused rows; No implicit bulk update and bounded request counts; Typed SDK and CLI JSON/TOON; non-git public tracker copy validation; unchanged npm and Bun CI release gates"},{"op":"add","path":"/metadata/parent","value":"pm-ado-g4v1"},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-10-23T14:29:58.189Z","author":"codex-agent","text":"Overlap rechecked on current CLI 2026.10.23 and sibling pm-gantt-chart: generic lifecycle update mutates tracker metadata; Gantt capacity/deferral repair and scheduling contain no Azure area/iteration ACL or conditional process semantics. Reuse discoverProjectContract from pm-ado-field-contracts, existing revision patch builder, relation URL validation and host SDK complete tracker reads; no second metadata crawler. No duplicate move-simulator item found in context/search/open inventory."}]}],"before_hash":"3cc22dff72be7b14824654a7a64ea62b04799939b2fee54c1b5f52ca60bf6df0","after_hash":"37f35e8efe112f388e8163e728ee6e6e62340da558dd52594b53dd7314c92d51","item_hash_version":3,"message":"","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"30becd0e89a17f0bce609916d78db203e7a796b270b0503b3dfc76bec700a6e0"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:30:03.540Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:30:03.540Z"},{"op":"add","path":"/metadata/assignee","value":"codex-agent"},{"op":"add","path":"/metadata/claim_principal","value":"codex-agent"}],"before_hash":"37f35e8efe112f388e8163e728ee6e6e62340da558dd52594b53dd7314c92d51","after_hash":"cadfea38b1de681b05efbf14ec9bf6a49a3dfa3cb1d77edac4eb2260fa5c6424","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"f7ab3ec6cda6f1ab249fab2fa47f8ada8a0c77416b8fee578afc0168df7bc7c3"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:30:10.869Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:30:10.869Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"cadfea38b1de681b05efbf14ec9bf6a49a3dfa3cb1d77edac4eb2260fa5c6424","after_hash":"9f054b78f6d2f0c7b2bbd8285ef6fd28b895840d0b48ba683ffc945c1fc08763","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"b35adf1da2c773ea2aec90c46a752d44ed43b806c550686406ce4112f0e16bd0"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:32:39.896Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/1","value":{"created_at":"2026-10-23T14:32:39.895Z","author":"codex-agent","text":"Design: reuse the shipped project contract and AdoClient bounded batch reader plus buildUpdatePatch and same-organization relationTargetId. Single type and explicit 1..50 linked IDs; up to 200 direct links, two batch reads, 56 total requests. Azure PATCH validateOnly=true with bypassRules=false evaluates conditional rules and effective permissions without persistence; previews have no apply/save flag. Relation evidence preserves links and reports classification boundaries if all allowed proposals move; unavailable neighbors remain unknown. No transitive, atomic multi-item or future-permission claim."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:32:39.896Z"}],"before_hash":"9f054b78f6d2f0c7b2bbd8285ef6fd28b895840d0b48ba683ffc945c1fc08763","after_hash":"846002b13c79c3a2a5c9468bb830bdc04f72be5310c3c31737428d85635103a7","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"ddbb8a7fa1ed592acde4380a411ff179f46cd26ac3060c6e26fd5903331bbc7d"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:37:29.532Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"files_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:37:29.532Z"},{"op":"add","path":"/metadata/files","value":[{"path":"index.ts","scope":"project"},{"path":"moves.ts","scope":"project"},{"path":"test/fixtures/move-service.ts","scope":"project"},{"path":"test/moves.test.ts","scope":"project"}]}],"before_hash":"846002b13c79c3a2a5c9468bb830bdc04f72be5310c3c31737428d85635103a7","after_hash":"05efe8358430f78cae672f071987f986567bb504c8e198f9d66d86221354c272","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"eed124b45aceeff80cbd8683648fe19f4edbab2fc8b275d84f019a035341de56"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:37:42.524Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:37:42.524Z"},{"op":"add","path":"/metadata/docs","value":[{"path":"docs/move-simulator.md","scope":"project"},{"path":"README.md","scope":"project"}]}],"before_hash":"05efe8358430f78cae672f071987f986567bb504c8e198f9d66d86221354c272","after_hash":"b17f6610ab9638c51a0dce5ca8c2fec56a43f0d2a76a5732985d38a07e83e9eb","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"4bbc3aa1fd1ca677e651c376841b94c59eb2332a9fa511ec781470a971a60e60"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:37:54.697Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"tests_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:37:54.697Z"},{"op":"add","path":"/metadata/tests","value":[{"command":"node --test test/moves.test.ts","scope":"project","provenance":{"author":"codex-agent","created_at":"2026-10-23T14:37:54.495Z","source_kind":"local_mutation","source_ref":"feat/move-simulator"}}]}],"before_hash":"b17f6610ab9638c51a0dce5ca8c2fec56a43f0d2a76a5732985d38a07e83e9eb","after_hash":"234aa77ccc1568e0e6d694fdd25b8bf87ba1c3eab6eddeb0d637c1b82fbadde5","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"6e4642b10c6ed36313b9fd7e507bb8f2d2d8b41d1073d0e7ddc1f7f96e79cc0b"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:41:11.847Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/2","value":{"created_at":"2026-10-23T14:41:11.845Z","author":"codex-agent","text":"Targeted Node coverage: 11/11 tests pass; moves.ts 100% lines, branches and functions. Maximum 50-item/200-link case uses exactly 56 requests. Non-git installed JSON/TOON commands pass with no git executable on PATH, preserving authoritative files. Public tracker copy at main 3592ce90: 29 items, 63 authoritative files unchanged; raw unlinked selection refuses at 0 requests. Synthetic Azure projection of those real identities/states/relations: 7 allowed, 6 inherited area denials, 16 custom iteration rule refusals, 8 direct links, 5 boundary changes, 34 requests per preview, 11057 JSON bytes, identical reversed-selection replay and zero remote mutations. Projection timing 62 ms; no live Azure acceptance claimed."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:41:11.847Z"}],"before_hash":"234aa77ccc1568e0e6d694fdd25b8bf87ba1c3eab6eddeb0d637c1b82fbadde5","after_hash":"eaf432bdd7850c15a0cad9a18a929a3f930787ed07043a350dcc427a3dc97c30","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"cff1d52bf39186bcdea89b6295f3f7b32d77415e9a5ee08f6e1a780a0494ffb4"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:41:23.484Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"files_add","patch":[{"op":"add","path":"/metadata/files/4","value":{"path":"test/real-data-moves.ts","scope":"project"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:41:23.484Z"}],"before_hash":"eaf432bdd7850c15a0cad9a18a929a3f930787ed07043a350dcc427a3dc97c30","after_hash":"411a365c85bd540db359365f246393bb23612b0e201febe54cfc5ea50ee7509f","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"99f70b84eb067dd0cfbe05bc0aac1e184ee6ff60de554e5b19ef9e6e2d97b1c9"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:42:08.672Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/3","value":{"created_at":"2026-10-23T14:42:08.672Z","author":"codex-agent","text":"Behavioral revert proof: changed only simulateMove so failed validateOnly responses were treated as allowed. The inherited-permission/custom-iteration regression failed (exit 1): the expected permission_denied and process_rule refusals became allowed rows. Restored the function byte-for-byte. No baseline history rewritten. Local source lint uses the repository docstring gate and diff whitespace check; there is no standalone lint script."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:42:08.672Z"}],"before_hash":"411a365c85bd540db359365f246393bb23612b0e201febe54cfc5ea50ee7509f","after_hash":"ff61e2e92628c1c8ce3b5d466a8cc37087bd9a9cf5c174c2775023a582999fe2","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"fee24b6ac9444124e3031d72764bf39ca5eb4f911e9f4149916e7a06b6b1da14"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:43:32.767Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/4","value":{"created_at":"2026-10-23T14:43:32.764Z","author":"codex-agent","text":"Local verification complete: npm run typecheck; npm run build; npm run build:test; npm run docstring (12 source files, 86 documented declarations); git diff --check; pm test pm-ado-move-simulator --run --progress all passed (1 linked command, 11 tests, no skips). Public-copy validation repeated with GIT_CEILING_DIRECTORIES and identical counts/immutability (107 ms repeat; initial 62 ms). Revert proof is a failing permissions/rules assertion, restored. Full release gates delegated to existing npm/Bun CI jobs to respect host CPU saturation; thresholds unchanged."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:43:32.767Z"}],"before_hash":"ff61e2e92628c1c8ce3b5d466a8cc37087bd9a9cf5c174c2775023a582999fe2","after_hash":"59ac1cbb5440e89c123a52b6af9407c87c83580e449edc44a4e22e8ac6d7acea","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"bdbe742cbc4bf55c9113fdbb09a5a908826358b2cd0d6f69924dc898c8801bf0"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:47:11.015Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/5","value":{"created_at":"2026-10-23T14:47:11.013Z","author":"codex-agent","text":"PR ready for review: https://github.com/unbraind/pm-ado/pull/42 at implementation b5112e3. CI https://github.com/unbraind/pm-ado/actions/runs/39972236061 passed all four jobs: npm release gate, Bun release gate, Node 22 and Node 26. Each full suite passed 226/226, zero skipped; both native coverage and statement-instrumented passes succeeded at unchanged 100/100/100/100 thresholds across 8 measured source files. Docstrings: 12 files / 86 declarations; production audit: zero vulnerabilities. CodeQL passed. Live Azure validation remains unclaimed; reviewer skips/limits are missing review evidence. Implementation complete, item remains in_progress for orchestrator verification; releasing claim without closing. The final PM-only receipt commit will receive another exact-head CI run."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:47:11.015Z"}],"before_hash":"59ac1cbb5440e89c123a52b6af9407c87c83580e449edc44a4e22e8ac6d7acea","after_hash":"5f7dcc8281c71ef82c7c23ccb5775bc2f442d0d9da7f2ed11802ec56215dfa78","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"5da3c39502867c1112d553debeceeaea7943306a749b00ae9be42944eb87858f"} +{"hash_algorithm":"sha256","ts":"2026-10-23T14:47:14.976Z","author":"codex-agent","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"81d3adccf0aa688db7b2cd08","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-23T14:47:14.976Z"}],"before_hash":"5f7dcc8281c71ef82c7c23ccb5775bc2f442d0d9da7f2ed11802ec56215dfa78","after_hash":"16a9c9f28a02c4b8cb86e626d9d7ba28ba3cb6a0d9ad443c2d13499495789391","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"72a66219ab29bcef3d3464bcc9c2b8f7c8f7cc821f93ad11c4de4efd3616119e"} diff --git a/README.md b/README.md index 04a9c53..d77338d 100644 --- a/README.md +++ b/README.md @@ -119,10 +119,21 @@ failures return typed codes plus remedies. SDK schema/tracker read failures use are successful diagnostic results; inspect `compatible` before planning. See the [SDK and CLI example](docs/field-contracts.md). +## Preview area and iteration moves + +`pm ado move-preview --project Example --items example-a,example-b --iteration-path 'Example\Release' --json` +validates an explicit linked backlog through the existing field contract and +Azure revision-checked `validateOnly` requests. Rows report allowed/refused +decisions with remedies for inherited permission denials and conditional rules. +Direct relation boundaries show downstream classification scope; links remain +preserved. No apply option is exposed. Limits are 50 items, 200 direct links and +56 requests; JSON and TOON output omit item bodies and remote error messages. +See the [SDK/CLI example and limits](docs/move-simulator.md). + ## Without git `ado validate`, `ado contract`, `ado import`, `ado export`, `ado sync`, -`ado resolve-plan` and `ado resolve-apply` work in +`ado move-preview`, `ado resolve-plan` and `ado resolve-apply` work in plain trackers without git. Network operations still need Azure configuration; contract discovery requires an explicit project. Package release/changelog and GitHub workflows need a git checkout and are separate from tracker operations. diff --git a/dist/index.d.ts b/dist/index.d.ts index 4644df1..cada05a 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,4 +1,6 @@ import type { ExtensionApi, PreflightOverrideContext } from "@unbrained/pm-cli/sdk/authoring"; +export { simulateMove, MoveRefusal, MOVE_LIMITS } from "./moves.ts"; +export type { MoveOptions, MoveScope, MoveRow, MoveRelation, MovePreview, MoveRefusalCode } from "./moves.ts"; export { AdoResolutionService, ResolutionRefusal, resolutionDigest, resolutionScopeReference, resolutionFields, validateResolutionPlan } from "./resolution.ts"; export type { ResolutionPlan, ResolutionObserver, ResolutionIntent, ResolutionField, ResolutionChoice, ResolutionReceipt, ResolutionRefusalCode, ResolutionMaps } from "./resolution.ts"; export { discoverProjectContract, ContractRefusal } from "./contracts.ts"; diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index e483e11..b240e49 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index d8144e0..b4ef328 100644 --- a/dist/index.js +++ b/dist/index.js @@ -13,6 +13,8 @@ // remote write here asserts a revision — there is no unchecked write path to // fall back to, by construction rather than by convention. import { runSyncCommand, SYNC_FLAGS } from "./sync.js"; +import { runMoveCommand } from "./moves.js"; +export { simulateMove, MoveRefusal, MOVE_LIMITS } from "./moves.js"; import { runContractCommand } from "./contracts.js"; import { runResolutionCommand } from "./resolution.js"; export { AdoResolutionService, ResolutionRefusal, resolutionDigest, resolutionScopeReference, resolutionFields, validateResolutionPlan } from "./resolution.js"; @@ -920,6 +922,19 @@ export default defineExtension({ ], handler: (ctx) => runResolutionCommand(ctx, "apply"), }); + api.registerCommand({ + name: "ado move-preview", + description: "Validate explicit area/iteration moves without saving; show preserved relation scope changes", + flags: [ + { long: "--project", value_type: "string", description: "Explicit Azure project name" }, + { long: "--items", value_type: "string", description: "Comma-separated exact linked pm IDs (1..50)" }, + { long: "--area-path", value_type: "string", description: "Destination area path rooted in the selected project" }, + { long: "--iteration-path", value_type: "string", description: "Destination iteration path rooted in the selected project" }, + { long: "--type", value_type: "string", description: "Single type to validate (default Task)" }, + { long: "--expect-fingerprint", value_type: "string", description: "Expected shared field contract fingerprint" }, + ], + handler: runMoveCommand, + }); api.registerCommand({ name: "ado contract", description: "Discover a selected Azure project field/type/state contract without writes", diff --git a/dist/index.js.map b/dist/index.js.map index 45f2cb3..b1f7798 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/moves.d.ts b/dist/moves.d.ts new file mode 100644 index 0000000..9932013 --- /dev/null +++ b/dist/moves.d.ts @@ -0,0 +1,115 @@ +/** Revision-bound classification previews using the shared contract and Azure's non-saving validator. */ +import type { CommandHandlerContext } from "@unbrained/pm-cli/sdk/authoring"; +import type { ItemMetadata } from "@unbrained/pm-cli/sdk"; +import { type AdoConfig, type AdoTransport } from "./index.ts"; +/** Hard bounds: one type contract, two batch reads and at most fifty validations. */ +export declare const MOVE_LIMITS: { + readonly items: 50; + readonly relations: 200; + readonly requests: 56; +}; +/** Stable failures; validation never exposes Azure response messages or credentials. */ +export type MoveRefusalCode = "configuration" | "selection" | "budget_exceeded" | "invalid_schema" | "remote_failure" | "permission_denied" | "not_found" | "process_rule" | "revision_changed" | "field_contract"; +/** Sanitized actionable SDK exception with the host's semantic exit code. */ +export declare class MoveRefusal extends Error { + /** Stable refusal code for automated callers. */ + readonly code: MoveRefusalCode; + /** Next action without remote error text. */ + readonly remedy: string; + /** Usage errors exit 2; revision conflicts exit 4; other refusals exit 3. */ + readonly exitCode: number; + /** Bind a stable refusal to its public remedy. */ + constructor(code: MoveRefusalCode); +} +/** Explicit selection from a complete SDK snapshot; no inferred bulk selection. */ +export interface MoveOptions { + /** Complete host SDK read, never a bounded list page. */ + items: readonly ItemMetadata[]; + /** Exact pm IDs selected by the caller. */ + ids: readonly string[]; + /** Optional destination area; omitted dimensions retain the observed value. */ + areaPath?: string; + /** Optional destination iteration. */ + iterationPath?: string; + /** Single work item type; defaults to Task to keep discovery bounded. */ + type?: string; + /** Optional pin for the existing field contract fingerprint. */ + expectedFingerprint?: string; +} +/** Classification pair, with no title, description, identity or raw remote URL. */ +export interface MoveScope { + /** Azure area path. */ + area: string; + /** Azure iteration path. */ + iteration: string; +} +/** One independent rule validation at an observed remote revision. */ +export interface MoveRow { + /** Selected pm identity. */ + id: string; + /** Linked Azure identity. */ + ado_id: number; + /** Revision validated, or null when the item is unavailable. */ + rev: number | null; + /** Allowed means this single validation passed; it is not an apply authorization. */ + decision: "allowed" | "refused"; + /** Stable refusal or null for an allowed row. */ + code: MoveRefusalCode | null; + /** Specific next step; empty for an allowed row. */ + remedy: string; + /** Observed scope, null when unavailable. */ + before: MoveScope | null; + /** Proposed scope, null when unavailable. */ + after: MoveScope | null; +} +/** A preserved direct link's classification boundary before/after all allowed proposals. */ +export interface MoveRelation { + /** Source Azure identity. */ + source: number; + /** Azure relation reference name. */ + relation: string; + /** Safe same-organization target identity, null for opaque external/resource links. */ + target: number | null; + /** Links are never rewritten by classification moves. */ + action: "preserved"; + /** Whether endpoints share each classification, null for an unreadable/opaque target. */ + before: { + area: boolean; + iteration: boolean; + } | null; + /** Scope if every allowed row moves; refused rows retain their observed scope. */ + after: { + area: boolean; + iteration: boolean; + } | null; +} +/** Compact deterministic preview with explicit completeness and request accounting. */ +export interface MovePreview { + /** True only when every selected row was allowed. */ + ok: boolean; + /** Always true; no application capability is exposed. */ + preview: true; + /** Existing metadata contract pin. */ + fingerprint: string; + /** Total remote requests including discovery, batch reads and validateOnly calls. */ + requests: number; + /** Single-item validation results, ordered by pm ID. */ + rows: MoveRow[]; + /** Direct links only; no transitive or team-board membership claim. */ + relations: MoveRelation[]; +} +/** + * Preview only explicit linked items. Azure evaluates inherited permissions and custom rules + * through revision-checked PATCH validateOnly=true, bypassRules=false. No changes are saved. + * Single-item validations are observations, not a transaction or a future permission grant. + */ +export declare function simulateMove(config: AdoConfig, request: AdoTransport, options: MoveOptions): Promise; +/** Read the complete host snapshot and delegate rendering to the pm command runtime. */ +export declare function runMoveCommand(ctx: CommandHandlerContext): Promise; +//# sourceMappingURL=moves.d.ts.map \ No newline at end of file diff --git a/dist/moves.d.ts.map b/dist/moves.d.ts.map new file mode 100644 index 0000000..27424da --- /dev/null +++ b/dist/moves.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../moves.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/moves.js b/dist/moves.js new file mode 100644 index 0000000..c3180ba --- /dev/null +++ b/dist/moves.js @@ -0,0 +1,185 @@ +import { AdoClient, buildUpdatePatch, relationTargetId, stripTrailingSlashes } from "./index.js"; +import { ContractRefusal, discoverProjectContract } from "./contracts.js"; +/** Hard bounds: one type contract, two batch reads and at most fifty validations. */ +export const MOVE_LIMITS = { items: 50, relations: 200, requests: 56 }; +/** Remedies shared by row-level and whole-preview refusals. */ +const remedies = { + configuration: "Supply a project name, credentials, one type, explicit item IDs and a project-rooted area or iteration path.", + selection: "Select 1..50 distinct existing pm IDs with unique positive safe-integer ado_id links in this organization/project; import missing provenance first.", + budget_exceeded: "Narrow the selection: at most 50 items, 200 direct relations and 56 requests per preview.", + invalid_schema: "Refresh the Azure snapshot; check complete work item IDs, revisions, project, classification fields and relations.", + remote_failure: "Check service availability, timeout and the complete local SDK read; retry the preview without applying changes.", + permission_denied: "Ask an administrator to check effective inherited Edit work items permissions on source and destination areas for this identity.", + not_found: "Verify visibility of the selected work items and destination classification paths, then refresh the preview.", + process_rule: "Review the project's custom conditional rules and destination iteration requirements; correct the proposal and validate again.", + revision_changed: "Re-read the work item and rerun this preview; do not replay the stale revision.", + field_contract: "Choose the discovered enabled type and writable treePath fields with allowed destination values; refresh the contract.", +}; +/** Sanitized actionable SDK exception with the host's semantic exit code. */ +export class MoveRefusal extends Error { + /** Stable refusal code for automated callers. */ + code; + /** Next action without remote error text. */ + remedy; + /** Usage errors exit 2; revision conflicts exit 4; other refusals exit 3. */ + exitCode; + /** Bind a stable refusal to its public remedy. */ + constructor(code) { + super(`Azure move preview refused: ${code}`); + this.name = "MoveRefusal"; + this.code = code; + this.remedy = remedies[code]; + this.exitCode = ["configuration", "selection", "budget_exceeded"].includes(code) ? 2 : code === "revision_changed" ? 4 : 3; + } +} +/** Require a documented response shape without disclosing its contents. */ +function requireShape(condition) { + if (!condition) + throw new MoveRefusal("invalid_schema"); +} +/** Validate only the classification projection needed for direct relation evidence. */ +function scope(item) { + requireShape(typeof item.fields === "object" && item.fields !== null); + const area = item.fields["System.AreaPath"], iteration = item.fields["System.IterationPath"]; + requireShape(typeof area === "string" && area.length > 0 && typeof iteration === "string" && iteration.length > 0); + return { area, iteration }; +} +/** Validate a bounded batch before trusting the existing client's typed response. */ +function checked(items, ids) { + requireShape(new Set(items.map((item) => item.id)).size === items.length); + for (const item of items) { + requireShape(ids.includes(item.id) && Number.isSafeInteger(item.rev) && item.rev > 0); + scope(item); + requireShape(item.relations === undefined || Array.isArray(item.relations) && item.relations.every((link) => link !== null && typeof link.rel === "string" && typeof link.url === "string")); + } + return new Map(items.map((item) => [item.id, item])); +} +/** Compare classification boundaries without emitting linked item contents. */ +function boundary(left, right) { + return { area: left.area === right.area, iteration: left.iteration === right.iteration }; +} +/** + * Preview only explicit linked items. Azure evaluates inherited permissions and custom rules + * through revision-checked PATCH validateOnly=true, bypassRules=false. No changes are saved. + * Single-item validations are observations, not a transaction or a future permission grant. + */ +export async function simulateMove(config, request, options) { + try { + const paths = [options.areaPath, options.iterationPath].filter((path) => path !== undefined); + if (paths.length === 0 || paths.some((path) => typeof path !== "string" || path.length > 1024 || path.split("\\")[0] !== config.project || path.split("\\").some((part) => !part.trim() || [".", ".."].includes(part)))) + throw new MoveRefusal("configuration"); + if (options.ids.length === 0 || options.ids.length > MOVE_LIMITS.items || new Set(options.ids).size !== options.ids.length) + throw new MoveRefusal("selection"); + const selected = options.ids.map((id) => options.items.find((item) => item.id === id)); + if (selected.some((item) => !item || !Number.isSafeInteger(item.ado_id) || Number(item.ado_id) <= 0) || new Set(selected.map((item) => item.ado_id)).size !== selected.length) + throw new MoveRefusal("selection"); + const local = selected; + if (local.some((item) => item.ado_org_url !== stripTrailingSlashes(config.orgUrl) || item.ado_project !== config.project || + options.items.filter((entry) => entry.ado_id === item.ado_id && entry.ado_org_url === item.ado_org_url && entry.ado_project === item.ado_project).length !== 1)) + throw new MoveRefusal("selection"); + local.sort((a, b) => a.id < b.id ? -1 : Number(a.id > b.id)); + let requests = 0; + /** Count every network call and sanitize transport errors before reaching callers. */ + const counted = async (method, url, body, headers) => { + if (requests >= MOVE_LIMITS.requests) + throw new MoveRefusal("budget_exceeded"); + requests++; + try { + return await request(method, url, body, headers); + } + catch { + throw new MoveRefusal("remote_failure"); + } + }; + const type = options.type ?? "Task"; + const contract = await discoverProjectContract(config, counted, { type, expectedFingerprint: options.expectedFingerprint }); + const client = new AdoClient({ ...config, orgUrl: stripTrailingSlashes(config.orgUrl) }, counted); + const ids = local.map((item) => Number(item.ado_id)); + const remote = checked((await client.getWorkItemsReport(ids)).items, ids); + const links = [...remote.values()].flatMap((item) => (item.relations ?? []).map((link) => ({ source: item.id, relation: link.rel, target: relationTargetId(link.url, config.orgUrl) ?? null }))); + if (links.length > MOVE_LIMITS.relations) + throw new MoveRefusal("budget_exceeded"); + const neighbors = [...new Set(links.flatMap((link) => link.target === null || remote.has(link.target) ? [] : [link.target]))]; + const linked = checked((await client.getWorkItemsReport(neighbors)).items, neighbors); + const all = new Map([...remote, ...linked]); + const rows = []; + for (const item of local) { + const current = remote.get(Number(item.ado_id)); + const before = current ? scope(current) : null; + const after = before ? { area: options.areaPath ?? before.area, iteration: options.iterationPath ?? before.iteration } : null; + let code = null; + if (!current) + code = "not_found"; + else if (current.fields["System.TeamProject"] !== config.project || current.fields["System.WorkItemType"] !== type || contract.types[0].disabled) + code = "field_contract"; + else { + const fields = Object.fromEntries([["System.AreaPath", options.areaPath], ["System.IterationPath", options.iterationPath]].filter(([, value]) => value !== undefined)); + if (Object.entries(fields).some(([ref, value]) => { + const field = contract.types[0].fields.find((entry) => entry.ref === ref); + return !field || !field.writable || field.type !== "treePath" || field.allowed.length > 0 && !field.allowed.includes(value); + })) + code = "field_contract"; + else { + const url = `${stripTrailingSlashes(config.orgUrl)}/${encodeURIComponent(config.project)}/_apis/wit/workitems/${current.id}?api-version=7.1&validateOnly=true&bypassRules=false`; + const response = await counted("PATCH", url, JSON.stringify(buildUpdatePatch(current.rev, fields)), { Accept: "application/json", "Content-Type": "application/json-patch+json", Authorization: `Basic ${Buffer.from(`:${config.token}`).toString("base64")}` }); + if (response.status !== 200) + code = { 400: "process_rule", 401: "permission_denied", 403: "permission_denied", 404: "not_found", 409: "revision_changed", 412: "revision_changed" }[response.status] ?? "remote_failure"; + else { + let validated; + try { + validated = JSON.parse(response.body); + } + catch { + throw new MoveRefusal("invalid_schema"); + } + requireShape(validated !== null && validated.id === current.id); + const observed = scope(validated); + requireShape(observed.area === after.area && observed.iteration === after.iteration); + } + } + } + rows.push({ id: item.id, ado_id: Number(item.ado_id), rev: current?.rev ?? null, decision: code ? "refused" : "allowed", code, remedy: code ? remedies[code] : "", before, after }); + } + /** Only allowed proposals participate in the downstream scope scenario. */ + const proposed = (id) => { + const row = rows.find((entry) => entry.ado_id === id && entry.decision === "allowed"); + return row ? row.after : scope(all.get(id)); + }; + const relations = links.map((link) => ({ ...link, action: "preserved", before: link.target !== null && all.has(link.target) ? boundary(scope(all.get(link.source)), scope(all.get(link.target))) : null, + after: link.target !== null && all.has(link.target) ? boundary(proposed(link.source), proposed(link.target)) : null })); + relations.sort((a, b) => { const left = JSON.stringify(a), right = JSON.stringify(b); return left < right ? -1 : Number(left > right); }); + return { ok: rows.every((row) => row.decision === "allowed"), preview: true, fingerprint: contract.fingerprint, requests, rows, relations }; + } + catch (error) { + if (error instanceof MoveRefusal || error instanceof ContractRefusal) + throw error; + throw new MoveRefusal("remote_failure"); + } +} +/** Timeout-bound transport that cannot redirect validation into a saving endpoint. */ +async function moveTransport(method, url, body, headers) { + const response = await fetch(url, { method, body, headers, redirect: "error", signal: AbortSignal.timeout(30_000) }); + return { status: response.status, body: await response.text() }; +} +/** Read the complete host snapshot and delegate rendering to the pm command runtime. */ +export async function runMoveCommand(ctx) { + try { + /** Accept the host's normalized camelCase and direct kebab-case SDK options. */ + const option = (name) => { + const value = ctx.options[name] ?? ctx.options[name.replace(/-([a-z])/gu, (_match, letter) => letter.toUpperCase())]; + if (value !== undefined && (typeof value !== "string" || !value.trim())) + throw new MoveRefusal("configuration"); + return value; + }; + const project = option("project"), items = option("items"); + if (!project || !items || !ctx.sdk?.client || !process.env.ADO_ORG_URL?.trim() || !process.env.ADO_TOKEN?.trim()) + throw new MoveRefusal("configuration"); + return await simulateMove({ orgUrl: process.env.ADO_ORG_URL.trim(), project, token: process.env.ADO_TOKEN.trim() }, moveTransport, { items: (await ctx.sdk.client.listAllComplete()).items, ids: items.split(","), areaPath: option("area-path"), iterationPath: option("iteration-path"), type: option("type"), expectedFingerprint: option("expect-fingerprint") }); + } + catch (error) { + const refusal = error instanceof MoveRefusal || error instanceof ContractRefusal ? error : new MoveRefusal("remote_failure"); + process.exitCode = refusal.exitCode; + return { ok: false, preview: true, code: refusal.code, remedy: refusal.remedy, exit_code: refusal.exitCode }; + } +} +//# sourceMappingURL=moves.js.map \ No newline at end of file diff --git a/dist/moves.js.map b/dist/moves.js.map new file mode 100644 index 0000000..671282a --- /dev/null +++ b/dist/moves.js.map @@ -0,0 +1 @@ +{"version":3,"file":"moves.js","sourceRoot":"","sources":["../moves.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/move-simulator.md b/docs/move-simulator.md new file mode 100644 index 0000000..48602f3 --- /dev/null +++ b/docs/move-simulator.md @@ -0,0 +1,121 @@ +# Preview area and iteration moves + +```sh +# ADO_ORG_URL and ADO_TOKEN are supplied through the environment. +# The identity needs Work Items read/write for Azure's validation endpoint. +pm ado move-preview --project Example --items example-a,example-b \ + --area-path 'Example\Delivery' --iteration-path 'Example\Release' --json +pm ado move-preview --project Example --items example-a \ + --iteration-path 'Example\Release' --output-format toon +``` + +The command selects **only** the exact comma-separated pm IDs. Import/link them +first; unlinked, duplicate, ambiguous or missing selections refuse before any +request. Use the project **name**, and project-rooted classification paths. +Omitting a dimension preserves its observed value. One type is inspected +(`--type Task` by default). Wrong-project or other-type work items are refused. + +`rows` contain pm/Azure IDs, observed revisions, before/after area and iteration, +`decision: allowed|refused`, typed `code` and `remedy`. They omit item bodies, +titles, identities and remote error text. `ok` is false if any row refuses; +row refusals are successful diagnostic output (exit 0). Whole-preview refusals +include `exit_code`: 2 for input/selection/budget, 3 for service/schema/permissions, +4 for the shared contract fingerprint changing. Inspect every row before any +separate application workflow. There is no apply, save or implicit bulk-update +option, and the preview never writes pm items. + +The implementation reuses `discoverProjectContract`, `AdoClient` batch reads, +`buildUpdatePatch`, `relationTargetId` and the host SDK's `listAllComplete`. +It sends metadata GETs, read-only workitemsbatch POSTs and revision-checked +PATCH requests with **validateOnly=true&bypassRules=false**. Azure evaluates +conditional process rules and the authenticated identity's effective permissions, +including inherited area denials; the validator does not save changes. Redirects +are refused, requests time out after 30 seconds and there are no retries. +An allowed row means that individual server validation passed at that revision. +It does not reserve permissions, lock metadata or make a multi-item transaction. +A later application must be explicitly requested and independently revalidate. + +`relations` cover at most 200 direct outgoing links from the selected snapshot, +including Azure's reverse hierarchy/dependency references when present. Links +are preserved; moving classifications does not reparent work items or rewire +dependencies. `before`/`after` report whether the endpoints share the area and +iteration if **all allowed** proposals move and refused rows stay put. Opaque, +foreign or unreadable targets use null boundaries; no external URL is emitted. +This is classification scope evidence, not a team-board membership calculation, +transitive impact analysis or an atomic prediction across independent requests. + +Bounds are 50 selected items, 200 direct links, one type contract (four requests), +at most two batch reads, and at most one validation per selected item: **56 remote +requests maximum**. Empty neighbor batches make zero requests. A relation budget +failure refuses the whole preview before any validations. Discovery errors +never produce a partial contract. `--expect-fingerprint` uses the same field +contract pin as `ado contract`; metadata is not crawled a second way. + +```ts +import { simulateMove, MoveRefusal, ContractRefusal } from "pm-ado"; +import type { AdoTransport } from "pm-ado"; + +const request: AdoTransport = async (method, url, body, headers) => { + const response = await fetch(url, { + method, body, headers, redirect: "error", signal: AbortSignal.timeout(30_000), + }); + return { status: response.status, body: await response.text() }; +}; + +// pm is an existing host-bound PmClient; complete reads carry SDK census checks. +try { + const result = await simulateMove({ + orgUrl: "https://dev.azure.com/example", project: "Example", + token: process.env.ADO_TOKEN!, + }, request, { + items: (await pm.listAllComplete()).items, + ids: ["example-a", "example-b"], + iterationPath: "Example\\Release", + }); + console.log(result.rows, result.relations, result.requests); +} catch (error) { + if (error instanceof MoveRefusal || error instanceof ContractRefusal) { + console.error(error.code, error.remedy); + } else throw error; +} +``` + +SDK transports must preserve HTTP statuses, reject redirects and enforce a +timeout. The CLI supplies that transport. Source trackers can have SDK-derived +cache activity; use a read-only copy when validating source immutability. The +same SDK and installed CLI work in a plain non-git tracker, with no git executable +on PATH. Azure credentials are unnecessary for the synthetic REST tests; live +Azure behavior remains a separate acceptance boundary. + +REST references: [work item validation without saving and rule enforcement](https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-items/update?view=azure-devops-rest-7.1), +[area path permissions and inheritance](https://learn.microsoft.com/en-us/azure/devops/organizations/security/set-permissions-access-work-tracking?view=azure-devops). + +## Public fleet-copy measurement + +The public `unbraind/pm-ado` tracker at +`3592ce90e40331217021b053c479402642a23478` was exported to a plain scratch +directory. A complete SDK read found **29 items**; **63 authoritative files** +remained byte-identical. Unmodified items have no Azure provenance and correctly +refused selection at **zero requests**. + +A synthetic Azure projection retained those real public IDs, lifecycle states +and eight direct relations, adding only in-memory classification/provenance and +fixture permission/rule inputs. It yielded **7 allowed**, **6 inherited area +denials**, **16 conditional iteration refusals**, **5 relation boundary changes**, +**34 requests**, **11,057 JSON bytes**, and **62 ms** for the first preview. +Reversed-selection replay was identical and no remote fixture item changed. +These are real tracker-copy and synthetic Azure measurements, **not live Azure +acceptance**. No source tracker, credentials or private project data were used. + +Reproduce with the repo-pinned dependencies installed: + +```sh +scratch=$(mktemp -d) +git archive 3592ce90e40331217021b053c479402642a23478 .agents/pm | tar -x -C "$scratch" +GIT_CEILING_DIRECTORIES="$(dirname "$scratch")" \ + node test/real-data-moves.ts "$scratch" 3592ce90e40331217021b053c479402642a23478 +``` + +The validator hashes every authoritative file, asserts a zero-network unlinked +refusal, runs the projected scenario twice and checks both local and remote +immutability. It accepts a copy only; it performs no pm mutations. diff --git a/index.ts b/index.ts index cf37862..47de9dd 100644 --- a/index.ts +++ b/index.ts @@ -20,6 +20,9 @@ import type { PreflightOverrideContext, } from "@unbrained/pm-cli/sdk/authoring"; import { runSyncCommand, SYNC_FLAGS } from "./sync.ts"; +import { runMoveCommand } from "./moves.ts"; +export { simulateMove, MoveRefusal, MOVE_LIMITS } from "./moves.ts"; +export type { MoveOptions, MoveScope, MoveRow, MoveRelation, MovePreview, MoveRefusalCode } from "./moves.ts"; import { runContractCommand } from "./contracts.ts"; import { runResolutionCommand } from "./resolution.ts"; export { AdoResolutionService, ResolutionRefusal, resolutionDigest, resolutionScopeReference, resolutionFields, validateResolutionPlan } from "./resolution.ts"; @@ -1096,6 +1099,20 @@ export default defineExtension({ handler: (ctx: CommandHandlerContext) => runResolutionCommand(ctx, "apply"), }); + api.registerCommand({ + name: "ado move-preview", + description: "Validate explicit area/iteration moves without saving; show preserved relation scope changes", + flags: [ + { long: "--project", value_type: "string", description: "Explicit Azure project name" }, + { long: "--items", value_type: "string", description: "Comma-separated exact linked pm IDs (1..50)" }, + { long: "--area-path", value_type: "string", description: "Destination area path rooted in the selected project" }, + { long: "--iteration-path", value_type: "string", description: "Destination iteration path rooted in the selected project" }, + { long: "--type", value_type: "string", description: "Single type to validate (default Task)" }, + { long: "--expect-fingerprint", value_type: "string", description: "Expected shared field contract fingerprint" }, + ], + handler: runMoveCommand, + }); + api.registerCommand({ name: "ado contract", description: "Discover a selected Azure project field/type/state contract without writes", diff --git a/moves.ts b/moves.ts new file mode 100644 index 0000000..097fb97 --- /dev/null +++ b/moves.ts @@ -0,0 +1,235 @@ +/** Revision-bound classification previews using the shared contract and Azure's non-saving validator. */ +import type { CommandHandlerContext } from "@unbrained/pm-cli/sdk/authoring"; +import type { ItemMetadata } from "@unbrained/pm-cli/sdk"; +import { AdoClient, buildUpdatePatch, relationTargetId, stripTrailingSlashes, type AdoConfig, type AdoTransport, type AdoWorkItem } from "./index.ts"; +import { ContractRefusal, discoverProjectContract } from "./contracts.ts"; + +/** Hard bounds: one type contract, two batch reads and at most fifty validations. */ +export const MOVE_LIMITS = { items: 50, relations: 200, requests: 56 } as const; +/** Stable failures; validation never exposes Azure response messages or credentials. */ +export type MoveRefusalCode = "configuration" | "selection" | "budget_exceeded" | "invalid_schema" | "remote_failure" | "permission_denied" | "not_found" | "process_rule" | "revision_changed" | "field_contract"; +/** Remedies shared by row-level and whole-preview refusals. */ +const remedies: Record = { + configuration: "Supply a project name, credentials, one type, explicit item IDs and a project-rooted area or iteration path.", + selection: "Select 1..50 distinct existing pm IDs with unique positive safe-integer ado_id links in this organization/project; import missing provenance first.", + budget_exceeded: "Narrow the selection: at most 50 items, 200 direct relations and 56 requests per preview.", + invalid_schema: "Refresh the Azure snapshot; check complete work item IDs, revisions, project, classification fields and relations.", + remote_failure: "Check service availability, timeout and the complete local SDK read; retry the preview without applying changes.", + permission_denied: "Ask an administrator to check effective inherited Edit work items permissions on source and destination areas for this identity.", + not_found: "Verify visibility of the selected work items and destination classification paths, then refresh the preview.", + process_rule: "Review the project's custom conditional rules and destination iteration requirements; correct the proposal and validate again.", + revision_changed: "Re-read the work item and rerun this preview; do not replay the stale revision.", + field_contract: "Choose the discovered enabled type and writable treePath fields with allowed destination values; refresh the contract.", +}; +/** Sanitized actionable SDK exception with the host's semantic exit code. */ +export class MoveRefusal extends Error { + /** Stable refusal code for automated callers. */ + readonly code: MoveRefusalCode; + /** Next action without remote error text. */ + readonly remedy: string; + /** Usage errors exit 2; revision conflicts exit 4; other refusals exit 3. */ + readonly exitCode: number; + /** Bind a stable refusal to its public remedy. */ + constructor(code: MoveRefusalCode) { + super(`Azure move preview refused: ${code}`); + this.name = "MoveRefusal"; this.code = code; this.remedy = remedies[code]; + this.exitCode = ["configuration", "selection", "budget_exceeded"].includes(code) ? 2 : code === "revision_changed" ? 4 : 3; + } +} +/** Explicit selection from a complete SDK snapshot; no inferred bulk selection. */ +export interface MoveOptions { + /** Complete host SDK read, never a bounded list page. */ + items: readonly ItemMetadata[]; + /** Exact pm IDs selected by the caller. */ + ids: readonly string[]; + /** Optional destination area; omitted dimensions retain the observed value. */ + areaPath?: string; + /** Optional destination iteration. */ + iterationPath?: string; + /** Single work item type; defaults to Task to keep discovery bounded. */ + type?: string; + /** Optional pin for the existing field contract fingerprint. */ + expectedFingerprint?: string; +} +/** Classification pair, with no title, description, identity or raw remote URL. */ +export interface MoveScope { + /** Azure area path. */ + area: string; + /** Azure iteration path. */ + iteration: string; +} +/** One independent rule validation at an observed remote revision. */ +export interface MoveRow { + /** Selected pm identity. */ + id: string; + /** Linked Azure identity. */ + ado_id: number; + /** Revision validated, or null when the item is unavailable. */ + rev: number | null; + /** Allowed means this single validation passed; it is not an apply authorization. */ + decision: "allowed" | "refused"; + /** Stable refusal or null for an allowed row. */ + code: MoveRefusalCode | null; + /** Specific next step; empty for an allowed row. */ + remedy: string; + /** Observed scope, null when unavailable. */ + before: MoveScope | null; + /** Proposed scope, null when unavailable. */ + after: MoveScope | null; +} +/** A preserved direct link's classification boundary before/after all allowed proposals. */ +export interface MoveRelation { + /** Source Azure identity. */ + source: number; + /** Azure relation reference name. */ + relation: string; + /** Safe same-organization target identity, null for opaque external/resource links. */ + target: number | null; + /** Links are never rewritten by classification moves. */ + action: "preserved"; + /** Whether endpoints share each classification, null for an unreadable/opaque target. */ + before: { area: boolean; iteration: boolean } | null; + /** Scope if every allowed row moves; refused rows retain their observed scope. */ + after: { area: boolean; iteration: boolean } | null; +} +/** Compact deterministic preview with explicit completeness and request accounting. */ +export interface MovePreview { + /** True only when every selected row was allowed. */ + ok: boolean; + /** Always true; no application capability is exposed. */ + preview: true; + /** Existing metadata contract pin. */ + fingerprint: string; + /** Total remote requests including discovery, batch reads and validateOnly calls. */ + requests: number; + /** Single-item validation results, ordered by pm ID. */ + rows: MoveRow[]; + /** Direct links only; no transitive or team-board membership claim. */ + relations: MoveRelation[]; +} +/** Require a documented response shape without disclosing its contents. */ +function requireShape(condition: unknown): asserts condition { + if (!condition) throw new MoveRefusal("invalid_schema"); +} +/** Validate only the classification projection needed for direct relation evidence. */ +function scope(item: AdoWorkItem): MoveScope { + requireShape(typeof item.fields === "object" && item.fields !== null); + const area = item.fields["System.AreaPath"], iteration = item.fields["System.IterationPath"]; + requireShape(typeof area === "string" && area.length > 0 && typeof iteration === "string" && iteration.length > 0); + return { area, iteration }; +} +/** Validate a bounded batch before trusting the existing client's typed response. */ +function checked(items: AdoWorkItem[], ids: readonly number[]): Map { + requireShape(new Set(items.map((item) => item.id)).size === items.length); + for (const item of items) { + requireShape(ids.includes(item.id) && Number.isSafeInteger(item.rev) && item.rev > 0); + scope(item); + requireShape(item.relations === undefined || Array.isArray(item.relations) && item.relations.every((link) => link !== null && typeof link.rel === "string" && typeof link.url === "string")); + } + return new Map(items.map((item) => [item.id, item])); +} +/** Compare classification boundaries without emitting linked item contents. */ +function boundary(left: MoveScope, right: MoveScope) { + return { area: left.area === right.area, iteration: left.iteration === right.iteration }; +} +/** + * Preview only explicit linked items. Azure evaluates inherited permissions and custom rules + * through revision-checked PATCH validateOnly=true, bypassRules=false. No changes are saved. + * Single-item validations are observations, not a transaction or a future permission grant. + */ +export async function simulateMove(config: AdoConfig, request: AdoTransport, options: MoveOptions): Promise { + try { + const paths = [options.areaPath, options.iterationPath].filter((path) => path !== undefined); + if (paths.length === 0 || paths.some((path) => typeof path !== "string" || path.length > 1024 || path.split("\\")[0] !== config.project || path.split("\\").some((part) => !part.trim() || [".", ".."].includes(part)))) throw new MoveRefusal("configuration"); + if (options.ids.length === 0 || options.ids.length > MOVE_LIMITS.items || new Set(options.ids).size !== options.ids.length) throw new MoveRefusal("selection"); + const selected = options.ids.map((id) => options.items.find((item) => item.id === id)); + if (selected.some((item) => !item || !Number.isSafeInteger(item.ado_id) || Number(item.ado_id) <= 0) || new Set(selected.map((item) => item!.ado_id)).size !== selected.length) throw new MoveRefusal("selection"); + const local = selected as ItemMetadata[]; + if (local.some((item) => item.ado_org_url !== stripTrailingSlashes(config.orgUrl) || item.ado_project !== config.project || + options.items.filter((entry) => entry.ado_id === item.ado_id && entry.ado_org_url === item.ado_org_url && entry.ado_project === item.ado_project).length !== 1)) throw new MoveRefusal("selection"); + local.sort((a, b) => a.id < b.id ? -1 : Number(a.id > b.id)); + let requests = 0; + /** Count every network call and sanitize transport errors before reaching callers. */ + const counted: AdoTransport = async (method, url, body, headers) => { + if (requests >= MOVE_LIMITS.requests) throw new MoveRefusal("budget_exceeded"); + requests++; + try { return await request(method, url, body, headers); } + catch { throw new MoveRefusal("remote_failure"); } + }; + const type = options.type ?? "Task"; + const contract = await discoverProjectContract(config, counted, { type, expectedFingerprint: options.expectedFingerprint }); + const client = new AdoClient({ ...config, orgUrl: stripTrailingSlashes(config.orgUrl) }, counted); + const ids = local.map((item) => Number(item.ado_id)); + const remote = checked((await client.getWorkItemsReport(ids)).items, ids); + const links = [...remote.values()].flatMap((item) => (item.relations ?? []).map((link) => ({ source: item.id, relation: link.rel, target: relationTargetId(link.url, config.orgUrl) ?? null }))); + if (links.length > MOVE_LIMITS.relations) throw new MoveRefusal("budget_exceeded"); + const neighbors = [...new Set(links.flatMap((link) => link.target === null || remote.has(link.target) ? [] : [link.target]))]; + const linked = checked((await client.getWorkItemsReport(neighbors)).items, neighbors); + const all = new Map([...remote, ...linked]); + const rows: MoveRow[] = []; + for (const item of local) { + const current = remote.get(Number(item.ado_id)); + const before = current ? scope(current) : null; + const after = before ? { area: options.areaPath ?? before.area, iteration: options.iterationPath ?? before.iteration } : null; + let code: MoveRefusalCode | null = null; + if (!current) code = "not_found"; + else if (current.fields["System.TeamProject"] !== config.project || current.fields["System.WorkItemType"] !== type || contract.types[0]!.disabled) code = "field_contract"; + else { + const fields = Object.fromEntries([["System.AreaPath", options.areaPath], ["System.IterationPath", options.iterationPath]].filter(([, value]) => value !== undefined)); + if (Object.entries(fields).some(([ref, value]) => { + const field = contract.types[0]!.fields.find((entry) => entry.ref === ref); + return !field || !field.writable || field.type !== "treePath" || field.allowed.length > 0 && !field.allowed.includes(value); + })) code = "field_contract"; + else { + const url = `${stripTrailingSlashes(config.orgUrl)}/${encodeURIComponent(config.project)}/_apis/wit/workitems/${current.id}?api-version=7.1&validateOnly=true&bypassRules=false`; + const response = await counted("PATCH", url, JSON.stringify(buildUpdatePatch(current.rev, fields)), { Accept: "application/json", "Content-Type": "application/json-patch+json", Authorization: `Basic ${Buffer.from(`:${config.token}`).toString("base64")}` }); + if (response.status !== 200) code = ({ 400: "process_rule", 401: "permission_denied", 403: "permission_denied", 404: "not_found", 409: "revision_changed", 412: "revision_changed" } as Record)[response.status] ?? "remote_failure"; + else { + let validated: AdoWorkItem; + try { validated = JSON.parse(response.body) as AdoWorkItem; } catch { throw new MoveRefusal("invalid_schema"); } + requireShape(validated !== null && validated.id === current.id); + const observed = scope(validated); + requireShape(observed.area === after!.area && observed.iteration === after!.iteration); + } + } + } + rows.push({ id: item.id, ado_id: Number(item.ado_id), rev: current?.rev ?? null, decision: code ? "refused" : "allowed", code, remedy: code ? remedies[code] : "", before, after }); + } + /** Only allowed proposals participate in the downstream scope scenario. */ + const proposed = (id: number): MoveScope => { + const row = rows.find((entry) => entry.ado_id === id && entry.decision === "allowed"); + return row ? row.after! : scope(all.get(id)!); + }; + const relations: MoveRelation[] = links.map((link) => ({ ...link, action: "preserved", before: link.target !== null && all.has(link.target) ? boundary(scope(all.get(link.source)!), scope(all.get(link.target)!)) : null, + after: link.target !== null && all.has(link.target) ? boundary(proposed(link.source), proposed(link.target)) : null })); + relations.sort((a, b) => { const left = JSON.stringify(a), right = JSON.stringify(b); return left < right ? -1 : Number(left > right); }); + return { ok: rows.every((row) => row.decision === "allowed"), preview: true, fingerprint: contract.fingerprint, requests, rows, relations }; + } catch (error) { + if (error instanceof MoveRefusal || error instanceof ContractRefusal) throw error; + throw new MoveRefusal("remote_failure"); + } +} +/** Timeout-bound transport that cannot redirect validation into a saving endpoint. */ +async function moveTransport(method: string, url: string, body: string | undefined, headers: Readonly>) { + const response = await fetch(url, { method, body, headers, redirect: "error", signal: AbortSignal.timeout(30_000) }); + return { status: response.status, body: await response.text() }; +} +/** Read the complete host snapshot and delegate rendering to the pm command runtime. */ +export async function runMoveCommand(ctx: CommandHandlerContext) { + try { + /** Accept the host's normalized camelCase and direct kebab-case SDK options. */ + const option = (name: string): string | undefined => { + const value = ctx.options[name] ?? ctx.options[name.replace(/-([a-z])/gu, (_match, letter: string) => letter.toUpperCase())]; + if (value !== undefined && (typeof value !== "string" || !value.trim())) throw new MoveRefusal("configuration"); + return value; + }; + const project = option("project"), items = option("items"); + if (!project || !items || !ctx.sdk?.client || !process.env.ADO_ORG_URL?.trim() || !process.env.ADO_TOKEN?.trim()) throw new MoveRefusal("configuration"); + return await simulateMove({ orgUrl: process.env.ADO_ORG_URL.trim(), project, token: process.env.ADO_TOKEN.trim() }, moveTransport, + { items: (await ctx.sdk.client.listAllComplete()).items, ids: items.split(","), areaPath: option("area-path"), iterationPath: option("iteration-path"), type: option("type"), expectedFingerprint: option("expect-fingerprint") }); + } catch (error) { + const refusal = error instanceof MoveRefusal || error instanceof ContractRefusal ? error : new MoveRefusal("remote_failure"); + process.exitCode = refusal.exitCode; + return { ok: false, preview: true, code: refusal.code, remedy: refusal.remedy, exit_code: refusal.exitCode }; + } +} diff --git a/package.json b/package.json index 1de05d5..58ec3f3 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "docs/typed-relations.md", "docs/sync.md", "docs/field-contracts.md", - "docs/conflict-resolution.md" + "docs/conflict-resolution.md", + "docs/move-simulator.md" ], "scripts": { "build": "tsc", @@ -107,7 +108,8 @@ "docs/typed-relations.md", "docs/sync.md", "docs/field-contracts.md", - "docs/conflict-resolution.md" + "docs/conflict-resolution.md", + "docs/move-simulator.md" ], "examples": [ "README.md" diff --git a/test/fixtures/move-service.ts b/test/fixtures/move-service.ts new file mode 100644 index 0000000..c815b62 --- /dev/null +++ b/test/fixtures/move-service.ts @@ -0,0 +1,58 @@ +/** Synthetic REST project with inherited ACLs and a conditional iteration rule; never persists PATCH. */ +import assert from "node:assert/strict"; +import type { AdoConfig, AdoTransport, AdoWorkItem, JsonPatchOperation } from "../../index.ts"; + +/** Create a minimal complete classification work item for service validation. */ +export function moveItem(id: number, fields: Record = {}): AdoWorkItem { + return { id, rev: 7, fields: { "System.TeamProject": "Example", "System.WorkItemType": "Task", "System.AreaPath": "Example\\Old", "System.IterationPath": "Example\\Old Sprint", "Custom.Ready": true, ...fields }, relations: [] }; +} +/** A REST test double, distinct from the real pm SDK used by every tracker test. */ +export function moveService(initial: AdoWorkItem[] = [moveItem(1)]) { + const config: AdoConfig = { orgUrl: "https://dev.azure.com/example", project: "Example", token: "synthetic-move-token" }; + const items = new Map(initial.map((item) => [item.id, structuredClone(item)])); + const calls: { method: string; url: string; body: unknown }[] = []; + const fields = ["System.AreaPath", "System.IterationPath"].map((referenceName) => ({ referenceName, type: "treePath", readOnly: false })); + const typeFields = fields.map((field) => ({ referenceName: field.referenceName, alwaysRequired: true, allowedValues: [] as string[] })); + const types = [{ name: "Task", referenceName: "Example.Task", isDisabled: false, states: [{ name: "New" }] }]; + const overrides = new Map(); + const deniedAreas = new Set(); + let batchTransform = (value: AdoWorkItem[]): unknown => value; + /** Match ancestor paths; an inherited deny wins over destination visibility. */ + const denied = (path: string) => [...deniedAreas].some((ancestor) => path === ancestor || path.startsWith(`${ancestor}\\`)); + /** Expose exactly the contract, read-only batch and non-saving validation endpoints. */ + const request: AdoTransport = async (method, raw, body, headers) => { + const url = new URL(raw); + const path = url.pathname.split("/_apis/wit/")[1]!; + const data = body === undefined ? undefined : JSON.parse(body) as Record & JsonPatchOperation[]; + calls.push({ method, url: raw, body: data }); + assert.equal(headers.Authorization, `Basic ${Buffer.from(`:${config.token}`).toString("base64")}`); + const override = overrides.get(method === "PATCH" ? `patch:${path.split("/").at(-1)}` : path); + if (override) return override; + /** Encode one sanitized fixture response. */ + const response = (status: number, value: unknown) => ({ status, body: JSON.stringify(value) }); + if (method === "GET") { + const value = path === "fields" ? fields : path === "workitemtypes" ? types : path === "workitemrelationtypes" ? [] : typeFields; + return response(200, { count: value.length, value }); + } + if (path === "workitemsbatch") { + assert.equal(method, "POST"); assert.equal(data!.$expand, "relations"); + const value = (data!.ids as number[]).flatMap((id) => items.has(id) ? [items.get(id)!] : []); + return response(200, { count: value.length, value: batchTransform(value) }); + } + assert.equal(method, "PATCH"); assert.equal(url.searchParams.get("validateOnly"), "true"); + assert.equal(url.searchParams.get("bypassRules"), "false"); + assert.equal(headers["Content-Type"], "application/json-patch+json"); + const current = items.get(Number(path.split("/").at(-1)))!; + assert.equal(data![0]!.op, "test"); assert.equal(data![0]!.path, "/rev"); + if (data![0]!.value !== current.rev) return response(412, {}); + const proposed = structuredClone(current); + for (const op of data!.slice(1)) { + assert.ok(["/fields/System.AreaPath", "/fields/System.IterationPath"].includes(op.path)); + proposed.fields[op.path.slice(8)] = op.value; + } + if (denied(String(current.fields["System.AreaPath"])) || denied(String(proposed.fields["System.AreaPath"]))) return response(403, { message: "server-secret inherited deny" }); + if (String(proposed.fields["System.IterationPath"]).endsWith("\\Release") && !proposed.fields["Custom.Ready"]) return response(400, { message: "server-secret conditional iteration rule" }); + return response(200, proposed); + }; + return { config, request, items, calls, fields, typeFields, types, overrides, deniedAreas, transformBatch: (fn: typeof batchTransform) => { batchTransform = fn; } }; +} diff --git a/test/moves.test.ts b/test/moves.test.ts new file mode 100644 index 0000000..9eec097 --- /dev/null +++ b/test/moves.test.ts @@ -0,0 +1,236 @@ +/** Real SDK trackers, deterministic Azure rule validation, bounded reads and installed no-git CLI. */ +import assert from "node:assert/strict"; +import { execFile } from "node:child_process"; +import { createHash } from "node:crypto"; +import { cpSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs"; +import { createServer } from "node:http"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { promisify } from "node:util"; +import test from "node:test"; +import { PmClient, type ItemMetadata } from "@unbrained/pm-cli/sdk"; +import { createExtensionTestHarness } from "@unbrained/pm-cli/sdk/testing"; +import extension, { ContractRefusal, MOVE_LIMITS, MoveRefusal, simulateMove, type AdoWorkItem, type MoveOptions, type MovePreview } from "../index.ts"; +import * as built from "../dist/index.js"; +import { moveItem, moveService } from "./fixtures/move-service.ts"; +const repo = resolve(import.meta.dirname, ".."); +const run = promisify(execFile); + +/** Build a real disposable non-git tracker and link its genuine SDK-created items in memory. */ +async function fixture(t: test.TestContext, remote: AdoWorkItem[] = [moveItem(1)]) { + const root = mkdtempSync(join(tmpdir(), "ado-moves-")); + t.after(() => rmSync(root, { recursive: true, force: true })); + const pmRoot = join(root, ".agents/pm"), pm = new PmClient({ cwd: root, pmRoot, author: "fixture-agent" }); + await pm.run("init", { prefix: "fixture" }); + for (const item of remote) await pm.create({ title: `Public shaped task ${item.id}`, type: "Task" }); + const items = (await pm.listAllComplete()).items.map((item, index) => ({ ...item, ado_id: remote[index]!.id, ado_org_url: "https://dev.azure.com/example", ado_project: "Example" })); + const f = moveService(remote); + const options: MoveOptions = { items, ids: items.map((item) => item.id), areaPath: "Example\\New", iterationPath: "Example\\Release" }; + return { ...f, root, pmRoot, pm, options, preview: (changes: Partial = {}) => simulateMove(f.config, f.request, { ...options, ...changes }) }; +} +/** A whole-preview refusal must remain typed, actionable and secret-free. */ +async function refuses(action: Promise, code: string) { + await assert.rejects(action, (error: unknown) => { + assert.ok(error instanceof MoveRefusal || error instanceof ContractRefusal); + assert.equal(error.code, code); assert.ok(error.remedy.length > 15); + assert.doesNotMatch(`${error.message} ${error.remedy}`, /synthetic-move-token|server-secret/u); + return true; + }); +} +/** Hash authoritative tracker files, excluding the SDK's derived runtime caches. */ +function snapshot(root: string) { + return Object.fromEntries(readdirSync(root, { recursive: true, withFileTypes: true }).filter((entry) => entry.isFile() && !join(entry.parentPath, entry.name).includes(`${join(root, "runtime")}/`)).map((entry) => { + const path = join(entry.parentPath, entry.name); + return [path.slice(root.length), createHash("sha256").update(readFileSync(path)).digest("hex")]; + })); +} + +test("inherited permissions and custom iteration rules produce deterministic independent rows without writes", async (t) => { + const f = await fixture(t, [moveItem(1), moveItem(2, { "System.AreaPath": "Example\\Locked\\Child" }), moveItem(3, { "Custom.Ready": false })]); + f.deniedAreas.add("Example\\Locked"); + const before = JSON.stringify([...f.items]); const tracker = snapshot(f.pmRoot); + const result = await f.preview(); + const ordered = [...f.options.items].sort((a, b) => a.id < b.id ? -1 : 1); + assert.deepEqual(result.rows.map((row) => row.id), ordered.map((item) => item.id)); + assert.deepEqual([...result.rows].sort((a, b) => a.ado_id - b.ado_id).map((row) => [row.decision, row.code]), [["allowed", null], ["refused", "permission_denied"], ["refused", "process_rule"]]); + assert.equal(result.requests, 8); assert.equal(result.ok, false); assert.equal(result.preview, true); + assert.deepEqual(await f.preview({ ids: [...f.options.ids].reverse() }), result); + assert.equal(JSON.stringify([...f.items]), before); assert.deepEqual(snapshot(f.pmRoot), tracker); + assert.ok((await f.preview({ areaPath: "Example\\Locked\\Child" })).rows.every((row) => row.code === "permission_denied")); + assert.equal(typeof built.simulateMove, "function"); assert.deepEqual(built.MOVE_LIMITS, MOVE_LIMITS); + assert.ok(f.calls.every((call) => call.method === "GET" || call.url.includes("workitemsbatch") || call.url.includes("validateOnly=true"))); +}); + +test("relation scope changes preserve links, include allowed/refused endpoints and mark unreadable targets unknown", async (t) => { + const one = moveItem(1), two = moveItem(2, { "Custom.Ready": false }); + const f = await fixture(t, [one, two]); + const link = (id: number) => `${f.config.orgUrl}/_apis/wit/workItems/${id}`; + f.items.get(1)!.relations = [{ rel: "System.LinkTypes.Dependency-Forward", url: link(2) }, { rel: "Custom.Link", url: link(3) }, { rel: "Missing.Link", url: link(4) }, { rel: "AttachedFile", url: "https://example.invalid/secret" }]; + f.items.get(2)!.relations = undefined; + f.items.set(3, moveItem(3)); + const result = await f.preview(); + assert.equal(result.requests, 8); assert.equal(result.relations.length, 4); + const edge = result.relations.find((row) => row.target === 2)!; + assert.deepEqual(edge.before, { area: true, iteration: true }); assert.deepEqual(edge.after, { area: false, iteration: false }); + assert.equal(edge.action, "preserved"); + assert.equal(result.relations.find((row) => row.target === 4)!.after, null); + assert.equal(result.relations.find((row) => row.target === null)!.before, null); + assert.doesNotMatch(JSON.stringify(result), /example.invalid|Public shaped/u); + assert.deepEqual((await f.preview()).relations, result.relations); +}); + +test("both allowed endpoints retain same-scope links; area-only and iteration-only preserve other dimensions", async (t) => { + const f = await fixture(t, [moveItem(1), moveItem(2)]); + f.items.get(1)!.relations = [{ rel: "Parent", url: `${f.config.orgUrl}/_apis/wit/workItems/2` }]; + const together = await f.preview(); + assert.equal(together.ok, true); assert.deepEqual(together.relations[0]!.after, { area: true, iteration: true }); + assert.equal((await f.preview({ iterationPath: undefined })).rows[0]!.after!.iteration, "Example\\Old Sprint"); + assert.equal((await f.preview({ areaPath: undefined, type: "Task" })).rows[0]!.after!.area, "Example\\Old"); +}); + +test("selection and destination errors refuse before the first request", async (t) => { + const f = await fixture(t); + for (const ids of [[], ["absent"], [...f.options.ids, ...f.options.ids], Array.from({ length: 51 }, (_, i) => String(i))]) await refuses(f.preview({ ids }), "selection"); + for (const value of [undefined, "1", 0, -1, 1.5, Number.MAX_SAFE_INTEGER + 1]) await refuses(f.preview({ items: [{ ...f.options.items[0]!, ado_id: value }] }), "selection"); + for (const changes of [{ ado_org_url: undefined }, { ado_org_url: "https://dev.azure.com/other" }, { ado_project: "Other" }]) { + await refuses(f.preview({ items: [{ ...f.options.items[0]!, ...changes }] }), "selection"); + } + const second = { ...f.options.items[0]!, id: "fixture-other" }; + await refuses(f.preview({ items: [...f.options.items, second] }), "selection"); + await refuses(f.preview({ items: [...f.options.items, second], ids: [...f.options.ids, second.id] }), "selection"); + for (const areaPath of ["Other\\Area", "Example\\", "Example\\..", `Example\\${"x".repeat(1025)}`, 7 as unknown as string]) await refuses(f.preview({ areaPath }), "configuration"); + await refuses(f.preview({ areaPath: undefined, iterationPath: undefined }), "configuration"); + assert.equal(f.calls.length, 0); +}); + +test("single field contract prevents disabled/wrong types, wrong projects, missing/read-only/non-tree/enumerated fields", async (t) => { + const f = await fixture(t); + const original = structuredClone(f.items.get(1)!); + for (const field of ["System.TeamProject", "System.WorkItemType"]) { + f.items.get(1)!.fields[field] = "Other"; + assert.equal((await f.preview()).rows[0]!.code, "field_contract"); + f.items.set(1, structuredClone(original)); + } + f.types[0]!.isDisabled = true; assert.equal((await f.preview()).rows[0]!.code, "field_contract"); f.types[0]!.isDisabled = false; + const definition = { ...f.fields[0]! }; + for (const change of [{ readOnly: true }, { type: "string" }]) { + Object.assign(f.fields[0]!, change); assert.equal((await f.preview()).rows[0]!.code, "field_contract"); Object.assign(f.fields[0]!, definition); + } + f.typeFields[0]!.allowedValues = ["Example\\Other"]; assert.equal((await f.preview()).rows[0]!.code, "field_contract"); f.typeFields[0]!.allowedValues = ["Example\\New"]; + assert.equal((await f.preview()).ok, true); + f.typeFields.shift(); assert.equal((await f.preview()).rows[0]!.code, "field_contract"); + assert.ok(f.calls.filter((call) => call.method === "PATCH").length === 1); +}); + +test("missing selected items are explicit rows and remote validation failures are typed with remedies", async (t) => { + const f = await fixture(t); + for (const [status, code] of [[400, "process_rule"], [401, "permission_denied"], [403, "permission_denied"], [404, "not_found"], [409, "revision_changed"], [412, "revision_changed"], [429, "remote_failure"], [500, "remote_failure"], [302, "remote_failure"]] as const) { + f.overrides.set("patch:1", { status, body: "server-secret" }); + const row = (await f.preview()).rows[0]!; assert.equal(row.code, code); assert.equal(row.decision, "refused"); assert.ok(row.remedy.length > 15); + } + f.items.clear(); const row = (await f.preview()).rows[0]!; + assert.equal(row.code, "not_found"); assert.equal(row.rev, null); assert.equal(row.before, null); assert.equal(row.after, null); + assert.equal(new MoveRefusal("revision_changed").exitCode, 4); +}); + +test("malformed batches and validation responses fail closed without response leakage", async (t) => { + const f = await fixture(t); + for (const transform of [ + (rows: AdoWorkItem[]) => [rows[0], rows[0]], + (rows: AdoWorkItem[]) => [{ ...rows[0], id: 999 }], + (rows: AdoWorkItem[]) => [{ ...rows[0], rev: 0 }], + (rows: AdoWorkItem[]) => [{ ...rows[0], rev: 1.5 }], + (rows: AdoWorkItem[]) => [{ ...rows[0], fields: null }], + (rows: AdoWorkItem[]) => [{ ...rows[0], fields: {} }], + (rows: AdoWorkItem[]) => [{ ...rows[0], relations: {} }], + (rows: AdoWorkItem[]) => [{ ...rows[0], relations: [null] }], + (rows: AdoWorkItem[]) => [{ ...rows[0], relations: [{ rel: 1, url: "x" }] }], + (rows: AdoWorkItem[]) => [{ ...rows[0], relations: [{ rel: "Link", url: 1 }] }], + ]) { f.transformBatch(transform); await refuses(f.preview(), "invalid_schema"); } + f.transformBatch((rows) => rows); + for (const body of ["invalid", "null", JSON.stringify(moveItem(2)), JSON.stringify(moveItem(1)), JSON.stringify({ id: 1, fields: null })]) { + f.overrides.set("patch:1", { status: 200, body }); await refuses(f.preview(), "invalid_schema"); + } + f.overrides.set("workitemsbatch", { status: 500, body: "server-secret" }); await refuses(f.preview(), "remote_failure"); + await refuses(simulateMove(f.config, async () => { throw new Error("server-secret"); }, f.options), "remote_failure"); + await refuses(f.preview({ expectedFingerprint: "0".repeat(64) }), "schema_changed"); +}); + +test("maximum explicit backlog has bounded requests; relation fanout refuses without partial results", async (t) => { + // The real SDK created this one seed; bounded in-memory projection avoids fifty unnecessary tracker writes. + const f = await fixture(t); + const items: ItemMetadata[] = Array.from({ length: 50 }, (_, index) => ({ ...f.options.items[0]!, id: `fixture-${String(index).padStart(2, "0")}`, ado_id: index + 1 })); + for (let id = 1; id <= 50; id++) f.items.set(id, moveItem(id)); + f.items.get(1)!.relations = Array.from({ length: 200 }, (_, index) => ({ rel: "Custom.Link", url: `${f.config.orgUrl}/_apis/wit/workItems/${index + 51}` })); + const result = await f.preview({ items, ids: items.map((item) => item.id) }); + assert.equal(result.rows.length, 50); assert.equal(result.requests, 56); assert.equal(result.relations.length, 200); + assert.equal(f.calls.filter((call) => call.method === "PATCH").length, 50); + f.items.get(1)!.relations = [...f.items.get(1)!.relations!, { rel: "Custom.Link", url: "https://example.invalid" }]; + await refuses(f.preview({ items, ids: items.map((item) => item.id) }), "budget_exceeded"); +}); + +/** Install built output into a genuine non-git tracker and run the registered command through the host. */ +async function host(t: test.TestContext) { + const f = await fixture(t); + const server = createServer(async (req, res) => { + const chunks: Buffer[] = []; for await (const chunk of req) chunks.push(Buffer.from(chunk)); + const response = await f.request(req.method!, `${f.config.orgUrl}${req.url}`, chunks.length ? Buffer.concat(chunks).toString() : undefined, + { Authorization: req.headers.authorization!, "Content-Type": req.headers["content-type"]! }); + res.writeHead(response.status, { "Content-Type": "application/json" }); res.end(response.body); + }); + await new Promise((done) => server.listen(0, "127.0.0.1", done)); + t.after(() => new Promise((done) => server.close(() => done()))); + const address = server.address(); assert.ok(address && typeof address !== "string"); + f.config.orgUrl = `http://127.0.0.1:${address.port}`; + const installed = join(f.pmRoot, "extensions/pm-ado"); mkdirSync(installed, { recursive: true }); + cpSync(join(repo, "dist"), join(installed, "dist"), { recursive: true }); cpSync(join(repo, "manifest.json"), join(installed, "manifest.json")); + await f.pm.update(f.options.ids[0]!, { field: ["ado_id=1", `ado_org_url=${f.config.orgUrl}`, "ado_project=Example"] }); + const bin = join(f.root, "bin"); mkdirSync(bin); symlinkSync(process.execPath, join(bin, "node")); + const env = { ...process.env, ADO_ORG_URL: f.config.orgUrl, ADO_TOKEN: f.config.token, PM_AUTHOR: "fixture-agent", PM_NO_UPDATE_CHECK: "1", GIT_CEILING_DIRECTORIES: tmpdir(), PATH: bin }; + const harness = await createExtensionTestHarness(extension, { name: "pm-ado", capabilities: ["commands", "schema", "preflight"] }); + /** Invoke the actual registered handler with real SDK binding and restored process globals. */ + const command = async (options: Record, sdk = true, changes: Record = {}) => { + const previous = process.env, exit = process.exitCode; process.env = { ...env, ...changes }; + try { return (await harness.runCommand({ command: "ado move-preview", pmRoot: sdk ? f.pmRoot : undefined, options })).result as MovePreview & { code: string; exit_code: number }; } + finally { process.env = previous; process.exitCode = exit; } + }; + return { ...f, env, command, cli: (args: string[]) => run(process.execPath, [join(repo, "node_modules/@unbrained/pm-cli/dist/cli.js"), "--pm-path", f.pmRoot, "ado", "move-preview", ...args], { cwd: f.root, env, maxBuffer: 8 * 1024 * 1024 }) }; +} + +test("installed no-git CLI and SDK command render compact JSON/TOON and preserve authoritative bytes", async (t) => { + const f = await host(t); const before = snapshot(f.pmRoot); + const options = { project: "Example", items: f.options.ids.join(","), areaPath: "Example\\New" }; + assert.equal((await f.command(options)).ok, true); + const args = ["--project", "Example", "--items", options.items, "--area-path", "Example\\New"]; + const json = await f.cli([...args, "--json"]); const result = JSON.parse(json.stdout) as MovePreview; + assert.equal(result.rows[0]!.decision, "allowed"); assert.equal(result.requests, 6); + const toon = await f.cli([...args, "--output-format", "toon"]); assert.match(toon.stdout, /preview: true/u); + assert.ok(Buffer.byteLength(json.stdout) < 2000); assert.ok(Buffer.byteLength(toon.stdout) < 2000); + assert.deepEqual(snapshot(f.pmRoot), before); + assert.ok(f.calls.every((call) => call.method !== "PATCH" || call.url.includes("validateOnly=true"))); + await assert.rejects(f.cli([...args, "--apply"]), /Unknown option/u); +}); + +test("host refuses malformed options, missing binding/credentials, schema drift and failed SDK reads", async (t) => { + const f = await host(t), options = { project: "Example", items: f.options.ids.join(","), "iteration-path": "Example\\Release" }; + for (const changes of [{ project: undefined }, { items: undefined }, { items: 1 }, { type: " " }, { "expect-fingerprint": true }]) assert.equal((await f.command({ ...options, ...changes })).code, "configuration"); + assert.equal((await f.command(options, false)).code, "configuration"); + for (const changes of [{ ADO_ORG_URL: undefined }, { ADO_TOKEN: " " }]) assert.equal((await f.command(options, true, changes)).code, "configuration"); + assert.equal((await f.command({ ...options, "expect-fingerprint": "0".repeat(64) })).exit_code, 4); + f.overrides.set("workitemsbatch", { status: 500, body: "server-secret" }); assert.equal((await f.command(options)).code, "remote_failure"); + f.overrides.clear(); assert.equal((await f.command(options)).ok, true); + const file = readdirSync(f.pmRoot, { recursive: true, encoding: "utf8" }).find((path) => path.endsWith(`/${f.options.ids[0]}.toon`)); + assert.ok(file); + // A genuine tracker read failure, not a mocked client, exercises sanitized fallback. + writeFileSync(join(f.pmRoot, file), "invalid [tracker data"); + assert.equal((await f.command(options)).code, "remote_failure"); +}); + + +test("adversarial duplicate type metadata cannot exceed the total request budget", async (t) => { + const f = await fixture(t); + for (let index = 0; index < 60; index++) f.types.push({ ...f.types[0]!, referenceName: `Custom.Task${index}` }); + await refuses(f.preview(), "remote_failure"); + assert.equal(f.calls.length, MOVE_LIMITS.requests); + assert.ok(f.calls.every((call) => call.method === "GET")); +}); diff --git a/test/real-data-moves.ts b/test/real-data-moves.ts new file mode 100644 index 0000000..4b694fa --- /dev/null +++ b/test/real-data-moves.ts @@ -0,0 +1,67 @@ +/** Reproduce public-tracker measurements on an exported, non-git copy without pm mutations. */ +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { readFileSync, readdirSync } from "node:fs"; +import { join } from "node:path"; +import { PmClient } from "@unbrained/pm-cli/sdk"; +import { MoveRefusal, RELATION_MAP, simulateMove } from "../index.ts"; +import { moveItem, moveService } from "./fixtures/move-service.ts"; + +const root = process.argv[2]!; +const pmRoot = join(root, ".agents/pm"); +/** Digest authoritative files; derived runtime caches are excluded. */ +function digest() { + return Object.fromEntries(readdirSync(pmRoot, { recursive: true, withFileTypes: true }).filter((entry) => entry.isFile() && !join(entry.parentPath, entry.name).includes(`${join(pmRoot, "runtime")}/`)).map((entry) => { + const path = join(entry.parentPath, entry.name); + return [path.slice(pmRoot.length), createHash("sha256").update(readFileSync(path)).digest("hex")]; + })); +} +const before = digest(); +const pm = new PmClient({ cwd: root, pmRoot, author: "fixture-agent" }); +const snapshot = await pm.listAllComplete(); +const original = [...snapshot.items].sort((a, b) => a.id < b.id ? -1 : Number(a.id > b.id)); +assert.ok(original.length > 0 && original.length <= 50); +const service = moveService(original.map((item, index) => moveItem(index + 1, { + "System.AreaPath": index % 5 === 0 ? "Example\\Locked\\Child" : "Example\\Old", + "Custom.Ready": item.status !== "closed", +}))); +service.deniedAreas.add("Example\\Locked"); +// Public fleet data has no Azure provenance. The untouched selection must refuse without network access. +let rawRefusal = ""; +try { + await simulateMove(service.config, service.request, { items: original, ids: original.map((item) => item.id), iterationPath: "Example\\Release" }); +} catch (error) { assert.ok(error instanceof MoveRefusal); rawRefusal = error.code; } +assert.equal(rawRefusal, "selection"); assert.equal(service.calls.length, 0); +// Project the real public identities, lifecycle states and direct relations into a synthetic Azure project. +// These links exist only in memory and do not claim live Azure acceptance. +const projected = original.map((item, index) => ({ ...item, ado_id: index + 1, ado_org_url: service.config.orgUrl, ado_project: service.config.project })); +const byId = new Map(projected.map((item) => [item.id, item.ado_id])); +for (const item of projected) { + const dependencies = [...(item.dependencies ?? [])]; + if (item.parent) dependencies.push({ id: item.parent, kind: "parent" }); + service.items.get(item.ado_id)!.relations = dependencies.flatMap((dep) => { + const target = byId.get(dep.id), rel = Object.entries(RELATION_MAP).find(([, kind]) => kind === dep.kind)?.[0]; + return target && rel ? [{ rel, url: `${service.config.orgUrl}/_apis/wit/workItems/${target}` }] : []; + }); +} +const remoteBefore = JSON.stringify([...service.items]); +const options = { items: projected, ids: projected.map((item) => item.id), areaPath: "Example\\Delivery", iterationPath: "Example\\Release" }; +const start = performance.now(); +const result = await simulateMove(service.config, service.request, options); +const elapsed = Math.round(performance.now() - start); +assert.deepEqual(await simulateMove(service.config, service.request, { ...options, ids: [...options.ids].reverse() }), result); +assert.equal(JSON.stringify([...service.items]), remoteBefore); +assert.deepEqual(digest(), before); +console.log(JSON.stringify({ + source: "unbraind/pm-ado", source_head: process.argv[3], source_items: original.length, + authoritative_files: Object.keys(before).length, authoritative_files_changed: 0, + unlinked_refusal: rawRefusal, unlinked_requests: 0, + projected_items: result.rows.length, allowed: result.rows.filter((row) => row.decision === "allowed").length, + inherited_denials: result.rows.filter((row) => row.code === "permission_denied").length, + iteration_rule_refusals: result.rows.filter((row) => row.code === "process_rule").length, + direct_relations: result.relations.length, + relation_boundaries_changed: result.relations.filter((edge) => JSON.stringify(edge.before) !== JSON.stringify(edge.after)).length, + requests_per_preview: result.requests, deterministic_replay: true, + remote_items_changed: 0, elapsed_ms: elapsed, json_bytes: Buffer.byteLength(JSON.stringify(result)), + live_azure: false, +}, null, 2));