Repository navigation
Description
Problem
packages/agents/source/lib/lib.sh and its 20 generated scripts/lib.sh copies stay in the tree after #321 ports the shared skill library to Go. Epic #321 lists this deletion as the first of two cutover issues under #588, and no issue tracks it. Five skills still source the library today, and no open issue removes the final shell caller of commit, pr, merge-pr or watch-pr (#322–#325 leave deleting the frozen shell to later cutovers; #1003 owns analyze-session): commit, pr, merge-pr, watch-pr and analyze-session (for example commit.sh:51, create-pr.sh:63, squash-merge.sh:49, watch-checks.sh:47 and preflight.sh:32), so deleting it before those callers migrate breaks their workflows. lib.sh is an owner path, so the deletion needs the owner's exact-head approval at merge.
Acceptance criteria
- AC1: Given every Port the shared skill library (lib.sh, agent.sh, signing.sh, gates.py) to Go #321 child that ports a
lib.shfunction has merged and every caller-removal issue listed under Dependencies is closed by a merged pull request whose merge commit is on origin/main, so that no skill script sourceslib.sh,packages/agents/source/lib/lib.shis deleted. The pull request cites release evidence for the N-2 rule indocs/compatibility.md: the release whose notes start the file-removal warning, the two releases that elapsed since, the minimum binary release that carries every command the migrated callers need (the floor The configuration parity tests are retired after N-2 #935 records), and the consumer migration steps indocs/agent-skills-migration.md. - AC2: Every generated
scripts/lib.shcopy under the claude and codex packages and the deployed.claude/skillsand.agents/skillstrees is deleted, andmise run generate-skillsleaves nolib.shoutput. - AC3: No executable dependency on
lib.shremains: no script, skill manifest, task, workflow or test sources, invokes or generates it. The only remaining mentions are the absence test's literals, historical documentation, and the unchanged protected-path patterns in.agents/agent-skills.conf, which stay. - AC4: Generation stops emitting only
lib.sh, and every other helper the post-prerequisite generator still ships keeps its emission and deployment. The change is tested Go, with no new shell logic. A skill whose script mentionslib.shgets noscripts/lib.sh, and the frozen shell generator fallback no longer copies the library or fails for its absence. - AC5: The
lib.shsuites undertests/skills/source/lib/and thelib.shreferences in other tests are removed with the file, consuming the retirement ledgers of The residual Bats cases for the resolver and readiness groups are retired #933, The residual Bats cases for the review and policy groups are retired #934 and The configuration parity tests are retired after N-2 #935. Each residual case that depends on the removed file maps to a Go test, and that test runs and passes rather than only existing. - AC6: Non-functional: the pull request stays under 800 changed code lines of source and tests, excluding generated copies, with a size report in Verification. Otherwise the pull request is split before review.
- AC7: Non-functional:
mise run check,mise run lint,mise run test,mise run cover-go-checkandmise run cover-py-checkpass at the head, no gate is loosened, and the generated output is committed in the ordermise run generate-skills,mise run skill-tokens,apm install. - AC8: Non-functional: the pull request declares its consumer impact under Risk with a
Compatibility:line in the formdocs/compatibility.mdaccepts (noneordeprecates <key> since <version>), and a separate line in Risk names the release the deletion ships in.
Scope and non-goals
In scope: deleting lib.sh, its generated copies, the lib.sh emission rule, its suites and its references. Non-goals: porting any behavior (the #321 children own that), migrating callers (the Dependencies issues own that), retiring cases that #933, #934 and #935 own, deleting agent.sh or signing.sh (#998), deleting the frozen shell callers (their removal issues own that), and removing the protected-path patterns, and shortening any N-2 window.
Approach
Delete after the last blocker merges and the window closes. Remove lib.sh from the helper trigger in internal/skills/generate.go (around line 206) and from the frozen generator fallback. Name the file where that fallback lives at implementation time: tools/generate-skills.sh:111-112 today, or its relocated copy if #940 has moved it. Leave the helpers that remain shipped at that baseline (gates.py is gone once #713 merges). Keep any shim a thin exec forwarder. Then regenerate in the AC7 order and run the checks. Test literals naming lib.sh (for example internal/skills/generate_internal_test.go:149) are the intended absence test. The mechanism is the implementer's choice within those outcomes.
Dependencies
Part of #588. Prerequisites, each a native blocked-by link (#940 is not one; see the Blocked on: line below):
- the Port the shared skill library (lib.sh, agent.sh, signing.sh, gates.py) to Go #321 children that port each
lib.shfunction, including Port the gate runner and pass cache from Python to Go #713, and the end of their N-2 windows; - Move the commit and agent-commit scripts into agentrepo commit #322, Move the pr, write-pr-description and agent-pr scripts into agentrepo pr #323, Move the merge-pr, merge policy and agent-merge-pr scripts into agentrepo merge #324 and Move watch-pr and fix-pr scripts into agentrepo checks #325 (the Go commands), plus Port analyze-session's shell scripts to Python #331 and Switch analyze-session to the Go retro command with the frozen scripts as fallback #1002 for analyze-session;
- the final caller-removal issues, native blockers Remove the analyze-session shell scripts after the N-2 window #1003 (
analyze-session), Remove the frozen commit shell callers after the N-2 window #1004 (commit), Remove the frozen pr shell callers after the N-2 window #1005 (pr), Remove the frozen merge-pr shell callers after the N-2 window #1006 (merge-pr) and Remove the frozen watch-pr shell callers after the N-2 window #1007 (watch-pr), each deleting that skill's frozen shell callers after its N-2 window; - The generator copies the shared libraries from an explicit list #926, The binary resolver, permanent launcher and configuration bridges are resolved in Go #932, The residual Bats cases for the resolver and readiness groups are retired #933, The residual Bats cases for the review and policy groups are retired #934 and The configuration parity tests are retired after N-2 #935.
Blocked on: #940 (the generator fallback's location). Read #940's mergedAt (non-null) and merge commit; git merge-base --is-ancestor <merge commit> origin/main exits 0. If another deliverable supersedes #940, name it and require the same proof. Closing #940 unmerged does not satisfy the prerequisite.
A blocker counts as done when its issue is closed by a merged pull request and that merge commit is on origin/main.
Blocks #998.
Size
S, if the AC6 size report shows under 800 changed code lines. At baseline, tests/skills/source/lib/lib.bats alone is 1,060 code lines, so the report must say which of its cases #933 and #934 retire first.
Verify plan
- AC1: for each blocker issue, read the issue state and the closing pull request's
mergedAt(for examplegh issue view <N> --json state,closedByPullRequestsReferences, thengh pr view <PR> --json mergedAt,mergeCommit) and confirmgit merge-base --is-ancestor <merge commit> origin/main; issue state alone does not count; Read feat(tools): connect skill generation to the Go command #940's mergedAt (non-null) and merge commit;git merge-base --is-ancestor <merge commit> origin/mainexits 0. If another deliverable supersedes feat(tools): connect skill generation to the Go command #940, name it and require the same proof. Closing feat(tools): connect skill generation to the Go command #940 unmerged does not satisfy the prerequisite.;git grep -n 'lib\.sh' -- 'packages/agents/source/skills'prints nothing; the pull request cites the removal-warning release, the two elapsed releases, the The configuration parity tests are retired after N-2 #935 floor and the migration-note section. - AC2:
git ls-files | grep '/lib\.sh$'prints nothing, andmise run generate-skillsthengit status --porcelainis empty. - AC3:
git grep -nE 'lib(\\)?\.sh'over the tracked tree prints only the allowed classes: the absence test, historical docs and the.agents/agent-skills.confpatterns; the pull request lists each remaining hit under one class. - AC4: a Go test in
internal/skillsasserts that a skill mentioninglib.shgets noscripts/lib.shwhile the other shipped helpers still deploy; a run of the frozen fallback generator on a tree withoutlib.shexits 0; the regenerated claude, codex,.claude/skillsand.agents/skillstrees are listed in the pull request. - AC5: list each deleted suite and case with the The residual Bats cases for the resolver and readiness groups are retired #933, The residual Bats cases for the review and policy groups are retired #934 or The configuration parity tests are retired after N-2 #935 ledger entry that retired it or the Go test that replaces it; run
go test -run <name> -vfor each mapped test and cite the passing result. - AC6: the size report counts non-blank, non-comment lines added and removed outside generated copies, and shows a total under 800.
- AC7: run each named task and assert exit 0;
mise run check-generated-skillspasses. - AC8: read the pull request's Risk section and confirm the validator accepts the line.
Risks
An installed consumer that still sources lib.sh breaks when the file disappears, which is why the callers must migrate and the window must close first. A generator change that drops the other helpers would break every skill that sources them, which AC4 tests. Reverting the commit restores the file, its copies and the emission rule.
Operator authority
A standing rule names the operator: lib.sh is an owner path, so the merge needs the owner's exact-head approval.
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Work type
Projects
- StatusShow more project fieldsBacklog
Activity
9 remaining items
tbhb-dev-reviews commentedon Oct 31, 2026
Refinement: NOT READY — caller cutover dependencies and compatibility proof are incomplete
Checked
.agents/agent-skills.conf:4and.agents/agent-skills.conf:9.Gaps
packages/agents/source/skills/commit/shared/scripts/commit.sh:51,packages/agents/source/skills/pr/shared/scripts/create-pr.sh:63,packages/agents/source/skills/merge-pr/shared/scripts/squash-merge.sh:49,packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:47, andpackages/agents/source/skills/analyze-session/shared/scripts/preflight.sh:32still source the library. Add native blockers for the issues retiring every remaining caller (including the relevant Move the commit and agent-commit scripts into agentrepo commit #322–Move watch-pr and fix-pr scripts into agentrepo checks #325 and Port analyze-session's shell scripts to Python #331 children), and make AC1 require caller migration as well as function ports. All currently named ports can otherwise finish while deletion still breaks workflows. The parent lookup also returned no parent: attach this cutover under Replace complex shell with tested Go, starting with gates and merging #588 as intended.docs/compatibility.md:5requires warnings before removing a file. AC6 must preserve the accepted declaration grammar atdocs/compatibility.md:13while recording the deletion release separately; naming only the shipping release does not establish the warning start or elapsed window.internal/skills/generate.go:206groups lib.sh, gates.py, agent.sh and signing.sh behind one trigger;tools/generate-skills.sh:111has the shell rule, and feat(tools): connect skill generation to the Go command #940 introduces a frozen fallback. Require removal of only lib.sh emission, preservation of helpers still owned by other issues, and regeneration/deployment evidence. Explicitly retain Replace complex shell with tested Go, starting with gates and merging #588's freeze: no new shell logic, with behavior changes in tested Go and only thin exec shims. The current wording leaves generator/fallback treatment unspecified.Split
Keep one final deletion PR after correcting prerequisites. Keep behavior ports and allocated Bats retirements in their existing issues. No new split is needed if the remaining measured change fits the limit.
Definition of done
Ticks mean the current ACs and Verify plan cover the obligation, not that implementation has passed it. Unchecked items remain completion obligations.
check-leaks.shwith the repository's private-strings list, and the leak review of each post.docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.provenance:agent-assistedlabel.Status:comment names the merge commit.mise run checkis green, and so are the coverage floorsmise run cover-go-checkandmise run cover-py-check, whichcheckdoesn't run.packages/agents/source/commits whatmise run generate-skills, thenmise run skill-tokens, thenapm installrewrite, in that order, andcheck-generated-skills(part oflint) passes.docs/agent-skills-migration.mdor the adoption docs, or the PR's Verification says "No consumer impact" and why.D3 coverage: AC5 and its checks require success at the head with no gate loosened. D1 lacks the AC1 prerequisite proof and AC4 coverage proof. D2 identifies owner approval but not all independent-review and finding-disposition obligations.
Round: 1 of 3
tbhb-dev-reviews commentedon Oct 31, 2026
Refinement: NOT READY — caller-retirement dependencies and generator outcomes still conflict
Checked
Refinement:.1263c1fde522f7f7bc4658214df1db73624a8652through read-only GitHub blob queries. The local origin/main ref is older; fetching was denied by filesystem permissions, so the relevant current files were read directly at the remote commit..agents/agent-skills.conf:4,.agents/agent-skills.conf:5and.agents/agent-skills.conf:9.Gaps
packages/agents/source/skills/commit/shared/scripts/commit.sh:51,packages/agents/source/skills/pr/shared/scripts/create-pr.sh:63,packages/agents/source/skills/merge-pr/shared/scripts/squash-merge.sh:49,packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:47andpackages/agents/source/skills/analyze-session/shared/scripts/preflight.sh:32. Name who retires each final caller and make the native graph and AC1 Verify agree; do not leave this deletion waiting on an unowned migration.gates.pyand its generator copy step. Therefore chore(agents): delete lib.sh after the Go port; cutover 1 under #588 #997 cannot require that helper to keep emitting after all prerequisite ports merge. Require removal of only lib.sh relative to the post-prerequisite baseline, preserving only helpers still shipped there. The current coupling is atinternal/skills/generate.go:206andtools/generate-skills.sh:111. Open PR feat(tools): connect skill generation to the Go command #940 moves the shell implementation totools/compat/generate-skills.shand leaves the original path as a capability shim. Specify the prerequisite/retirement owner for that frozen generator so it cannot attempt to copy a deleted library. AC4's Verify instruction that the shim diff show only a removed emission also conflicts with requiring a thin shim: the present script contains the whole generator. Keep observable helper and fallback outcomes in ACs, put paths/mechanics in Approach, and preserve Replace complex shell with tested Go, starting with gates and merging #588's rule that new behavior is tested Go with no new shell logic.internal/skills/generate_internal_test.go:149,internal/skills/generate_internal_test.go:152andinternal/skills/generate_internal_test.go:159; the protected-path expressions deliberately retain the filename at.agents/agent-skills.conf:4,.agents/agent-skills.conf:5and.agents/agent-skills.conf:9, including escaped spellings a simple literal grep misses. Define the outcome as no executable dependency or emission, use a search that accounts for escaped policy spellings, and classify a narrow allowlist for absence-test literals, historical documentation and unchanged protection patterns. Do not remove protection patterns merely to satisfy the search.Split
Keep #997 as one final deletion PR after its actual caller and generator retirement prerequisites. Keep behavior ports and allocated Bats retirements with their existing owners. The measured under-800-code-line bound is suitable; split any newly discovered port or generator-fallback retirement into its own issue rather than expanding this cutover.
Definition of done
Ticks mean the current ACs and Verify plan cover the obligation, not that implementation has passed. Unchecked items remain completion obligations.
check-leaks.shwith the repository's private-strings list, and the leak review of each post.docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.provenance:agent-assistedlabel.Status:comment names the merge commit.mise run checkis green, and so are the coverage floorsmise run cover-go-checkandmise run cover-py-check, whichcheckdoesn't run.packages/agents/source/commits whatmise run generate-skills, thenmise run skill-tokens, thenapm installrewrite, in that order, andcheck-generated-skills(part oflint) passes.docs/agent-skills-migration.mdor the adoption docs, or the PR's Verification says "No consumer impact" and why.Coverage: AC7 covers D3 and devtools-1/2; AC6 covers D8; AC1 covers devtools-3. D1 has AC traceability but still needs the prerequisite and search contradictions above resolved and explicit evidence for every AC on the head. Owner approval alone does not cover all of D2.
Round: 2 of 3
tbhb-dev-reviews commentedon Oct 31, 2026
Refinement: NOT READY — the native prerequisite graph still omits analyze-session retirement
Checked
Refinement:, so this is round 3.1263c1fde522f7f7bc4658214df1db73624a8652, matching remote main. Helper coupling remains atinternal/skills/generate.go:206andtools/generate-skills.sh:111; the helper test is atinternal/skills/generate_internal_test.go:145..agents/agent-skills.conf:4,.agents/agent-skills.conf:5and.agents/agent-skills.conf:9. Warning and declaration rules are atdocs/compatibility.md:5anddocs/compatibility.md:13.Gaps
packages/agents/source/skills/analyze-session/shared/scripts/preflight.sh:32. Add Remove the analyze-session shell scripts after the N-2 window #1003 as a native blocker. The parent endpoint still returns no parent, and Replace complex shell with tested Go, starting with gates and merging #588's native child list omits chore(agents): delete lib.sh after the Go port; cutover 1 under #588 #997: attach this cutover to Replace complex shell with tested Go, starting with gates and merging #588 as intended. Prerequisites represented transitively through caller-retirement issues can remain a chain; redundant direct links to every area epic are unnecessary.Blocked on: https://github.com/tbhb-dev/devtools/pull/940separately, or link its owning issue refactor(tools): move skill generation to Go #807 and state the required merged deliverable. AC1's Verify entry must check that the prerequisite deliverables actually merged as well as checking issue blockers; closing a PR without merging or an issue as not planned does not establish the required baseline.Split
Keep this as the final deletion PR; leave behavior ports, caller retirement and allocated Bats retirement with their existing owners. This is the third NOT READY round. The owner must rethink the prerequisite model before another review cycle: correct native relationships and separate issue blockers, PR deliverables and release-window evidence. If the frozen generator needs new behavior, give that behavior a separately refined Go migration.
Definition of done
Ticks mean the current ACs and Verify plan cover the obligation, not that implementation has passed. Unchecked items remain completion obligations.
check-leaks.shwith the repository's private-strings list, and the leak review of each post.docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.provenance:agent-assistedlabel.Status:comment names the merge commit.mise run checkis green, and so are the coverage floorsmise run cover-go-checkandmise run cover-py-check, whichcheckdoesn't run.packages/agents/source/commits whatmise run generate-skills, thenmise run skill-tokens, thenapm installrewrite, in that order, andcheck-generated-skills(part oflint) passes.docs/agent-skills-migration.mdor the adoption docs, or the PR's Verification says "No consumer impact" and why.Coverage: AC7 covers D3 and devtools-1/2; AC6 covers D8; AC1 covers devtools-3. D1 has AC traceability but needs prerequisite-proof corrections and explicit PR evidence for every AC on the head. Owner approval alone does not cover all of D2. Unticked base duties still apply at completion.
Round: 3 of 3
tbhb-dev-reviews commentedon Oct 31, 2026
Refinement: NOT READY — the generator PR still lacks merged-deliverable verification
Checked
1263c1fde522f7f7bc4658214df1db73624a8652, matching remote main. Generator coupling remains atinternal/skills/generate.go:206andtools/generate-skills.sh:111; the helper fixture is atinternal/skills/generate_internal_test.go:145.Blocked on:URL line, and issue blockers now require a closing merged PR and a merge commit on origin/main. The remaining omission is below.docs/compatibility.md:5anddocs/compatibility.md:13..agents/agent-skills.conf:4,.agents/agent-skills.conf:5and.agents/agent-skills.conf:9.Gaps
mergedAtandmergeCommit. Add an explicit prerequisite check for feat(tools): connect skill generation to the Go command #940: require a non-nullmergedAt, obtain itsmergeCommit, and requiregit merge-base --is-ancestor <merge commit> origin/mainto succeed before deletion. If another deliverable supersedes it, name that deliverable and require the same proof. This does not require feat(tools): connect skill generation to the Go command #940 to merge before refinement; it makes its required baseline verifiable and prevents closing it unmerged from satisfying the prerequisite. The fallback currently lives attools/generate-skills.sh:111; feat(tools): connect skill generation to the Go command #940 relocates it. This is the remaining part of the previous prerequisite-verification finding.Editorial cleanup: move AC4's instruction to name the fallback implementation file into Approach or Verify. Keep the AC focused on observable generation and fallback outcomes.
Split
Keep one final deletion PR after the merged prerequisites and release windows. Leave behavior ports, caller retirement and allocated Bats retirement with their existing owners. No additional split is needed now; apply AC6 if the measured residual exceeds the limit.
Definition of done
Ticks mean the ACs and Verify plan cover the obligation, not that implementation has passed. Unticked base duties still apply at completion.
check-leaks.shwith the repository's private-strings list, and the leak review of each post.docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.provenance:agent-assistedlabel.Status:comment names the merge commit.mise run checkis green, and so are the coverage floorsmise run cover-go-checkandmise run cover-py-check, whichcheckdoesn't run.packages/agents/source/commits whatmise run generate-skills, thenmise run skill-tokens, thenapm installrewrite, in that order, andcheck-generated-skills(part oflint) passes.docs/agent-skills-migration.mdor the adoption docs, or the PR's Verification says "No consumer impact" and why.Coverage: AC7 covers D3 and devtools-1/2; AC6 covers D8; AC1 covers devtools-3. D1 has AC traceability but retains the PR-prerequisite proof gap above; owner approval alone does not cover all of D2.
Round: 1 of 3
tbhb-dev-reviews commentedon Oct 31, 2026
Refinement: READY — the final library deletion has verifiable prerequisites and a bounded scope
Checked
Refinement:was posted after the specified body edit at 2026-10-31 11:28:37Z. The previous redesign review at 11:21:26Z predates that boundary.bfa8937897f8841688de60ee2678520fc05fa4acagainst remote main. The source library and all 20 generated copies still exist. Its source contains 671 non-blank, non-comment lines;tests/skills/source/lib/lib.batscontains 1,060, so the prerequisite retirements and measured AC6 bound remain necessary.packages/agents/source/skills/commit/shared/scripts/commit.sh:51,packages/agents/source/skills/pr/shared/scripts/create-pr.sh:63,packages/agents/source/skills/merge-pr/shared/scripts/squash-merge.sh:49,packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:47andpackages/agents/source/skills/analyze-session/shared/scripts/preflight.sh:32. The parent is now natively Replace complex shell with tested Go, starting with gates and merging #588; all five retirement owners Remove the analyze-session shell scripts after the N-2 window #1003–Remove the frozen watch-pr shell callers after the N-2 window #1007 are native blockers. Their upstream chains cover Switch analyze-session to the Go retro command with the frozen scripts as fallback #1002/Port analyze-session's shell scripts to Python #331/The binary resolver, permanent launcher and configuration bridges are resolved in Go #932 and Move the commit and agent-commit scripts into agentrepo commit #322–Move watch-pr and fix-pr scripts into agentrepo checks #325. The residual Bats cases for the resolver and readiness groups are retired #933/The residual Bats cases for the review and policy groups are retired #934/The configuration parity tests are retired after N-2 #935 cover the allocated test retirement and the remaining shared-library ports transitively.internal/skills/generate.go:206,tools/generate-skills.sh:111andinternal/skills/generate_internal_test.go:149. AC4 preserves only helpers still shipped after prerequisites, accounts for Port the gate runner and pass cache from Python to Go #713 removing gates.py, and requires both Go and frozen-fallback outcomes. The fallback location belongs in Approach now. AC3's narrow exceptions include absence-test literals and unchanged protection patterns, including escaped spellings. This resolves the earlier search contradiction.docs/compatibility.md:5anddocs/compatibility.md:13. Generation order and deployment evidence are explicit. Consumer breakage, helper loss and a revert are addressed. Owner exact-head approval matches.agents/agent-skills.conf:4,.agents/agent-skills.conf:5and.agents/agent-skills.conf:9; the issue grants no authority to bypass it.Gaps
None in readiness. The open prerequisites, release-window evidence and owner approval remain implementation/merge conditions; READY does not assert that those conditions have already passed.
Split
Keep one final deletion PR after the prerequisites and warning windows. Leave behavior ports, caller retirement and allocated Bats retirement with their existing issues. AC6 requires splitting before review if the residual non-generated source/test delta reaches 800 code lines.
Definition of done
Ticks mean the ACs and Verify plan cover the obligation, not that implementation has passed it. Unticked base duties still apply at completion.
check-leaks.shwith the repository's private-strings list, and the leak review of each post.docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.provenance:agent-assistedlabel.Status:comment names the merge commit.mise run checkis green, and so are the coverage floorsmise run cover-go-checkandmise run cover-py-check, whichcheckdoesn't run.packages/agents/source/commits whatmise run generate-skills, thenmise run skill-tokens, thenapm installrewrite, in that order, andcheck-generated-skills(part oflint) passes.docs/agent-skills-migration.mdor the adoption docs, or the PR's Verification says "No consumer impact" and why.Coverage: AC7 covers D3 and devtools-1/2; AC6 covers D8; AC1 covers devtools-3. D1 has complete AC-to-check traceability, while its full PR evidence and merged-head reporting remain completion duties. Owner approval covers part of D2, rather than its entire independent-review and finding-disposition obligation.
Round: 1 of 3