Skip to content

✨ feat(advice): say why the human-gated queue waits and how to help - #14495

Merged
hivecommons-hive[bot] merged 4 commits into
hivecommons:v6from
Danathar:feat/advisory-human-gate-readable
Oct 27, 2026
Merged

hivecommons-hive[bot] merged 4 commits into
hivecommons:v6from
Danathar:feat/advisory-human-gate-readable

Conversation

@Danathar

@Danathar Danathar commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The weekly owner advice's needs-human item was hard to read. On the projectbluefin hive it said:

Clear the human gate on PRs — 59 of 94 open PRs (62%) are your turn (1 INSPECT, 24 DECIDE, 34 REVIEW) — release, review, inspect or close them.
First: actions#544 (REVIEW — Waiting on a person's review: a reviewer requested changes), actions#665 (REVIEW — …), actions#675 (REVIEW — Hive's review is parked for a person: correctness requires human: Read the workflow at head: … [about 2,500 more characters, including the same "maintainer decision requested" sentence five times]), actions#676 (…), actions#680 (…)
Full list: Your-turn PRs (CSV)
signals: overview_open_prs=94, needs_human=59, your_turn=59, to_close=0

The verb split says what kind of action is owed, not why the PRs are stuck or who can unstick them, and one item's note ran to a paragraph.

With this change, the same queue (the 59 your-turn PRs read from that hive on 2026-10-27, through the new code) renders in the digest as:

  • Clear the human gate on PRs — 59 of 94 open PRs (62%) are waiting on a person; the hive cannot move them on its own.
    • Why they wait:
      • 24 parked until a maintainer decides (20 in utah-packages, 3 in utah, 1 in testsuite).
      • 21 waiting for an approving review that branch protection requires (16 in common, 5 in actions).
      • 6 handed to a person by the hive's review to decide (2 in common, 1 in chairlift, 1 in dakota-iso, 2 elsewhere).
      • 3 people's PRs that need a human review (2 in utah, 1 in utah-packages).
      • 2 with changes a reviewer requested (1 in actions, 1 in common).
      • 3 more for other reasons; the full list has each one.
    • How to help: answer the parked decisions in utah-packages and utah; approve PRs in common and actions; read the hive's review and decide.
    • First:
      • actions#544 — REVIEW — a reviewer requested changes
      • actions#665 — REVIEW — an approving review is required by branch protection (0 given)
      • actions#675 — REVIEW — Hive's review is parked for a person
      • actions#676 — REVIEW — an approving review is required by branch protection (0 given)
      • actions#680 — REVIEW — an approving review is required by branch protection (0 given)
    • Full list: Your-turn PRs (CSV)
    • Numbers behind this: overview_open_prs=94, needs_human=59, your_turn=59, to_close=0, verbs=1 INSPECT, 24 DECIDE, 34 REVIEW

The dashboard card shows the same parts in the same order, with the numbers folded into a "Numbers behind this" disclosure. Issues ("Unblock the human queue") get the same treatment.

Change

pkg/hiveadvisor

  • Why (Recommendation.Why): the your-turn items are grouped by the ownership reason code the dashboard already stored for each one (📝 spec: [v6] dashboard "your turn" signal — ☐ marker, inbox and one server-side ownership decision (from RFC #11504) #11507), worded in plain language, largest group first, each with where it sits (whereText: the three largest repositories, then "N elsewhere"). review_decision_required splits three ways, because each needs a different person: a reviewer's requested changes (either wording BranchProtectionBlockReason gives: "changes requested by @x" or "a reviewer requested changes"), a code owner's review, or approvals branch protection requires. The five largest groups are named; any more fold into one "N more for other reasons" line (a single leftover group is shown instead).
  • How to help (Recommendation.Help): the action for the three largest groups. It names repositories only when two of them hold most of the group, so a group spread across five repos doesn't send people to the first two alphabetically.
  • Item notes (shortOwnershipNote): verb plus reason, cut to the reason's first clause past 100 characters ("Hive's review is parked for a person"), or truncated with "…" when there is no clause. A review-decision note drops "Waiting on a person's review:", which REVIEW already says ("REVIEW — a reviewer requested changes"). NeedsHumanItems, which the inbox reads, keeps the full reason.
  • Headline: "N of M open PRs (P%) are waiting on a person; the hive cannot move them on its own." The per-verb split moved into the signals as verbs.
  • DescribesReasonCode lets the dashboard check that every reason code it can produce has wording. A code without wording still groups, under its own reason text.

Renderers

  • Digest (advisory.writeAdviceSection): one idea per line. The headline is followed by "Why they wait:" sub-items, "How to help:", "First:" with one item per line, "Full list:", and last "Numbers behind this:" (signals used to trail the headline in parentheses). This applies to every recommendation, not only the needs-human ones.
  • Dashboard card (renderHiveAdvice): the same order. Why and items are lists, help is one line, and signals sit in a closed <details>. The new classes use the existing spacing and type tokens.

Docs

  • src/docs/advisory.md describes Why, How to help, the short item note and "Numbers behind this".
  • src/docs/api-reference.md lists the why and help fields.

Testing

From src/ under /var/tmp, -count=1, TZ=UTC:

  • go test ./pkg/hiveadvisor/... ./pkg/advisory/... ./pkg/dashboard/... and go test ./cmd/hive/ -run 'Advis|Advice': all ok (hiveadvisor, advisory, dashboard, dashboard/collect, dashboard/theme, dashboard/webstatic, cmd/hive).
  • go build ./pkg/... ./cmd/... succeeds; go vet and gofmt are clean on the changed packages.
  • check-docs-links.py, check-docs-citations.py and check-changelog-fragment.sh v6 pass.

New tests:

Test Covers
TestHumanGateAdviceSaysWhyAndHowToHelp The projectbluefin shape scaled down, including actions#675's real paragraph-long reason: headline, every Why line, the Help line, short item notes, and the inbox list keeping the full reason.
TestHumanGateWhyFoldsSmallGroups Seven groups: five named, the rest folded, three help actions.
TestHumanGateWhyShowsASingleLeftoverGroup Six groups: all six named; no "1 more".
TestHumanGateHelpNamesReposOnlyWhereMostItemsAre Spread group: no repositories named; concentrated group: the two named.
TestHumanGateWhySplitsEveryReviewDecisionWording Every reason BranchProtectionBlockReason gives a review decision lands in its group: both requested-changes wordings, both code-owner wordings, the approval count.
TestHumanGateWhyWordsUnknownCodesFromTheirReason A code the advisor does not know still groups, under its reason text.
TestWhereTextNamesTheLargestRepos, TestShortOwnershipNoteCutsAClauselessReason The repository breakdown and the note cut.
TestAdviceSectionRendersWhyAndHowToHelp (pkg/advisory) The exact digest block.
TestHiveAdviceWordsEveryOwnershipReason (pkg/dashboard) Every code in ownershipReasonVerbs has wording in the advisor.
TestHiveAdviceCardReadsAsWhyHelpAndItems (pkg/dashboard) Runs the shipped renderHiveAdvice in node: section order, list markup, help line, folded signals, cleared advice unchanged.

Three existing tests pinned the old wording and now check the new headline, the verbs signal, the Why lines for the issue scenario and the one-item-per-line digest format.

Mutation checks

Each part was broken in turn and restored from a backup:

  • No requested-changes split: the main advice test fails.
  • Full notes again: the main test and the note test fail.
  • No "elsewhere": the where test fails.
  • Always name repositories: the help test fails.
  • Fold a single leftover: the leftover test fails.
  • Digest drops Why: the digest test fails.
  • Card drops Why: the node card test fails.
  • A reason code without wording: the drift test fails.
  • No review-decision trim: the main advice test fails.
  • Match only "requested changes": the review-decision wording test fails.

Not verified

  • No live hive. The "after" above was produced by running this code on the projectbluefin queue as read through the hive's review_queue tool, not on a running dashboard.
  • The repeated "maintainer decision requested" sentence inside a parked review's reason (five copies on actions#675) comes from the review pipeline and still shows in the inbox. The advice no longer prints it; the source is not changed here.
  • TestAgentClosedFindingIsNotReportedResolved (pkg/advisory, untouched) fails when the local date differs from the UTC date, which is why the runs above set TZ=UTC as CI does. It fails the same way on v6 without this change.

Contributor checklist

  • Changelog: changelog.d/changed-readable-human-gate-advice.md.
  • Targets v6.
  • The title uses the emoji convention.
  • Commits include DCO sign-off.
  • Docs updated (src/docs/advisory.md, src/docs/api-reference.md).
  • No secrets, credentials or local runtime state are committed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BQYnPGFJx81c8JXR3o1sg1

The weekly owner advice's needs-human items said "59 of 94 open PRs are
your turn (1 INSPECT, 24 DECIDE, 34 REVIEW)" and listed five items whose
notes could run to a paragraph (a parked hive review prints every
reviewer's summary). The verb split says what kind of action is owed, not
why the PRs are stuck or who can unstick them.

clear-human-gate-prs and unblock-human-issues now group the your-turn
items by the stored ownership reason code, in plain words with where each
group sits (Recommendation.Why), name the action for the largest groups
(Recommendation.Help), and keep each item note to one clause. The digest
and the dashboard card render one idea per line, with the raw signals last
(folded away on the card). A dashboard test keeps every ownership reason
code worded in the advisor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQYnPGFJx81c8JXR3o1sg1
Signed-off-by: Danathar <Danathar@users.noreply.github.com>
@kubestellar-prow kubestellar-prow Bot added the dco-signoff: yes Indicates the PR's author has signed the DCO. label Oct 27, 2026
@kubestellar-prow

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign hanthor for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@kubestellar-prow kubestellar-prow Bot added the size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. label Oct 27, 2026
@hivecommons-hive hivecommons-hive Bot added author/clanker A contributor's own hive authored this PR under their login dco All commits are DCO signed-off role/trusted Author is trusted for unattended merge (trusted-author role or registry/claim tier in require_tiers) stage/050-review-pending Review swarm requested; awaiting a verdict for the current head labels Oct 27, 2026
…ady says

"REVIEW — Waiting on a person's review: an approving review is required
by branch protection (0 given)" repeated "Waiting on a person's review" on
most listed items. The note now keeps what follows it: "REVIEW — an
approving review is required by branch protection (0 given)", "REVIEW — a
reviewer requested changes". The inbox and the CSV keep the whole reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQYnPGFJx81c8JXR3o1sg1
Signed-off-by: Danathar <Danathar@users.noreply.github.com>
@hivecommons-hive hivecommons-hive Bot added stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act and removed stage/050-review-pending Review swarm requested; awaiting a verdict for the current head labels Oct 27, 2026
@hivecommons-hive

Copy link
Copy Markdown
Contributor

@Danathar this PR is back in your court (stage/072-returned-to-contributor). The hive will not merge it until the head changes.

Failing checks:

  • check-failure

Reply here or push a new head to this branch (same sign-off); CI and the review swarm re-run automatically and the PR returns to the normal path.

Your relay session received this as a fix-pr task; your current task is parked (claim kept alive) until this PR is green.

@hivecommons-hive hivecommons-hive Bot added stage/050-review-pending Review swarm requested; awaiting a verdict for the current head stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act and removed stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act stage/050-review-pending Review swarm requested; awaiting a verdict for the current head labels Oct 27, 2026

@hivecommons-hive hivecommons-hive Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Read the full diff against v6 plus the producers of the reason strings it parses. The grouping/rendering is sound and the output is a clear improvement, but one string match misses the most common "changes requested" wording, which sends owners the opposite advice for those PRs.

Finding (medium) — src/pkg/hiveadvisor/human_gate.go:96

gateReasonFor splits review_decision_required on strings.Contains(reason, "requested changes"). The reason text comes from github.PullRequest.BranchProtectionBlockReason via ownership_gates.go:98 ("Waiting on a person's review: "+reason), and that producer has two spellings:

  • src/pkg/github/merge_block_reason.go:103 — "changes requested by " + who when ChangesRequestedBy is populated (the normal case once the hub has reviewer data)
  • src/pkg/github/merge_block_reason.go:105 — "a reviewer requested changes" only as the fallback

Only the fallback contains "requested changes". A PR with changes requested by @alice falls through to the generic gateReasons["review_decision_required"] entry, so it is counted under "waiting for an approving review that branch protection requires" and the Help line says "approve PRs in …" — for a PR that actually needs the author to address review feedback. The test fixtures (human_gate_test.go:49) only use the fallback wording, which is why this passes.

Suggested fix: match both orderings, e.g.

case strings.Contains(reason, "requested changes"), strings.Contains(reason, "changes requested"):

and add a fixture with changes requested by @someone so the /changes bucket is exercised on the common path. (The code-owner branch is fine: merge_block_reason.go:151,153 both emit code-owner.)

Verified OK

  • Reason-code coverage: every key in ownershipReasonVerbs (pkg/dashboard/ownership.go:81) has wording in gateReasons, and the new hive_advice_readable_test.go pins that; the dashboard test shards are green.
  • whereText/topRepos/joinAnd and the maxWhyGroups+1 fold rule behave as the comments describe; copyRecommendations now deep-copies Why.
  • index.html passes why, help and item notes through escapeHtml; the raw signals moved into a <details> rather than being dropped. advisory.md and api-reference.md were updated for the new fields.
  • The red test (agent 4/5) / coverage checks are TestPollTmuxOutputForAgent_WiresThrashBreaker in pkg/agent, which this PR does not touch — that is the v6 breakage #14494 forward-ports the fix for, not something to chase here.

Note for whoever triages: the body cites #11507 as background but has no Closes/Refs issue; that's the hive's own call for a feature PR, flagged only so nobody expects an issue to auto-close.

— hive: agent=reviewer-2 backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive hivecommons-hive Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Read pkg/hiveadvisor, pkg/advisory/advisory.go:1458-1500, pkg/dashboard/ownership*.go and the renderHiveAdvice block in index.html at v6 392df48 alongside this diff. The change does what the body says and I found no defects. Looks correct to me.

Verified

  • humanGateWhy(owns, repos) indexes repos[i] for each owns[i]; both slices are appended together in summarizePRs (queue.go:329) and summarizeIssues (:387), so they stay in lockstep. Grouping is by count only, so the later oldest-first sort of yourTurnItems does not affect it.
  • Every code in the new gateReasons table exists in the dashboard: the 25 ownershipReasonVerbs keys (pkg/dashboard/ownership.go:81-106, enforced by the new TestHiveAdviceWordsEveryOwnershipReason) plus the review-hold (ownership_review_holds.go), gate (ownership_gates.go) and run/approval (ownership_runs.go) codes. Unknown codes fall through to "other/<first clause>" rather than being dropped.
  • review_decision_required split: matches the requested changes / code-owner substrings that HumanReviewBlocksMerge reasons use; anything else keeps the generic wording.
  • sig() takes any (hiveadvisor.go:273), so moving verbSummary into a verbs signal is type-safe; copyRecommendations deep-copies the new Why slice.
  • Renderer: why, help and item notes all pass through escapeHtml (index.html:27303-27311); the Markdown writer only reorders existing content — item notes were already written raw before this change.
  • shortOwnershipNote strips only the leading "<clause>: " for review_decision_required and otherwise truncates at a clause boundary or 99 runes + …; the full reason remains in the CSV export as the comment says.
  • docs: advisory.md and the /api/hive-advice row in api-reference.md describe the new why/help fields; the pkg/dashboard/api.go:356 citation is untouched and server.go is not edited, so the citation checker is unaffected.

CI

The red test (agent 4/5) / coverage jobs fail on pkg/agent TestPollTmuxOutputForAgent_WiresThrashBreaker (thrash_poller_wiring_test.go:110), which this PR does not touch — that is the v6 baseline failure #14494 is forward-porting the fix for. The hub shard that runs pkg/hiveadvisor, pkg/advisory and pkg/dashboard passed. Expect green once #14494 lands and this is rebased or re-run.

Note for the maintainer: no issue is linked; the body's before/after quote is the spec, and the diff matches it.

— hive: agent=reviewer backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive hivecommons-hive Bot added stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act and removed stage/050-review-pending Review swarm requested; awaiting a verdict for the current head labels Oct 27, 2026
@hivecommons-hive

Copy link
Copy Markdown
Contributor

hive/shared-ci: the test (agent 4/5) failure here (TestPollTmuxOutputForAgent_WiresThrashBreaker, 3/3 on ubuntu-26.04) is not caused by this PR's diff. It is a v6-line shared incident: the #14415 fix landed on v5 only and has not been forward-ported to v6 (src/pkg/agent/thrash_poller_wiring_test.go). Tracked in #14506; a forward-port PR is being opened. Once it merges, update this branch from v6 and the slice should go green — no change needed in this PR.


🐝 Hive Agent: scanner | Instance: hosted-available-oke-11-placeholder-r05x | SHA: b05e7ba6f

— hive: agent=scanner backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive hivecommons-hive Bot added stage/060-reviewed Review swarm verdict approve; a gate is still pending (CI running, soak not started) stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act and removed stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act stage/060-reviewed Review swarm verdict approve; a gate is still pending (CI running, soak not started) labels Oct 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Open PR overlap check

Base branch: v6

Conflicts are checked with every PR merged onto the current tip of v6, so a PR that only needs a rebase is not reported as conflicting with its siblings.

No conflicting open PRs or same-file overlaps were found.

@hivecommons-hive hivecommons-hive Bot added stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act stage/060-reviewed Review swarm verdict approve; a gate is still pending (CI running, soak not started) and removed stage/060-reviewed Review swarm verdict approve; a gate is still pending (CI running, soak not started) stage/072-returned-to-contributor Contributor PR: CI red, changes requested or conflicting; diagnosis posted, author must act labels Oct 27, 2026
@hivecommons-hive

Copy link
Copy Markdown
Contributor

Shared-CI incident #14506 is resolved: the test (agent 4/5) fix landed on v6 via #14494. This PR only needs its branch updated from v6 (no code change) for the shard to go green; the merge sweep will pick it up once CI passes.


🐝 Hive Agent: scanner | Instance: hosted-available-oke-11-placeholder-r05x | SHA: unknown

— hive: agent=scanner backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive

Copy link
Copy Markdown
Contributor

hive/awaiting-ci: branch synced with v6 (picks up #14494, which fixed the TestPollTmuxOutputForAgent_WiresThrashBreaker failure on test (agent 4/5)). CI pending — sweep will merge when green.


🐝 Hive Agent: scanner | Instance: hosted-available-oke-11-placeholder-r05x | SHA: unknown

— hive: agent=scanner backend=copilot model=claude-fable-5.1 copilot=1.0.88

The review-decision split matched only "requested changes", the fallback
wording BranchProtectionBlockReason uses when it does not know who asked.
When it does, the reason reads "changes requested by @alice", so those PRs
were counted as waiting for an approval and the help line said "approve
PRs in ..." for PRs whose author has review feedback to address. Match
both wordings, and test every review-decision reason the producer can give.

Found by the hive's reviewer-2 on this PR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQYnPGFJx81c8JXR3o1sg1
Signed-off-by: Danathar <Danathar@users.noreply.github.com>

@hivecommons-hive hivecommons-hive Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Read hiveadvisor/human_gate.go, queue.go, hiveadvisor.go and advisory.go writeAdviceSection at 9fa97a0; this looks correct to me.

  • humanGateWhy (human_gate.go:122-181): the group sort and the maxWhyGroups fold (len(sorted) > maxWhyGroups+1) match the comment; every help template containing %s ends in " in %s", so the Sprintf/TrimSuffix branch cannot leave a stray verb.
  • sig("verbs", verbSummary(...)) is fine: sig takes any (hiveadvisor.go:279).
  • copyRecommendations copies the new Why slice (hiveadvisor.go:301), so the cached result is not aliased.

One wording note, not a defect: queue.go:512 says "the oldest are listed first", but yourTurnItems are ordered by IdleDays desc (queue.go:311, :369), i.e. longest idle, not oldest by creation. Same semantics as the previous "decide the oldest first" text, so no change needed unless you want "longest waiting".

go build ./pkg/hiveadvisor/ ./pkg/advisory/ ./pkg/dashboard/ passes locally.

— hive: agent=reviewer-2 backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive hivecommons-hive Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Read the diff against the v6 tree. Looks correct to me.

  • src/pkg/hiveadvisor/queue.go:329,387 — yourTurnOwn and yourTurnRepos are appended in the same statement, so humanGateWhy's repos[i] indexing (human_gate.go:138) is always in bounds.
  • human_gate.go:115-125 — unknown reason codes still group under other/<first clause>, so a new ownershipReasonVerbs code degrades to a readable line rather than being dropped; hive_advice_readable_test.go pins the known set against pkg/dashboard/ownership.go:81.
  • static/index.html:27304-27311 — every new interpolation (why, help, note) goes through escapeHtml.
  • hiveadvisor.go:301 — copyRecommendations deep-copies the new Why slice, so the frozen-week snapshot does not alias.
  • advisory.go — signals moved to the end under "Numbers behind this"; still emitted, so nothing a digest consumer greps for is lost. Builds clean at 7c3b967.

— hive: agent=reviewer backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive hivecommons-hive Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Read the diff against the tree at 9fa97a0, including the producers of the strings it matches on. Looks correct to me.

  • The review_decision_required split in human_gate.go (gateReasonFor) keys on "changes requested", "requested changes" and "code-owner"/"code owner". Those are exactly the reasons merge_block_reason.go produces (:103 "changes requested by " + who, :105 "a reviewer requested changes", :151 "… requires code-owner review"), wrapped by ownership_gates.go:98 as "Waiting on a person's review: …" — and the lowercase/Contains match survives that prefix.
  • gateReasons covers every OwnershipReason* constant value in pkg/dashboard (I diffed the two sets: no code on either side is missing), and TestHiveAdviceWordsEveryOwnershipReason keeps that true in CI.
  • yourTurnOwn/yourTurnRepos are appended in the same branch as yourTurnItems (queue.go:322-330, :380-388), so the parallel slices humanGateWhy indexes stay aligned.
  • go build ./pkg/hiveadvisor/ ./pkg/advisory/ ./pkg/dashboard/ is clean at this head. Body matches the diff (why / how-to-help / first list, signals folded under "Numbers behind this").

One non-blocking observation: gateReasonFor groups unknown codes by "other/" + firstClause(o.Reason), so a future code with a per-item variable reason would fan out into one group per item rather than one group per code. The dashboard test above means it cannot happen silently, so I would not change anything here.

— hive: agent=reviewer-2 backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive

Copy link
Copy Markdown
Contributor
Evidence bundle `#144959fa97a0` sha256:445f2b0b2c47525d9797d52868c8c0b1d66d685f1d349615f2697249bc9d159c — download from the dashboard or `hivectl review evidence #14495`.

@hivecommons-hive

Copy link
Copy Markdown
Contributor

merged by Hive trusted-author auto-merge: author @Danathar holds role owner and GitHub permission maintain on repo; CI green at 9fa97a0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author/clanker A contributor's own hive authored this PR under their login dco All commits are DCO signed-off dco-signoff: yes Indicates the PR's author has signed the DCO. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant