@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.37 → 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.
- package/bin/adl +2 -2
- package/bin/reconcile +10 -13
- package/bin/setup +15 -15
- package/package.json +1 -1
- package/packages/agent-hooks/package.json +1 -1
- package/packages/agent-hooks/src/main.ts +23 -2
- package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +12 -8
- package/packages/agent-hooks/src/rules/impl/adl-run-required.ts +11 -5
- package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +18 -5
- package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +30 -26
- package/packages/agent-hooks/src/rules/impl/git-branch.ts +1 -1
- package/packages/agent-hooks/src/rules/impl/git-target.ts +5 -0
- package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +3 -1
- package/packages/agent-hooks/src/rules/impl/tool-frontend.ts +230 -11
- package/packages/agent-hooks/src/rules/shell/git-identity.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/invocation.ts +14 -2
- package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +10 -11
- package/packages/agent-settings/assets/TARUN-GLOBAL-AGENTS-INSTRUCTIONS.md +2 -2
- package/packages/agent-settings/package.json +1 -1
- package/packages/agent-settings/src/deploy/agents-deploy.ts +19 -1
- package/packages/agent-settings/src/deploy/index.ts +1 -0
- package/packages/agent-skills/assets/agent-search-tool-audit/SKILL.md +4 -6
- package/packages/agent-skills/assets/finalize-feature/SKILL.md +3 -3
- package/packages/agent-skills/assets/implement-feature/SKILL.md +17 -20
- package/packages/agent-skills/assets/implement-feature/references/briefs.md +3 -3
- package/packages/agent-skills/assets/implement-item/SKILL.md +3 -3
- package/packages/agent-skills/assets/mechanics/SKILL.md +1 -1
- package/packages/agent-skills/assets/plan-feature/SKILL.md +10 -10
- package/packages/agent-skills/assets/prepare-promotion/SKILL.md +3 -4
- package/packages/agent-skills/assets/report-bug/SKILL.md +2 -2
- package/packages/agent-skills/assets/review-change/SKILL.md +3 -3
- package/packages/agent-skills/assets/review-plan/SKILL.md +4 -4
- package/packages/agent-skills/assets/triage-workitems/SKILL.md +4 -4
- package/packages/agent-skills/assets/validate-design/SKILL.md +6 -12
- package/packages/agent-skills/assets/verify-item/SKILL.md +5 -5
- package/packages/agent-skills/assets/wayfinder/SKILL.md +1 -1
- package/packages/agent-skills/assets/workitems-process/SKILL.md +19 -21
- package/packages/agent-skills/assets/workitems-process/references/ado-and-git.md +36 -3
- package/packages/agent-skills/assets/workitems-process/references/evidence.md +4 -4
- package/packages/agent-skills/assets/write-feature/SKILL.md +15 -18
- package/packages/agent-skills/dist/deploy.d.ts +45 -0
- package/packages/agent-skills/dist/deploy.d.ts.map +1 -1
- package/packages/agent-skills/dist/deploy.js +167 -3
- package/packages/agent-skills/dist/deploy.js.map +1 -1
- package/packages/agent-skills/dist/index.d.ts +1 -1
- package/packages/agent-skills/dist/index.d.ts.map +1 -1
- package/packages/agent-skills/dist/index.js +1 -1
- package/packages/agent-skills/dist/index.js.map +1 -1
- package/packages/agent-skills/package.json +1 -1
- package/packages/agent-skills/src/deploy.ts +241 -3
- package/packages/agent-skills/src/index.ts +10 -1
- package/packages/azdo/README.md +13 -4
- package/packages/azdo/bunfig.toml +6 -0
- package/packages/azdo/package.json +1 -1
- package/packages/azdo/src/azdo-attachments.ts +2 -1
- package/packages/azdo/src/azdo-pr.ts +182 -6
- package/packages/azdo/src/azdo-wit.ts +290 -41
- package/packages/azdo/src/cli.ts +79 -12
- package/packages/azdo/src/lib/client.ts +88 -16
- package/packages/azdo/src/mcp-server.ts +75 -10
- package/packages/azdo/src/tool-dispatch.ts +61 -26
- package/packages/fleet/src/install-adl-package.ts +4 -3
- package/packages/repo-controls/assets/promote.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/no-type.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-experiment.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-research.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-last-update.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +1 -1
- package/packages/repo-controls/package.json +1 -1
- package/packages/repo-controls/src/config.ts +21 -2
- package/packages/repo-controls/src/doctor.ts +9 -14
- package/packages/repo-controls/src/findings-ratchet.ts +12 -0
- package/packages/repo-controls/src/hook.ts +61 -4
- package/bin/lean-ctx-observe-strip +0 -434
- package/bin/lib/lean-ctx-observe-hooks.sh +0 -634
- package/bin/update-azure-agent-pool +0 -29
- package/packages/agent-hooks/src/hooks/lean-ctx/handler.ts +0 -22
- package/packages/agent-hooks/src/hooks/lean-ctx/index.ts +0 -173
- package/packages/agent-hooks/src/hooks/lean-ctx/mapping.ts +0 -121
- package/packages/agent-hooks/src/hooks/lean-ctx/scope-rewrite.ts +0 -207
- package/packages/agent-hooks/src/lean-ctx/env.ts +0 -123
- package/packages/agent-hooks/src/lean-ctx/mcp.ts +0 -142
- package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +0 -51
- package/packages/agent-hooks/src/rules/impl/adl-session-required.ts +0 -403
- package/packages/agent-hooks/src/rules/impl/tool-lean-ctx-global.ts +0 -594
- package/packages/agent-settings/assets/GLOBAL-AGENTS.md +0 -112
- package/packages/agent-settings/assets/lean-ctx/config.toml +0 -42
- package/packages/agent-settings/assets/lean-ctx/gitignore +0 -10
- package/packages/agent-settings/assets/lean-ctx/layout.toml +0 -7
- package/packages/agent-settings/src/deploy/lean-ctx-deploy.ts +0 -230
- package/packages/agent-settings/src/deploy/lean-ctx-merge.ts +0 -580
- package/packages/agent-skills/assets/adl-mechanics/SKILL.md +0 -38
- package/packages/agent-skills/assets/codebase-design/SKILL.md +0 -98
- package/packages/agent-skills/assets/codebase-design/references/DEEPENING.md +0 -37
- package/packages/agent-skills/assets/codebase-design/references/DESIGN-IT-TWICE.md +0 -44
- package/packages/agent-skills/assets/codebase-design/references/TESTABILITY.md +0 -29
- package/packages/agent-skills/assets/debug-issue/SKILL.md +0 -41
- package/packages/agent-skills/assets/domain-modeling/SKILL.md +0 -86
- package/packages/agent-skills/assets/domain-modeling/references/ADR-FORMAT.md +0 -47
- package/packages/agent-skills/assets/domain-modeling/references/CONTEXT-FORMAT.md +0 -60
- package/packages/agent-skills/assets/implement/SKILL.md +0 -28
- package/packages/agent-skills/assets/review-changes/SKILL.md +0 -45
- package/packages/agent-skills/assets/tdd/SKILL.md +0 -49
- package/packages/agent-skills/assets/tdd/references/mocking.md +0 -59
- package/packages/agent-skills/assets/tdd/references/tests.md +0 -77
- package/packages/agent-skills/assets/testing/SKILL.md +0 -54
- package/packages/agent-skills/assets/testing/references/e2e.md +0 -37
- package/packages/agent-skills/assets/testing/references/integration.md +0 -37
- package/packages/agent-skills/assets/testing/references/unit.md +0 -32
- package/packages/agent-skills/assets/to-feature/SKILL.md +0 -91
- package/packages/agent-skills/assets/to-feature/references/FEATURE-SPEC-TEMPLATE.md +0 -88
- package/packages/agent-skills/assets/to-workitems/SKILL.md +0 -90
- package/packages/agent-skills/assets/to-workitems/references/AZURE-DEVOPS-HIERARCHY.md +0 -121
- package/packages/agent-skills/assets/to-workitems/references/TICKET-TEMPLATES.md +0 -70
- package/packages/azdo/src/workflow-rules-matrix.csv +0 -85
- package/packages/fleet/src/launch-agents.ts +0 -649
- package/packages/repo-controls/assets/GLOBAL-INVARIANTS.md +0 -21
- package/packages/repo-controls/assets/enable-integration-auto-complete.mjs +0 -79
- package/packages/repo-controls/assets/scaffold/docs/notes.md +0 -20
- package/packages/repo-controls/assets/scaffold/plans/GAPS-AND-FINDINGS.md +0 -12
- package/packages/repo-controls/azure-pipelines.yml +0 -274
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +0 -1
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +0 -17
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +0 -13
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-delivery.md +0 -10
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-recommendation.md +0 -12
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/target-narration.md +0 -10
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/mobile/assets/images/icon.png +0 -1
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/public/pwa/icon-192.png +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/resources/product.png +0 -1
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/__init__.py +0 -11
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/check.py +0 -62
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/NotAMigration.sql +0 -1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/test_check.py +0 -116
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/architecture/product/links.md +0 -20
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/architecture/product/links.md +0 -20
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.changeset/declared.txt +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/INDEPENDENT-VERIFICATION.md +0 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/.gitattributes +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/large file.bin +0 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/.gitattributes +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/large file.bin +0 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/small.txt +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/missing-filter/large file.bin +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/.gitattributes +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/payload.dat +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/__init__.py +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/__init__.py +0 -12
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/check.py +0 -129
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/disjoint/gate-registry.yaml +0 -13
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/empty/gate-registry.yaml +0 -7
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/overlapping/gate-registry.yaml +0 -13
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/test_check.py +0 -109
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/__init__.py +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/__init__.py +0 -11
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/check.py +0 -149
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/clean/docs/readme.md +0 -4
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/relevant/VERSION +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/test_check.py +0 -151
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/__init__.py +0 -11
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/check.py +0 -202
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/changesets/package.json +0 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/package.json +0 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/CHANGELOG.md +0 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/VERSION +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/changesets/package.json +0 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/package.json +0 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/CHANGELOG.md +0 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/VERSION +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/test_check.py +0 -162
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/check.py +0 -103
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.lock +0 -7
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.toml +0 -4
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/rust-toolchain.toml +0 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/src/main.rs +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/frontend/bun.lock +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.lock +0 -7
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.toml +0 -4
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/rust-toolchain.toml +0 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/src/main.rs +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/frontend/bun.lock +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/grants-registry.yaml +0 -112
- 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.
|