@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.46 → 0.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/bin/adl +1 -1
  2. package/bin/reconcile +7 -2
  3. package/package.json +1 -1
  4. package/packages/agent-hooks/src/rules/impl/git-branch.ts +1 -1
  5. package/packages/agent-skills/assets/write-feature/SKILL.md +13 -15
  6. package/bin/lean-ctx-observe-strip +0 -434
  7. package/bin/lib/lean-ctx-observe-hooks.sh +0 -634
  8. package/bin/update-azure-agent-pool +0 -29
  9. package/packages/agent-hooks/src/hooks/lean-ctx/handler.ts +0 -22
  10. package/packages/agent-hooks/src/hooks/lean-ctx/index.ts +0 -173
  11. package/packages/agent-hooks/src/hooks/lean-ctx/mapping.ts +0 -121
  12. package/packages/agent-hooks/src/hooks/lean-ctx/scope-rewrite.ts +0 -207
  13. package/packages/agent-hooks/src/lean-ctx/env.ts +0 -123
  14. package/packages/agent-hooks/src/lean-ctx/mcp.ts +0 -142
  15. package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +0 -51
  16. package/packages/agent-hooks/src/rules/impl/adl-session-required.ts +0 -403
  17. package/packages/agent-hooks/src/rules/impl/tool-lean-ctx-global.ts +0 -594
  18. package/packages/agent-settings/assets/GLOBAL-AGENTS.md +0 -112
  19. package/packages/agent-settings/assets/lean-ctx/config.toml +0 -42
  20. package/packages/agent-settings/assets/lean-ctx/gitignore +0 -10
  21. package/packages/agent-settings/assets/lean-ctx/layout.toml +0 -7
  22. package/packages/agent-settings/src/deploy/lean-ctx-deploy.ts +0 -230
  23. package/packages/agent-settings/src/deploy/lean-ctx-merge.ts +0 -580
  24. package/packages/agent-skills/assets/adl-mechanics/SKILL.md +0 -38
  25. package/packages/agent-skills/assets/codebase-design/SKILL.md +0 -98
  26. package/packages/agent-skills/assets/codebase-design/references/DEEPENING.md +0 -37
  27. package/packages/agent-skills/assets/codebase-design/references/DESIGN-IT-TWICE.md +0 -44
  28. package/packages/agent-skills/assets/codebase-design/references/TESTABILITY.md +0 -29
  29. package/packages/agent-skills/assets/debug-issue/SKILL.md +0 -41
  30. package/packages/agent-skills/assets/domain-modeling/SKILL.md +0 -86
  31. package/packages/agent-skills/assets/domain-modeling/references/ADR-FORMAT.md +0 -47
  32. package/packages/agent-skills/assets/domain-modeling/references/CONTEXT-FORMAT.md +0 -60
  33. package/packages/agent-skills/assets/implement/SKILL.md +0 -28
  34. package/packages/agent-skills/assets/review-changes/SKILL.md +0 -45
  35. package/packages/agent-skills/assets/tdd/SKILL.md +0 -49
  36. package/packages/agent-skills/assets/tdd/references/mocking.md +0 -59
  37. package/packages/agent-skills/assets/tdd/references/tests.md +0 -77
  38. package/packages/agent-skills/assets/testing/SKILL.md +0 -54
  39. package/packages/agent-skills/assets/testing/references/e2e.md +0 -37
  40. package/packages/agent-skills/assets/testing/references/integration.md +0 -37
  41. package/packages/agent-skills/assets/testing/references/unit.md +0 -32
  42. package/packages/agent-skills/assets/to-feature/SKILL.md +0 -91
  43. package/packages/agent-skills/assets/to-feature/references/FEATURE-SPEC-TEMPLATE.md +0 -88
  44. package/packages/agent-skills/assets/to-workitems/SKILL.md +0 -90
  45. package/packages/agent-skills/assets/to-workitems/references/AZURE-DEVOPS-HIERARCHY.md +0 -121
  46. package/packages/agent-skills/assets/to-workitems/references/TICKET-TEMPLATES.md +0 -70
  47. package/packages/azdo/src/workflow-rules-matrix.csv +0 -85
  48. package/packages/fleet/src/launch-agents.ts +0 -649
  49. package/packages/repo-controls/assets/GLOBAL-INVARIANTS.md +0 -21
  50. package/packages/repo-controls/assets/enable-integration-auto-complete.mjs +0 -79
  51. package/packages/repo-controls/assets/scaffold/docs/notes.md +0 -20
  52. package/packages/repo-controls/assets/scaffold/plans/GAPS-AND-FINDINGS.md +0 -12
  53. package/packages/repo-controls/azure-pipelines.yml +0 -274
  54. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +0 -1
  55. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/excluded/frontend/mobile/src/i18n/locales/zh-CN/strings.ts +0 -1
  56. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +0 -17
  57. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +0 -13
  58. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-delivery.md +0 -10
  59. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-recommendation.md +0 -12
  60. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/target-narration.md +0 -10
  61. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/frontend/packages/desktop/src/renderer/solo/item.ts +0 -1
  62. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/a.ts +0 -1
  63. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/b.ts +0 -1
  64. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/fresh/fresh.ts +0 -1
  65. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub1/only.ts +0 -1
  66. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub10/only.ts +0 -1
  67. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub11/only.ts +0 -1
  68. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub2/only.ts +0 -1
  69. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub3/only.ts +0 -1
  70. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub4/only.ts +0 -1
  71. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub5/only.ts +0 -1
  72. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub6/only.ts +0 -1
  73. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub7/only.ts +0 -1
  74. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub8/only.ts +0 -1
  75. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub9/only.ts +0 -1
  76. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/services/i18n/locales/de/common.json +0 -1
  77. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/solo/item.ts +0 -1
  78. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/vendored-crate/Cargo.toml +0 -2
  79. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/frontend/packages/desktop/src/renderer/solo/item.ts +0 -1
  80. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/a.ts +0 -1
  81. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/b.ts +0 -1
  82. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/c.ts +0 -1
  83. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/frontend/packages/desktop/src/renderer/solo/item.ts +0 -1
  84. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/fresh/fresh.ts +0 -1
  85. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub1/only.ts +0 -1
  86. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub10/only.ts +0 -1
  87. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub11/only.ts +0 -1
  88. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub2/only.ts +0 -1
  89. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub3/only.ts +0 -1
  90. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub4/only.ts +0 -1
  91. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub5/only.ts +0 -1
  92. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub6/only.ts +0 -1
  93. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub7/only.ts +0 -1
  94. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub8/only.ts +0 -1
  95. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub9/only.ts +0 -1
  96. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/solo/item.ts +0 -1
  97. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/frontend/packages/desktop/src/renderer/solo/item.ts +0 -1
  98. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/fixtures/open-work-cap-clean/plans/GAPS-AND-FINDINGS.md +0 -5
  99. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/fixtures/open-work-cap-clean/plans/features/az601-clean/spec.md +0 -10
  100. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/agent/crates/enact-providers/src/snapshots/README.md +0 -1
  101. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-app/assets/builtin-assistants/avatars/assistant.jpg +0 -1
  102. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-assets/assets/logos/tools/coding/tool.png +0 -1
  103. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-session/src/backend/codex_init_prompt.md +0 -1
  104. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/mobile/assets/images/icon.png +0 -1
  105. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/packages/desktop/src/renderer/assets/logos/brand/app.png +0 -1
  106. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/packages/desktop/src/renderer/assets/themes/default-theme.png +0 -1
  107. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/public/pwa/icon-192.png +0 -1
  108. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/resources/product.png +0 -1
  109. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-stray/backend/crates/enact-session/src/backend/README.md +0 -1
  110. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/features/az347-test-coverage/spec.md +0 -12
  111. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-violation/plans/features/az347-test-coverage/spec.md +0 -12
  112. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/__init__.py +0 -11
  113. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/check.py +0 -62
  114. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/NotAMigration.sql +0 -1
  115. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/0001_long_prefix.sql +0 -1
  116. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/001_init.sql +0 -1
  117. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/002_add_index.sql +0 -1
  118. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/003-dashed-slug.sql +0 -1
  119. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/004_MixedCase.sql +0 -1
  120. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/005_trailing space.sql +0 -1
  121. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/01_short_prefix.sql +0 -1
  122. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/not-a-migration.sql +0 -1
  123. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/test_check.py +0 -116
  124. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/architecture/product/links.md +0 -20
  125. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/architecture/product/route-target.md +0 -8
  126. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/architecture/product/links.md +0 -20
  127. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/architecture/product/route-target.md +0 -8
  128. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.changeset/declared.txt +0 -1
  129. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/INDEPENDENT-VERIFICATION.md +0 -3
  130. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/.gitattributes +0 -1
  131. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/large file.bin +0 -3
  132. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/.gitattributes +0 -1
  133. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/large file.bin +0 -3
  134. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/small.txt +0 -1
  135. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/missing-filter/large file.bin +0 -0
  136. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/.gitattributes +0 -1
  137. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/payload.dat +0 -0
  138. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/__init__.py +0 -1
  139. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/__init__.py +0 -12
  140. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/check.py +0 -129
  141. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/disjoint/gate-registry.yaml +0 -13
  142. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/empty/gate-registry.yaml +0 -7
  143. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/overlapping/gate-registry.yaml +0 -13
  144. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/test_check.py +0 -109
  145. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/__init__.py +0 -1
  146. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/__init__.py +0 -11
  147. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/check.py +0 -149
  148. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/clean/docs/readme.md +0 -4
  149. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/relevant/VERSION +0 -1
  150. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/test_check.py +0 -151
  151. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/__init__.py +0 -11
  152. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/check.py +0 -202
  153. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/changesets/package.json +0 -5
  154. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/package.json +0 -5
  155. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/CHANGELOG.md +0 -5
  156. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/VERSION +0 -1
  157. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/changesets/package.json +0 -5
  158. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/package.json +0 -5
  159. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/CHANGELOG.md +0 -5
  160. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/VERSION +0 -1
  161. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/test_check.py +0 -162
  162. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/check.py +0 -103
  163. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.lock +0 -7
  164. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.toml +0 -4
  165. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/rust-toolchain.toml +0 -3
  166. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/src/main.rs +0 -1
  167. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/frontend/bun.lock +0 -1
  168. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.lock +0 -7
  169. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.toml +0 -4
  170. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/rust-toolchain.toml +0 -3
  171. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/src/main.rs +0 -1
  172. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/frontend/bun.lock +0 -0
  173. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/grants-registry.yaml +0 -112
  174. package/packages/repo-controls/workflows/scripts/release/verify-npm-artifact.ts +0 -119
@@ -1,77 +0,0 @@
1
- # Good and Bad Tests
2
-
3
- ## Good Tests
4
-
5
- **Integration-style**: Test through real interfaces, not mocks of internal parts.
6
-
7
- ```typescript
8
- // GOOD: Tests observable behavior
9
- test("user can checkout with valid cart", async () => {
10
- const cart = createCart();
11
- cart.add(product);
12
- const result = await checkout(cart, paymentMethod);
13
- expect(result.status).toBe("confirmed");
14
- });
15
- ```
16
-
17
- Characteristics:
18
-
19
- - Tests behavior users/callers care about
20
- - Uses public API only
21
- - Survives internal refactors
22
- - Describes WHAT, not HOW
23
- - One logical assertion per test
24
-
25
- ## Bad Tests
26
-
27
- **Implementation-detail tests**: Coupled to internal structure.
28
-
29
- ```typescript
30
- // BAD: Tests implementation details
31
- test("checkout calls paymentService.process", async () => {
32
- const mockPayment = jest.mock(paymentService);
33
- await checkout(cart, payment);
34
- expect(mockPayment.process).toHaveBeenCalledWith(cart.total);
35
- });
36
- ```
37
-
38
- Red flags:
39
-
40
- - Mocking internal collaborators
41
- - Testing private methods
42
- - Asserting on call counts/order
43
- - Test breaks when refactoring without behavior change
44
- - Test name describes HOW not WHAT
45
- - Verifying through external means instead of interface
46
-
47
- ```typescript
48
- // BAD: Bypasses interface to verify
49
- test("createUser saves to database", async () => {
50
- await createUser({ name: "Alice" });
51
- const row = await db.query("SELECT * FROM users WHERE name = ?", ["Alice"]);
52
- expect(row).toBeDefined();
53
- });
54
-
55
- // GOOD: Verifies through interface
56
- test("createUser makes user retrievable", async () => {
57
- const user = await createUser({ name: "Alice" });
58
- const retrieved = await getUser(user.id);
59
- expect(retrieved.name).toBe("Alice");
60
- });
61
- ```
62
-
63
- **Tautological tests**: Expected value restates the implementation, so the test passes by construction.
64
-
65
- ```typescript
66
- // BAD: Expected value is recomputed the way the code computes it
67
- test("calculateTotal sums line items", () => {
68
- const items = [{ price: 10 }, { price: 5 }];
69
- const expected = items.reduce((sum, i) => sum + i.price, 0);
70
- expect(calculateTotal(items)).toBe(expected);
71
- });
72
-
73
- // GOOD: Expected value is an independent, known literal
74
- test("calculateTotal sums line items", () => {
75
- expect(calculateTotal([{ price: 10 }, { price: 5 }])).toBe(15);
76
- });
77
- ```
@@ -1,54 +0,0 @@
1
- ---
2
- name: testing
3
- description: Select and prove unit, regression, or cross-service tests for a change.
4
- disable-model-invocation: false
5
- ---
6
-
7
- # Testing
8
-
9
- ## Purpose
10
-
11
- Select the smallest test mode that proves the change, preserve a red-green regression trail for bug fixes, and run cross-service behavior through the project's CI-parity environment.
12
-
13
- ## Use When
14
-
15
- - A change needs test coverage or a bug needs a regression proof.
16
- - Runtime, provider, database, broker, streaming, or end-to-end behavior is involved.
17
-
18
- ## Do Not Use When
19
-
20
- - Behavior is still unknown; resolve the specification first.
21
- - The request is solely an external pre-landing review rather than test selection or proof.
22
-
23
- ## Workflow
24
-
25
- 1. Choose Mode 0 for isolated logic, Mode 1 for a bug-fix red-green cycle, and Mode 2 for cross-service or live behavior.
26
- 2. For Mode 1, run the smallest failing regression test, implement the minimum change, rerun it, then refactor only while green.
27
- 3. For Mode 2, run through the project's CI-parity entrypoint — `just check` in Adl repositories. Isolated containers are advisable in general and **mandatory** where a test crosses a service boundary or needs real runtime (provider, database, broker, streaming); pure/isolated logic may run in-window. Live or billable calls require an explicit project opt-in and must skip cleanly without credentials.
28
- 4. Record the selected command, environment, and evidence in the current task artifact. A runtime bug requires a Mode-2 regression scenario.
29
-
30
- ## Output
31
-
32
- Return the selected mode, changed test or scenario, red/green evidence where required, command output, and environment actually used.
33
-
34
- ## State Contract
35
-
36
- Project repositories own harness paths, service names, credentials, URLs, and opt-in flags. Keep secrets out of fixtures and source; pass them only through environment variables.
37
-
38
- ## Boundaries
39
-
40
- ### In scope
41
-
42
- Mode selection, regression design, red-green-refactor, harness scenarios, and CI-parity evidence.
43
-
44
- ### Out of scope
45
-
46
- Inventing unspecified behavior, reviewing code quality, or cleaning unrelated implementation residue.
47
-
48
- ### Fog of war
49
-
50
- If behavior cannot be stated precisely, stop before writing a guessed test. If the isolation requirement is unclear, use the stricter Mode-2 path and record the uncertainty.
51
-
52
- ## Completion
53
-
54
- Run the selected project test command in its required environment; `grep -q '^PASS:' <validator-output>` exits 0 for every harness scenario.
@@ -1,37 +0,0 @@
1
- # End-to-end testing
2
-
3
- ## Purpose
4
-
5
- End-to-end tests prove a complete business outcome from initiation to an
6
- observable completion across the integrated system. They validate outcomes and
7
- orchestration: UI state, sequencing, multi-system coordination, and the user
8
- journey. They do not provide exhaustive contract or error-path coverage for
9
- each boundary.
10
-
11
- ## Use it for
12
-
13
- - Critical user journeys such as onboarding, checkout, order-to-cash, or
14
- recovery flows.
15
- - Business workflows that span app UI, backend services, persistence, and
16
- permitted external integrations.
17
- - Production-like load or timing scenarios where the complete workflow is the
18
- thing being evaluated.
19
-
20
- Keep E2E scenarios few and outcome-oriented. Put contract variants, malformed
21
- data, retries, and service-boundary failures in integration tests unless the
22
- workflow itself changes their user-visible outcome.
23
-
24
- ## Canonical location
25
-
26
- This repository has one cross-workspace E2E location: `tests/e2e/`.
27
- App workflows and package-contributed behaviour meet there; do not create
28
- `apps/<app>/tests/e2e/` or `packages/<package>/tests/e2e/`. App and package
29
- fixtures remain with their owning test trees unless they are shared fixtures
30
- owned by the E2E workspace.
31
-
32
- ## Evidence
33
-
34
- Run the whole journey through its real runtime in the CI-parity environment,
35
- using production-like data and isolated dependencies. Assert the user-visible
36
- completion and the durable business result. External live or billable calls
37
- need explicit opt-in; without it, do not silently substitute a fake path.
@@ -1,37 +0,0 @@
1
- # Integration testing
2
-
3
- ## Purpose
4
-
5
- Integration tests prove that two or more components communicate correctly at a
6
- real boundary. They validate connections: contracts, transformations,
7
- authentication, persistence, messages, retries, timeouts, and error handling.
8
- They do not replace a complete user or business workflow test.
9
-
10
- ## Use it for
11
-
12
- - Service-to-service APIs, database adapters, queues, files, and external
13
- provider boundaries.
14
- - Contract fields, response and error shapes, and data transformation edge
15
- cases.
16
- - Failure modes that happy-path journeys rarely exercise: expired credentials,
17
- timeouts, retries, duplicate delivery, and transaction coordination.
18
-
19
- Keep unrelated dependencies out of the scenario. A browser-driven checkout is
20
- not an integration test merely because it crosses an API; test the specific
21
- checkout-to-payment boundary directly when that contract is the subject.
22
-
23
- ## Canonical location
24
-
25
- Place app-owned integration tests in `apps/<app>/tests/integration/` and
26
- package-owned integration tests in `packages/<package>/tests/integration/`.
27
- Use containerized or otherwise isolated real dependencies whenever the scenario
28
- crosses a service, database, broker, streaming, or provider boundary. Do not
29
- put integration scenarios in `tests/e2e/`; that workspace is reserved for
30
- complete workflows.
31
-
32
- ## Evidence
33
-
34
- Exercise the real interface with controlled data and assert both the boundary
35
- response and the observable transformed result. Run through the repository's
36
- CI-parity entrypoint; live or billable services require an explicit opt-in and
37
- must fail loudly or skip cleanly when credentials are absent.
@@ -1,32 +0,0 @@
1
- # Unit testing
2
-
3
- ## Purpose
4
-
5
- Unit tests prove one component's behaviour in isolation. They validate local
6
- logic and deterministic error handling; they do not prove an interface between
7
- independently deployed components or a user workflow.
8
-
9
- ## Use it for
10
-
11
- - Pure transformations, validation, policy, parsing, and state transitions.
12
- - A component's behaviour at its public API with collaborators replaced only
13
- when their real behaviour is outside the unit's responsibility.
14
- - Boundary values and error paths local to the component.
15
-
16
- Do not use a unit test as evidence that a request, query, message, file, or
17
- third-party contract works. That evidence belongs to an integration test.
18
-
19
- ## Canonical location
20
-
21
- Place app-owned unit tests in `apps/<app>/tests/`. Place package-owned unit
22
- tests in `packages/<package>/tests/unit/`. Keep fixtures beside the owning
23
- test tree; do not put a package's unit test in an app or in `tests/e2e/`.
24
-
25
- Existing flat package test folders are not a reason to move unrelated tests;
26
- new unit tests use `tests/unit/` when introducing a new package test area.
27
-
28
- ## Evidence
29
-
30
- Run the narrowest owner-level test command first. The test must have an
31
- independent expected result and fail when the component's promised behaviour
32
- is removed or changed.
@@ -1,91 +0,0 @@
1
- ---
2
- name: to-feature
3
- description: Turn the current conversation into a feature spec and open it as a Feature work item on Azure DevOps, parented to the plan's Epic — no interview, just synthesis of what you have already discussed.
4
- disable-model-invocation: true
5
- ---
6
-
7
- # To Feature
8
-
9
- Open a **Feature** on the board and give it a plan folder to live in.
10
-
11
- **A plan is a Feature, and a Feature is a directory** — `plans/features/az<id>-<slug>/spec.md`, named for the work item it is. This skill creates that Feature and that directory; `to-workitems` later fills its `items/` with PBIs and Bugs parented under it. Where the repo carries a `plans/AGENTS.md`, it governs; otherwise follow `## Plans and work items` in the repository's `CONTRIBUTING.md`.
12
-
13
- Do NOT interview the user — synthesize what you already know from the conversation and the codebase.
14
-
15
- ## Use When
16
-
17
- - The current conversation, plus codebase exploration, already gives you enough to synthesize a feature spec, and the Epic it belongs under is known.
18
-
19
- ## Do Not Use When
20
-
21
- - The user's intent is still unclear and needs an interview or clarifying questions first — this skill explicitly skips that; gather requirements before invoking it.
22
- - The way to the destination is not visible yet — chart the effort with `wayfinder` instead, and come back when the decisions are resolved.
23
- - `epic:` is unset. **Stop and ask.** `epic:` is authored, never tool-created, and the server refuses `Epic` as a creatable type outright — so a typo must fail here rather than hang the plan off the wrong portfolio branch.
24
-
25
- ## Process
26
-
27
- ### 1. Explore the repo
28
-
29
- Understand the current state of the codebase, if you haven't already. Use the project's domain glossary vocabulary throughout the spec, and respect any ADRs in the area you're touching.
30
-
31
- ### 2. Sketch the seams
32
-
33
- Sketch out the seams at which you're going to test the feature. Existing seams should be preferred to new ones. Use the highest seam possible. If new seams are needed, propose them at the highest point you can. The fewer seams across the codebase, the better — the ideal number is one.
34
-
35
- Check with the user that these seams match their expectations.
36
-
37
- ### 3. Have the human confirm the Epic
38
-
39
- **Stop here and ask.** Show the user the id in `epic:` and the title of the Feature you are about to create under it, and get an explicit confirmation before going on.
40
-
41
- This is a human step because **no agent-side check can establish which Epic is the right one — only that the parent named is an Epic at all.** Agents have no access to Epics: fetching one by id is refused, so there is no tool call that reads `epic:` back and confirms it names the Epic you intend. Do not go looking for one, and do not treat a successful create as agreement on identity — it proves the type, never the choice.
42
-
43
- Be careful with that refusal if you meet it — it reports only that the id is not a tracked type, which is equally true of a Task and of an id you cannot see. It does **not** say "this is an Epic", and reading it that way turns one observation into a proof it cannot carry.
44
-
45
- The access is asymmetric, and step 5 depends on the half that works: you cannot **read** an Epic, but you can **write** a parent link to one. The server checks that write's parent **type** — a PBI or Bug aimed at the wrong level is refused before the request is sent, and a Feature is no longer the exception: `workitem_create_or_update` refuses a wrong-typed parent by name, on create and on update alike (`Feature must be parented to a Epic; work item <id> is a <type>`). What that check cannot do is tell you whether `<id>` is the **right** Epic, only that it is *an* Epic — a Feature parented to the wrong Epic still creates cleanly, no error, silently on the wrong branch of the portfolio. The confirmation you get here is the only thing standing between you and that.
46
-
47
- `epic:` is **authored, never tool-created**. If it is unset, that is a stop — ask for it. Never create an Epic to fill the gap; the server refuses `Epic` as a creatable type outright, and a typo must fail loudly rather than quietly spawn a duplicate.
48
-
49
- ### 4. Draft the spec, but do not write it yet
50
-
51
- Draft the spec against the template in [references/FEATURE-SPEC-TEMPLATE.md](references/FEATURE-SPEC-TEMPLATE.md). Hold it in the conversation — it has no folder to live in yet, because it has no id yet.
52
-
53
- **The id is the identity: allocate the work item first, then name the file.** A Feature is never written to disk under a placeholder and renamed afterwards. This skill allocates the id itself one step from now, so a placeholder would exist only for the length of a single tool call and buy nothing — it would be a second name for the same thing, and the rename is a step that can fail and leave the folder lying.
54
-
55
- ### 5. Create the Feature
56
-
57
- ```
58
- workitem_create_or_update({
59
- type: 'Feature',
60
- title: <the outcome, as it reads on the board>,
61
- description: <the spec's ## Problem and ## Solution>,
62
- acceptanceCriteria: <the spec's ## Acceptance criteria, verbatim>,
63
- parentId: <the epic>,
64
- })
65
- ```
66
-
67
- `description` and `acceptanceCriteria` are both advertised arguments — the plan's prose **is** those two fields, so send them on the create call rather than leaving the board holding a title and a parent. If the file and the field differ, the board is lying. `assignedTo`, `priority`, `startDate` and `targetDate` map the same way from the template's frontmatter when the plan sets them.
68
-
69
- `parentId` is **always** the Epic — the one adjacent level a Feature may hang from. Omitting it is refused as `requires parentId`, whatever the type; there is no root case to fall back on.
70
-
71
- **Set no state and no gate flags.** A Feature carries neither: the six Build flags apply only to Product Backlog Item and Bug, and a Feature's custom fields are empty. Do not carry a `fields: {...}` idiom across from a skill that works on PBIs — that raw-fields escape hatch reaches `System.State` without the dedicated `state` argument the gate matrix reads, which is the trap it exists to close. A new Feature lands in Azure DevOps's own default state, `New`, and moving it is a later, separate pass.
72
-
73
- ### 6. Record the id, then verify the link landed
74
-
75
- Create `plans/features/az<id>-<slug>/` — named with the id the create call just returned, which is the only name it ever has — and write the drafted spec into its `spec.md` with `work_item:` set to that id and `epic:` carried through. Do this **immediately**, before anything else: a crash then leaves a folder that says what exists on the board, rather than a Feature nobody can trace back to a plan.
76
-
77
- Leave `items/` uncreated. A Feature whose items do not exist yet is the normal resting state of a fresh plan, not an unfinished one.
78
-
79
- Then read the Feature back and confirm `links.parent` is the `epic:` id:
80
-
81
- ```
82
- workitem_list_or_get({ id: <the new feature>, raw: true })
83
- ```
84
-
85
- `raw: true` is necessary rather than stylistic — the grouped view does not carry `System.WorkItemType` verbatim. This reads the **Feature**, never the Epic, so it stays inside what an agent can see.
86
-
87
- Be exact about what it proves: that the link landed on the id the human confirmed. The create having succeeded already proved that id is an Epic — a wrong type would have failed loudly at step 5 with `Feature must be parented to a Epic; work item <id> is a <type>`, before this read ever ran. What no agent-side check proves, here or at step 5, is that it is the **right** Epic. If `links.parent` is anything other than the `epic:` id, say so plainly rather than moving on; the plan is already on the board by then, and a wrong parent is worth raising immediately.
88
-
89
- ### 7. Stop
90
-
91
- Slicing the feature into items is `to-workitems`' job, and it wants item files that do not exist yet. Tell the user the Feature is open and what its id is; do not start creating children in this run.
@@ -1,88 +0,0 @@
1
- # The plan document
2
-
3
- `plans/features/az<id>-<slug>/spec.md`. **This file IS the Feature** — the long form of its work
4
- item, not a parallel copy. `## Problem` and `## Solution` are its Description; `## Acceptance
5
- criteria` is its Acceptance Criteria field. If the two ever differ, the board is lying.
6
-
7
- Where the repo carries `plans/templates/feature.md`, that file is the source and this one is
8
- only its shape — author from the repo's copy.
9
-
10
- ```markdown
11
- ---
12
- type: Feature
13
- title: "[the outcome, as it reads on the board]"
14
- description: "[one line — becomes System.Description]"
15
- status: draft
16
- created: YYYY-MM-DD
17
- epic: <id>
18
- work_item: <id>
19
- assigned_to: <email>
20
- priority: 2
21
- start_date: YYYY-MM-DD
22
- target_date: YYYY-MM-DD
23
- ---
24
-
25
- # [the outcome]
26
-
27
- ## Problem
28
-
29
- What is wrong today, and what it costs. Evidence, not assertion — the command whose output
30
- shows it, the file and line, the number.
31
-
32
- ## Solution
33
-
34
- The shape of the fix, from the outside in. What changes for whoever uses this. Not a
35
- layer-by-layer implementation list — that is the items' job.
36
-
37
- ## Acceptance criteria
38
-
39
- Checkable statements. This is the same text as the work item's Acceptance Criteria field.
40
-
41
- - [ ] [something a reviewer can confirm without reading the diff]
42
-
43
- ## Scope
44
-
45
- In: [paths or systems]
46
-
47
- Non-goals: [what a reader would wrongly assume is included]
48
-
49
- ## Decisions
50
-
51
- - [decision, and what it rules out]
52
-
53
- ## Items
54
-
55
- Order and dependencies. Each row is the complete source for an item that does not have a file
56
- until `to-workitems` allocates its id.
57
-
58
- | # | Title | Item type | Delivers | Verification | Work item | Predecessor |
59
- | --- | --- | --- | --- | --- | --- | --- |
60
- | 1 | [the outcome this slice delivers] | pbi | [the complete vertical slice] | [a falsifiable check] | | — |
61
-
62
- ## Verification
63
-
64
- The end-to-end check on the acceptance criteria above. Each item carries its own check — this
65
- is the one that only means anything once they have all landed.
66
-
67
- ## Done when
68
-
69
- - [ ] Every item is Done on the board.
70
- - [ ] Acceptance criteria all met, with observed evidence.
71
- ```
72
-
73
- ## `status:` is about the document
74
-
75
- `status: draft` describes this file, not the work. The work's state is the Feature's board
76
- state, and it lives there alone — there is no `plan_state`, no `approval_state`, and no
77
- directory that moves to record progress.
78
-
79
- ## Two rows to leave empty, and one to fill
80
-
81
- `work_item:` is filled from the create call's return, in the same step that names the folder.
82
-
83
- `epic:` was **authored before this skill ran** — it is never tool-created. If it is unset,
84
- that is a stop, not a value to allocate.
85
-
86
- The `## Items` table's `Work item` column stays empty here. `to-workitems` fills it when it
87
- creates the children, and that is the only join between the plan and its items: the link runs
88
- one way, each item naming its `feature:`, and the Feature never lists its items anywhere else.
@@ -1,90 +0,0 @@
1
- ---
2
- name: to-workitems
3
- description: Publish a change plan's backlog items to Azure DevOps — one PBI or Bug per item file, parented under the plan's Feature, with each id written back into the file it came from.
4
- disable-model-invocation: true
5
- ---
6
-
7
- # To Work Items
8
-
9
- Put a plan's **backlog items** on the board.
10
-
11
- **A plan is a Feature. An item file is a PBI or a Bug.** One file each. The plan and its `## Items` table are written before this skill runs; the item files are not, because each is named for an id only this skill allocates. Where the repo carries a `plans/AGENTS.md`, it governs the layout; otherwise follow `## Plans and work items` in the repository's `CONTRIBUTING.md`. [references/AZURE-DEVOPS-HIERARCHY.md](references/AZURE-DEVOPS-HIERARCHY.md) carries the board rules both depend on.
12
-
13
- ## Use When
14
-
15
- - A plan folder's `spec.md` is approved, its `## Items` table is filled in, and those items need to be on the board.
16
-
17
- ## Do Not Use When
18
-
19
- - The plan has open decisions under `## Decisions` — resolve them first, or chart the effort with `wayfinder` if the destination itself is still unclear.
20
- - `epic:` or `work_item:` is unset. **Stop and ask.** Those are the plan's Epic id and Feature id respectively. Never create an Epic or Feature to fill the gap: a typo must fail here, not silently spawn a duplicate. The server refuses a stray Epic outright, and refuses a wrong-*typed* parent for any creatable type — but a right-typed id can still be the **wrong** one, and nothing on the board catches that. Identity is on you.
21
-
22
- ## Process
23
-
24
- ### 1. Read the plan and check the board
25
-
26
- `workitem_list_or_get({ id: <work_item>, raw: true })` and assert:
27
-
28
- - `fields['System.WorkItemType']` is `Feature`
29
- - `links.parent` is `epic`
30
-
31
- One call settles both — there is no need to fetch the Epic itself. `parentId` for every item this skill creates is **always** the Feature — never the Epic.
32
-
33
- ### 2. Read the plan's `## Items` table
34
-
35
- **The rows are the source, not files.** A file under `items/` is named `az<work item id>-<slug>.md`, so **the id is the identity** — and it is always a real work item id. An item that has no id yet therefore has no file and cannot have one: allocate the work item first, then write the file. Nothing is drafted under a placeholder and renamed into truth later.
36
-
37
- Each row has to carry the whole item before the board sees it: its title, its `item_type` (`pbi` or `bug`), what it delivers, its falsifiable verification, and its predecessors. A row missing any of those is a stop, not a skip — fix the row first.
38
-
39
- A row whose `Work item` column is already filled is **already published**. Leave it alone, and confirm its file exists under `items/` with a matching `work_item:`. A filled column with no file means the ids were never written back; a file whose `feature:` names a different plan is a stop.
40
-
41
- ### 3. Check the items are tracer bullets
42
-
43
- Fix the row if not — do not paper over it in the work item body.
44
-
45
- <vertical-slice-rules>
46
-
47
- - Each slice cuts a narrow but COMPLETE path through every layer (schema, API, UI, tests) — vertical, NOT a horizontal slice of one layer
48
- - A completed slice is demoable or verifiable on its own
49
- - Each slice is sized to fit in a single fresh context window
50
- - Any prefactoring should be done first
51
-
52
- </vertical-slice-rules>
53
-
54
- **Wide refactors are the exception.** A **wide refactor** is one mechanical change — rename a column, retype a shared symbol — whose **blast radius** fans across the whole codebase, so a single edit breaks thousands of call sites at once and no vertical slice can land green. Sequence it as **expand–contract**: add the new form beside the old, migrate call sites in batches sized by blast radius (each batch its own item, blocked by the expand), then delete the old form in an item blocked by every batch.
55
-
56
- ### 4. Quiz the user
57
-
58
- Present the items as a numbered list — title, blocked by, what it delivers. Ask whether the granularity and the blocking edges are right. Iterate until approved.
59
-
60
- ### 5. Create the work items
61
-
62
- In `## Items` order, predecessors first — that is what makes `predecessors` expressible, since a row's blockers already have ids by the time it is reached.
63
-
64
- ```
65
- workitem_create_or_update({
66
- type: <item_type: pbi -> 'Product Backlog Item', bug -> 'Bug'>,
67
- title: <the item's title>,
68
- description: <the row's Delivers plus its source plan and row, per references/TICKET-TEMPLATES.md>,
69
- acceptanceCriteria: <the row's Verification, verbatim>,
70
- parentId: <the plan's work_item>,
71
- predecessors: [<ids of the rows this one lists under Predecessor>],
72
- related: [<for a Bug: the id of the PBI it was found in>],
73
- })
74
- ```
75
-
76
- The row's delivery and source become `description`, shaped by [references/TICKET-TEMPLATES.md](references/TICKET-TEMPLATES.md). Its falsifiable verification becomes `acceptanceCriteria` verbatim. Both are advertised arguments and go on the create call, so the board receives the same fields as the row without a follow-up write.
77
-
78
- A Bug parents to the **Feature**, exactly as a PBI does, so `related` is the only way to record which item it was found while building.
79
-
80
- An item with no `parentId` is refused (`requires parentId`), and one parented to anything but the Feature is refused before the request is sent (see [references/AZURE-DEVOPS-HIERARCHY.md](references/AZURE-DEVOPS-HIERARCHY.md)) — so a wrong or missing feature id in the plan now stops the create rather than silently landing an orphan.
81
-
82
- Act on each returned id **immediately**, before creating the next — that is step 6, run once per row rather than once per plan. A crash then leaves a tree that says exactly what exists, rather than a board full of orphans nobody can trace.
83
-
84
- ### 6. Write the item file the id now names
85
-
86
- The create call has returned an id, so the item finally has a name. Write `items/az<id>-<slug>.md` from the repo's `plans/templates/backlog-item.md`, with `work_item:` set to that id, `feature:` naming this plan, and `item_type:` the row's. Then fill that id into the plan's `## Items` row.
87
-
88
- The file is **born with its real id** and is never renamed. The `## Items` index is the only join between a plan and its items, and the link runs one way — the item names its `feature:`, the Feature never lists its items anywhere else.
89
-
90
- Nothing here moves between directories afterwards, and no directory name records progress. From here, progress lives on the work item as the six Build flags, and setting them is a later, separate pass — not this run, which already created the items and so is the wrong party to also confirm `Plan written` on them. That pass's own mechanics — reference names, what each state requires, who must set a flag independently of whom, and how to read a fenced-write refusal — belong to whichever skill runs it, not to this one.
@@ -1,121 +0,0 @@
1
- # How Azure DevOps organises Epic, Feature, PBI, Bug
2
-
3
- From the official docs, not inference:
4
- - [About work items and work item types](https://learn.microsoft.com/en-us/azure/devops/boards/work-items/about-work-items?view=azure-devops)
5
- - [Organize your product backlog](https://learn.microsoft.com/en-us/azure/devops/boards/backlogs/organize-backlog?view=azure-devops)
6
-
7
- ## The hierarchy is four levels, by category
8
-
9
- | Category | Type (Scrum process) | Appears on |
10
- | --- | --- | --- |
11
- | Epic | `Epic` | Epic portfolio backlog |
12
- | Feature | `Feature` | Feature portfolio backlog |
13
- | Requirement | `Product Backlog Item` | Product backlog and Sprints backlog |
14
- | Task | `Task` | Sprint backlog and Taskboard |
15
- | Bug | `Bug` | **depends on a team setting** — see Rule 3 |
16
-
17
- > "Epics group Features, Features group Requirements (User Stories, Product
18
- > Backlog Items, Issues, or Requirements), and Requirements group Tasks."
19
-
20
- ## Rule 1 — parenting is restricted to adjacent levels
21
-
22
- > "You can only reparent backlog items under other features, and features under
23
- > other epics."
24
-
25
- So `parentId` for a Product Backlog Item **or a Bug** is always a Feature,
26
- never an Epic. Creating either with an Epic's id as `parentId` is refused
27
- before the request is sent, naming the mismatch:
28
-
29
- ```
30
- must be parented to a Feature; work item 320 is a Epic
31
- ```
32
-
33
- Reaching the Epic is the Feature's job. In a plan, `feature:` is the parent
34
- link and `epic:` is a cross-check on that Feature's own parent — read the
35
- Feature once (`workitem_list_or_get({ id: feature, raw: true })`) and compare
36
- `links.parent` to `epic:`; there is no need for a second call that fetches the
37
- Epic directly.
38
-
39
- **Every tracked type requires a parent — there is no root case.** Omitting
40
- `parentId` on a Feature, a Product Backlog Item, or a Bug is refused as
41
- `requires parentId`, whatever the type.
42
-
43
- ## Rule 2 — one parent per work item
44
-
45
- Parent-child is single-valued. Ordering and blocking therefore **cannot** be
46
- expressed by parenting; they need `System.LinkTypes.Dependency-Reverse` links,
47
- which `workitem_create_or_update`'s `predecessors` argument creates — one link
48
- per id, in the order given.
49
-
50
- Supplying `parentId` on an **update** moves the item: the old parent link is
51
- removed, never kept alongside the new one.
52
-
53
- `predecessors` is the only argument that creates them. It has no alias at the
54
- tool level: `blockedBy` is not read.
55
-
56
- The complete set of link kinds this server will write is `parent`,
57
- `predecessors`, `related` — nothing else, including `children` and
58
- `successors`, which the board derives from the other end of `parent` and
59
- `predecessors` and so are never a second way to say the same thing.
60
-
61
- ## Rule 3 — a Bug parents to the Feature, the same as a Product Backlog Item
62
-
63
- Creating a Bug with the plan's Feature as `parentId` succeeds. A Bug can also
64
- carry `related: [<id>]` to record which item it was found while building,
65
- alongside its `System.LinkTypes.Hierarchy-Reverse` parent link.
66
-
67
- ## Rule 4 — states are exact, and per work item type
68
-
69
- Product Backlog Item and Bug share one state list, in board order:
70
-
71
- | State | Category |
72
- | --- | --- |
73
- | New | Proposed |
74
- | Approved | Proposed |
75
- | Committed | InProgress |
76
- | In Progress | InProgress |
77
- | In Testing | InProgress |
78
- | Done | Completed |
79
- | Removed | Removed |
80
-
81
- This list was read from the board, not transcribed from generic Scrum
82
- documentation — treat it as exhaustive. A state outside this list is not a
83
- looser spelling of one of these; it is wrong. `Removed` hides the item from
84
- the backlog and is otherwise unconstrained. What each state requires of the
85
- six Build flags is out of scope here — to-workitems never sets a flag or
86
- changes state (see [`../SKILL.md`](../SKILL.md), Step 6); that belongs to
87
- whichever skill runs that pass. Read `System.State` verbatim — never infer a
88
- local status from a remote string.
89
-
90
- ## What can be created, and what can only be a parent
91
-
92
- Creating a work item is restricted to `Feature`, `Product Backlog Item`,
93
- `Bug`. Both `Epic` and `Task` are refused with the same message:
94
-
95
- ```
96
- type must be one of ...
97
- ```
98
-
99
- Epic is still a **valid parent** — a Feature's own `parentId` — it simply
100
- cannot be the type of a new work item.
101
-
102
- **The parent-type rule covers all three creatable types**, Feature included:
103
-
104
- ```js
105
- PARENT_TYPE_REQUIREMENT = { Feature: "Epic", "Product Backlog Item": "Feature", Bug: "Feature" }
106
- ```
107
-
108
- So a Feature parented to anything but an Epic is refused by name, on create and
109
- on update alike — `Feature must be parented to a Epic; work item <id> is a
110
- <type>`. The check reads the parent through the raw work-item endpoint rather
111
- than the tracked-type tool, which is how it can inspect an Epic that
112
- `workitem_list_or_get` refuses to return.
113
-
114
- What the server still cannot check is **which** Epic. A Feature parented to the
115
- wrong Epic is the right type and creates cleanly, so an unset or mistyped
116
- `epic:` is caught by type but never by intent — that part stays on the agent,
117
- and on the human it asks. See [`../SKILL.md`](../SKILL.md)'s "Do Not Use When".
118
-
119
- `Task` stays out for a design reason, not just a server one: an Execution row
120
- is already sized to one item, and a fourth level would need a second place to
121
- record progress, which is the duplication this design exists to avoid.