Skip to content

🌱 top-up: forward-merge v5 into v6 (123 commits) - #12783

Merged
hivecommons-hive[bot] merged 124 commits into
v6from
topup/v5-into-v6-20261017
Oct 17, 2026
Merged

hivecommons-hive[bot] merged 124 commits into
v6from
topup/v5-into-v6-20261017

Conversation

@clubanderson

Copy link
Copy Markdown
Member

Forward-merge (top-up) of v5 into v6, same approach as #12556.

Range

  • Merge base: ca5517229
  • v6..origin/v5: 123 commits, 445ef0ba6 (πŸ› evidence: fold live + backfilled bundles per PR) … d786b8999 (πŸ“– docs: clarify Hive-self opt-in and feature-flag delivery status)
  • Merge strategy: git merge --no-ff -s recursive -X patience origin/v5, 79 conflicting files. Merge commit, not squash/rebase.
  • Releases carried: v5.180.0, v5.181.0, v5.181.1, v5.182.0.

Headline changes from v5

v6-only behaviour preserved

git log origin/v5..v6 is 932 commits; the following v6 divergences were respected wherever v5 touched the same code: split config files; kick dispatch after status publish; nousstore durable stores; your-turn/ownership model; ReviewVerdictHold; configured parking labels (isParkingLabel/hasNeedsHumanLabel, blocked); revise-in-place campaigns (RevisionOf never written); no Nous output mode (#11699); runs-section layout; experiment-lab.md (v5 strategy-lab.md kept as stub); observe-after-write executeIssueWrite for label mutations; v6 unpark replies name the labels actually removed.

Conflict resolutions

Area Files Resolution
Policies src/policies/*.md + pkg/policies/defaults/*.md (36) Took v5 text, re-applied v6-only additions; embedded defaults kept byte-identical to src/policies. scanner-automerge.md trimmed to 32764 B so TestShippedTemplatesFitUnderCap (2Γ— headroom under 64 KiB) still passes.
Config pkg/config/* v5 label changes (DefaultNeedsDecisionLabel, LegacyNeedsDecisionLabel(s)) ported into v6's split config files.
GitHub client pkg/github/{client,issue_unpark*,watcher,automerge} v5 logic on top of v6 observe-after-write writes and configured parking labels; NeedsDecisionStageLabel = config.DefaultNeedsDecisionLabel.
cmd/hive main.go, merge_eligibility.go, claimswire.go v5 claim hooks (ApplyStageLabel/ApplyClaimedByLabel, fresh-read remove) kept; v6 wiring kept.
Dashboard Go api_campaigns.go, api_hive_advice.go (ours), api_nous.go (ours), deps.go, bands.go, server.go, overview_status.go, ownership.go v5 features merged; revise-in-place and no-output-mode kept. Legacy needs-decision dropped from waiting-label defaults/chips (mapped to the stage chip); decision bucket matches EffectiveNeedsDecision() + legacy; needs_human/reporter_confirmation partition rows added.
static/index.html 13 blocks v5 sections (activity monitor, swarm panel position, Experiment Lab UI) merged; duplicate swarm panel removed; nousPostCampaign helper extracted.
openapi.json 1 union of both paths.
Spokebackup / knowledge several v5 changes; inception archive/delete adapted to in-place revise.
Docs adr/0019, adr/README, backup-restore, hive-open-issue, inception, scale-envelope, dashboard-sections, dashboard, labels-and-control-signals, maintainer-commands, operator-reference, strategy-lab (ours) + port into experiment-lab, api-reference tables v5 text with v6 names; check-api-reference-citations.sh --fix refreshed 329 citations.

Post-merge test adaptations (union-only breakage)

  • pkg/github: v6-only tests updated to stage/085-needs-decision and to v5 🌱 research: stamp Console ACMM L0β†’L5 dates on backfilled evidenceΒ #12680 (needs-human stays); TestRemoveLabel_PlainReplayDedupes given the observe-after-write GET.
  • pkg/dashboard: TestCampaignDeleteRemovesArchiveOnly rewritten for revise-in-place; section-reorder count 21β†’22 (activity monitor); nous_settings_guardrails_ui_test.go (v5) given v6 stubs and output-mode assertions replaced; merge-queue test strips origin/* provenance labels.
  • pkg/dashboard/webstatic: Experiment Lab header assertions updated to v6 markup.
  • pkg/knowledge: TestInceptionCampaignArchiveDelete adapted to in-place revise.
  • cmd/hive: TestClaimHooksRemoveLabelAfterSecondClaimExpires mock is now a small label store that counts only stage/020-claimed adds/removes (v5 hooks also write hive/claimed-by-*).

Validation (local, macOS)

  • gofmt -l clean; go build ./... && go vet ./... OK.
  • go test ./... -short -count=1: all green except the known local-only failures (pkg/agent tmux/session-env, pkg/releasesentinel git retagger, pkg/spektacular binary deadline) that also fail on a clean v6 checkout here.
  • Coverage vs the v2-ci per-package floors for every package touched by the merge: all above floor (e.g. dashboard 86.8/84, github 89.3/88, hub 88.7/87, knowledge 89.7/89, agent 89.1/88, config 90.6/90, cmd/hive 76.0/42, webstatic 92.9/88, hub/spoke 91.1/90, nous 95.2/90).
  • python3 src/scripts/check-docs-citations.py src/docs OK; check-api-reference-citations.sh, check-release-lines.sh, .github/scripts/check-inline-js.js OK; src/pkg/dashboard && npm test 88/88; style ratchet baselines unchanged.

Notes

Danathar and others added 30 commits October 16, 2026 20:08
…port (#12533)

Move the per-PR fold behind GET /api/evidence/summary into pkg/evidence
(evidence.PR, evidence.FoldPRs, evidence.PRKey) and use it in the hub
heartbeat evidence block and `hivectl evidence export`. Both previously
kept the newest bundle per PR and windowed on its created_at, so on a
spoke with live + backfilled bundles they reported reviewed PRs as open
and pulled old PRs into short windows, disagreeing with the dashboard.

The fold now also carries revert_of/followup_of/followed_up_by from
whichever record knows them (the heartbeat counts followups as failures).
The export windows --since on PR open time, adds an opened_at column and
reports outcome=closed for a backfilled close without merge.

Hive-Run: #12516
Hive-Plan: evidence-fold-shared-readers
Hive-Spec: review-evidence#exporting

Signed-off-by: Danathar <Danathar@users.noreply.github.com>
Co-authored-by: Danathar <Danathar@users.noreply.github.com>
…#12530)

* fix(issue-claims): do not record a start claim for deferral comments

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>

* fix: resolve blockerRef const/type name collision

Signed-off-by: scanner <scanner@hive.kubestellar.io>

---------

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>
…s exactly one stage label (#12526)

* πŸ› stagelabels: one enforcer re-reads before writing so an item carries exactly one stage label

A contributor claim on #12512 landed nine minutes after the
issue reconciler had staged the issue stage/010-actionable. The claim-ledger
hook mirrored the claim with a bare AddLabels(stage/020-claimed), so the
issue carried two stage labels until the claim lapsed and the hook removed
020 again. The reconciler and the PR lanes plan from the cycle's list
payload, so a stage another writer places between the list and the write
is never seen either.

Every stage write now goes through stagelabels.Enforce / EnforceStage: when
a write is due the item is re-read and the plan recomputed from truth, so
exactly one stage/NNN-* survives and any duplicate found is healed and
counted. The claim hooks (claimswire, contribute_claims) call
Client.SetStageLabel, which keeps the author tier and health labels it
finds and swaps only the stage.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* πŸ› github: journal stage label writes against observed updated_at so a re-added label can be removed again

#12443 kept stage/020-claimed next to stage/072 while the
reconciler logged 'removed stage/020-claimed' every cycle: the mutation
journal had recorded that remove as applied once and replayed it as an
idempotent no-op, and Journal.Reconcile refuses to walk an Applied op
back. Label mutations are not one-shot effects β€” another writer can put the
label back β€” so the stage labeler's reads record the item's updated_at and
its writes carry it as a claim input. The plain AddLabels/RemoveLabel keep
their crash-retry dedupe.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* 🌱 stagelabels: cite the tracking issue

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* πŸ“– scale-envelope: move the RankActionableIssues citation with the code

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* test: rename SetStageLabel→ApplyStageLabel, drop fixed sleep

ApplyStageLabel is a write, not a rebuild-time hook, so it must not
match the Set* convention guarded by TestGitHubClientSetHooksAllConfigured.
Replace the poll loop's time.Sleep with testutil.Eventually to keep the
sleep ratchet flat.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

---------

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
…g test (#12499)

* fix(deploy): avoid printf|grep pipefail false-fail in runtime-config test

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>

* ci: retrigger build-and-test after runner infra failure (PPA 503 in PyYAML step)

Signed-off-by: scanner <scanner@hive.kubestellar.io>

---------

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>
…them (#12535)

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>
…head is red (#12540)

The automerge lanes gate on required checks only, so a PR whose rollup
shows a red non-required check still reaches contributor-lane:soaking and
classifyStage mapped that to stage/100-merge-queue β€” 'merge queue' next to
a red βœ— on #12457.

EvaluateCommitCI now reports the completed-red statuses/check runs it
skipped as non-required (FailingNonRequired; meta contexts excluded), the
sweep notes them on the stage tracker per head SHA, and classifyStage turns
a merge-queue reason into 080-awaiting-merge-admission with reason
optional-check-failing:<check> whenever the current head carries one. A red
required check is still the lane's required-check-failing:* β†’ 072/070, and a
note recorded for an older head does not bind a newly pushed head.

Closes #12538

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
…12536)

* fix(agents): point Copilot login dead-ends at the dashboard login flow

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>

* changelog: fragment for #12536

Generated by changelog-fragment-guard from the PR title (#5675).
Edit the wording freely, or replace this file with the no-changelog
label if the change is not user-visible.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Signed-off-by: hivecommons-hive[bot] <280983584+hivecommons-hive[bot]@users.noreply.github.com>

---------

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Signed-off-by: hivecommons-hive[bot] <280983584+hivecommons-hive[bot]@users.noreply.github.com>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>
Co-authored-by: hivecommons-hive[bot] <280983584+hivecommons-hive[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…le cards and a scope-conflict guard (#12543)

* ✨ nous: concurrent campaigns with scope guard and /api/nous/campaigns

Campaigns become first-class concurrent entities (hypothesis, scope,
active|paused|archived). Two running campaigns may not share a repo
target or both be hive-wide: Create/Resume/Update return *Conflict and
the handlers answer 409 scope_conflict with the other campaign.
campaigns.json v1 files load and upgrade to v2. GET/POST
/api/nous/campaigns and PATCH /api/nous/campaigns/{id}; status lists
every campaign with its own baseline count and attributed rows.

Refs #12532

Signed-off-by: Andy Anderson <andy@clubanderson.com>

* ✨ experiment lab: inception-style experiment cards, scope-conflict guard, per-card stages

- Experiment Lab renders running campaigns as Inception-style cards
  (.campaigns-card/.campaign-row): question, scope pills, status, stage
  line, baseline bar N / 672 with an β“˜ saying 672 β‰ˆ 7 days at 4/hour,
  Pause/Resume/Archive, + New experiment inline form reusing the Repo
  Targets pills; archived ones under Previous experiments.
- 409 scope_conflict renders an in-app warning offering Pause #N and
  start / Narrow scope (never window.alert/confirm).
- Research question removed from the section header (#12498): it lives
  only on the cards; header is title + β“˜/βš™ + mode Β· N experiments.
- Server-derived per-campaign stage/stageLabel/stageDetail/nextAction;
  a complete baseline in Observe mode offers a single Generate proposals
  action instead of telling the user to switch modes. Empty states say
  what to do. Principles tile gets an β“˜.
- Fix /api/nous/status echoing the boot-time mode after PUT /api/nous/mode.
- OpenAPI, api-reference, strategy-lab.md, dashboard-sections.md, FAQ,
  changelog fragment; Go + node-run UI tests.

Refs #12532 #12541 #12501 #12498 #12521

Signed-off-by: Andy Anderson <andy@clubanderson.com>

* 🌱 nous cards: token-based warning tint, FAQ link, lower style ratchet baselines

- .nous-conflict-warn uses color-mix on var(--yellow) instead of a raw rgba
- FAQ links the Experiment Lab section of dashboard-sections.md (no
  old-name path in static copy, TestStaticNoStrategyLabCopy)
- lower webstatic style ratchet baselines to the current counts

Signed-off-by: Andy Anderson <andy@clubanderson.com>

---------

Signed-off-by: Andy Anderson <andy@clubanderson.com>
The unlabelled quadrant kite drew a gold polygon with no indication of
which axis was which. Unlabelled kites of a legible size (the 78px Fleet
quadrant header) now get a tiny muted monospace letter just outside each
tip, clockwise from north T, P, S, E β€” matching the TRUST / PROD / SATIS /
EFFIC tile order β€” each with a <title> carrying the full axis name. The
22px table kite stays bare and relies on its hover panel.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
… 668 (#12552)

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
gh-wrapper's pr edit fall-through, pr merge and pr comment arms stamped
agent/<lane> + hive/<id> onto any PR the agent touched. A review-fix kick
(review.fix_human_prs) running 'gh pr edit --body' on a contributor's PR
re-routed it to the scanner and claimed it for the hive (#12495).

- wrapper: _hive_owns_pr compares the PR author with the wrapper's own
  identity (trusted bot login / gh api user); mismatch or unknown β†’ no
  labels, the operation still goes through. Issue arms unchanged.
- stage reconciler: strips stray agent/* and hive/<HiveID> from open PRs
  the App did not author; StageLabelPolicy.HiveID wired from config.
- tests in bin/test_gh_wrapper_gates.sh and automerge_stage_labels_test.go
- docs: labels-and-control-signals.md

Closes #12545

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
#12547)

Nothing read the label as a signal, but every agent write re-applied it, so
it crowded the label bar on every item a hive touched.

- bin/gh-wrapper.sh stops adding hive/<id> (and stops creating the label
  definition); the identity footer now ends with
  <!-- hive:origin hive=<id> at=… --> so the origin is still machine-readable
- github.OriginMarker/ParseOriginMarker/OriginHive read the marker with a
  fallback to a leftover label during migration
- runtime-error self-reports and the hub self-report relay no longer add
  hive/<slug>; the seen marker and the Affected-hives block name the hive
- Client.RetireHiveIDLabels runs at boot until clean: strips the label from
  open items, deletes the definition once nothing open carries it, writes
  /data/hive-id-label-retire-<hive-id>.json and audits each strip
- attribution footer regex accepts the trailing marker
- docs: labels-and-control-signals.md marks the label retired and points at
  the marker; dashboard/fleet-report/operator docs updated

Closes #12539

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
…s, collapsible list (#12554)

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
…2423)

* πŸ› fix: tolerate legacy snapshot URL suffixes at config load

Keep dashboard writes strict while warning on legacy query or fragment values during config validation. Preserve legacy URL semantics and retain scheme, host, and credentials checks.

Hive-Run: #12420
Hive-Plan: legacy-snapshot-url-load-compatibility
Hive-Spec: #12420#load-time-compatibility
Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* πŸ“ docs: describe snapshot_url load-time tolerance; redact URL in errors

- operator-reference: hub.snapshot_url row now distinguishes the
  load-time warn-and-preserve path for legacy query/fragment values
  from the dashboard 400.
- changelog: drop "on config load and" from the #12356 fragment so the
  unreleased notes no longer contradict #12420.
- config: snapshot URL validation errors redact query/fragment and
  userinfo (and unwrap *url.Error, which embeds the raw URL).
- test: reuse captureLog helper; add redaction coverage.

Hive-Fix-Attempt: 1/6
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>

* πŸ“– docs: clarify snapshot URL validation on both paths

Signed-off-by: mendezr <mendezr@users.noreply.github.com>

---------

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…id> label (#12563)

#12549 added three assertions expecting --add-label agent/<lane>,hive/<id>;
#12547 merged 11 seconds later and retired hive/<id> from LABELS_CSV. v5 has
failed build-and-test on every PR since bec8c14. The wrapper behaviour is the
intended one, so only the expectations change.

Closes #12562

Signed-off-by: quality <quality@hive.kubestellar.io>
Co-authored-by: quality <quality@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…periment Lab (#12566)

The hive designs no proposals itself; proposals, ledger rows and principles come only from the external experiment loop writing /var/run/nous/governor/*. GET /api/nous/status now reports an experimentLoop block, and a ready card in suggest/evolve mode says the loop is not running when nothing was written there for NousLoopIdleCycles (24) evaluation cycles, with a docs link. strategy-lab.md documents the component, the file contract and what deployment the repository does and does not cover.

Refs #12541

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ated_at (#12565)

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Batch successful local ingestions per run or across a daily window. Retry failed batches on empty synthesis cycles without affecting the local vault. Leave repository writes disabled until the publisher core supplies its filtering and policy boundary.

Hive-Run: #12449
Hive-Plan: issue-12449/cadence
Hive-Spec: issue-12449#daily-cadence

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
* ✨ feat: configure bead-synth repository publishing

Add a separate disabled-by-default publish block and expose it through the owner-only knowledge pipeline API. Validate repository paths and mode/cadence enums without enabling any publishing behavior.

Hive-Run: #12447
Hive-Plan: #12443 config and API
Hive-Spec: #12447#acceptance
Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* πŸ› fix: omit empty bead-synth publishing and track settings gaps

Signed-off-by: mendezr <mendezr@users.noreply.github.com>

---------

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
#12558)

* πŸ› stage labels: any red check on the head is 070/072, never 080 or 100

Follow-up to #12540 (merged), which held a PR with a red non-required
check at stage/080-awaiting-merge-admission. Operator expectation on
#12457 and #12423: a red check on the head is red CI to a
reader, so the repair stage applies whatever the lane's reason (soaking,
merge-failed, pending, no-verdict, a transient error) β€” never 080 or 100.
The nudge lists every red optional check on the head. Parking modifiers
(hold, needs-human, admission) still take precedence.

Trace: both PRs were labelled 100 by the contributor lane's
contributor-lane:soaking(...) reason (required checks green, the failing
'relative links and anchors resolve' check is not required on v5), then
flapped to 060 via the min_head_age/updated_at bug (#12491, fixed by #12500,
not yet deployed). Only the three API-merging lanes (self-authored,
trusted-author, contributor) record stages; tide's 'needs lgtm' status is
not on their path, so lane admission (soaking) is the enqueue 100 names.

Closes #12538

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* πŸ› stage labels: a red required check keeps the lane's own reason

A red optional check on the head maps to the repair stage only after the
lane's own red-CI reason (required-check-failing:*) has had its say, so
the recorded reason names the required failure first.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

---------

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
Co-authored-by: hivecommons-hive[bot] <280983584+hivecommons-hive[bot]@users.noreply.github.com>
…<id> label retirement (#12564)

#12549 added gate tests pinning the injected label set as
agent/<lane>,hive/<id>; #12547 retired the hive/<id> label in the same window,
so build-and-test on v5 went red at the pr edit / pr merge / issue edit
assertions. The wrapper is correct; the expectations now name agent/<lane>
alone.

Refs #12539, #12545

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
Signed-off-by: ci-maintainer <ci-maintainer@hive.kubestellar.io>
Co-authored-by: ci-maintainer <ci-maintainer@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* πŸ› fix: preserve synthesized knowledge in spoke backups

Implement the independent backup portion of #12443 without enabling repository writes. Preserve only flat markdown facts in the reserved default vault and restore them owner-only.

Hive-Run: #12443
Hive-Plan: #12451 backup follow-through (partial)
Hive-Spec: #12443#acceptance-criteria-backup
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>
Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* πŸ› fix: restore bead-synth facts at the synthesizer's mode; refresh backup docs

Review follow-ups for #12495:
- Archive and restore vaults/bead-synth-wiki/*.md at 0644, matching what
  knowledge.BeadSynthesizer writes. The entrypoint re-applies no ownership
  under vaults/, so an owner-only restore from a different uid left facts
  unreadable to the synthesizer and reindex. Test asserts the aligned mode.
- move-cross-runtime.md: include the vault in the spoke-archive file set.
- knowledge-curator.md: note at vault_path that only the default path is
  included in spoke backups; backup-restore.md cross-references it.
- restore.go header and bead_synth.go document the default-path-only scope.

Hive-Fix-Attempt: 1/6
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>

* πŸ“ docs: complete bead-synth backup mapping; umask-tolerant restore-mode test

Review follow-ups for #12495:
- Add bead-synth-wiki/ to the extract/restore comparison table and to the
  Docker Compose archive-contents sentence in backup-restore.md.
- Colocate the bead-synth archive prefix with spokePrefix/beadsPrefix in
  the archive-layout block and name the on-disk vaults/ segment once.
- Compare the restored fact mode against a same-mode os.WriteFile probe so
  the assertion holds under any process umask, not only 022.

Hive-Fix-Attempt: 2/6
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>

---------

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
…#12569)

* feat(dashboard): settings UI for publishing bead-synth facts to a repo

Signed-off-by: scanner <scanner@hive.kubestellar.io>

* fix: drop bead-synth publish keys from settings parity allowlist

The Settings UI now references every knowledge.bead_synthesizer.publish.*
leaf, so TestSettingsDialogReferencesEveryHiveYAMLLeaf rejects the stale
allowlist entries.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>

---------

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…12531)

* ✨ labels: stage/090-ready-for-human-merge + stage/085-needs-decision

Fold the merge recommendation into the stage state machine instead of a
new recommend/* axis (operator: "maybe make the recommendation a stage
instead?").

- Rename stage/090-needs-human β†’ stage/090-ready-for-human-merge; the
  engine renames the GitHub label in place so PRs keep it.
- New stage/085-needs-decision for hand-offs that need a human decision
  (sentinel-alert, hold / do-not-merge* / needs-decision, no reviewer,
  non-trust human-only lane rules).
- stagelabels.RouteHuman refines every human hand-off against the head's
  evidence: fix evidence (changes_requested / red checks / DCO no /
  conflicts) β†’ 072 (070 self-authored) with the reasons in the nudge; no
  current-head verdict β†’ 050; decision causes β†’ 085; checks pending or
  soak remaining β†’ 060; else 090.
- One deduped entry comment per 085/090 visit; never a GitHub review.
- Leaving 085/090 is not a regression.
- Check digest (SummarizeCommitChecks) cached per head for 10m.

Closes #12528

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* 🌱 stage human tests: match classifyStage needs-rebase path and nudge ask order

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* 🌱 stage tests: persist before reload; sentinel-blocked resolves to 085

Signed-off-by: Andrew Anderson <andy@clubanderson.com>

* πŸ› stage labels: parked hold outranks a red optional check as 085, not 090-needs-human

The v5 merge brought in #12558's red-optional-check test, which asserted
`label:hold` lands at the retired stage/090-needs-human; on this branch a
hold is a decision cause routed through the human path (085-needs-decision).

Hive-Fix-Attempt: 1/6
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: ci-maintainer <ci-maintainer@hive.kubestellar.io>

---------

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
Signed-off-by: ci-maintainer <ci-maintainer@hive.kubestellar.io>
Co-authored-by: hivecommons-hive[bot] <280983584+hivecommons-hive[bot]@users.noreply.github.com>
Co-authored-by: ci-maintainer <ci-maintainer@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… (split drain flapped maintainer PRs to 090) (#12574)

Two sweep drivers (the engine ticker and the main loop's queued sweep)
share one stage tracker and each drains it in ApplyStageLabels. A drain
that lands mid-sweep splits a PR's observations: the next drain holds only
the contributor lane's no-claim for a maintainer the trusted-author lane
had admitted, so the PR was written to stage/090 and flipped back with
stage/regressed a minute later. A weak opinion is now skipped until every
lane enabled for the repo is in the same drain.

Closes #12573

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
…outing (#12589)

Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…starts on a merged PR (#12591)

Hive's automerge regularly evaluates and merges a PR before the swarm
review writes its bundle (pod log on hive's hive: 23 'no bundle for merged
PR' vs 20 'merge recorded' in five hours). The bundle written minutes later
never gained a merge record, so the PR read as outcome unknown (or, before
the unknown bucket, as a false approve). upsertReviewEvidence now records
actor, merged_at, merge SHA and opened time from the PR it already fetched
when starting a bundle. Record-only: nothing reads it to decide a merge.

Signed-off-by: Andy Anderson <andy@clubanderson.com>
actions-user and others added 11 commits October 17, 2026 14:12
Automated release commit. Compiles changelog.d/ fragments and moves
the CHANGELOG.md Unreleased section into a dated v5.182.0 entry.
See src/docs/releases.md.

Signed-off-by: hive-release-bot <actions@github.com>
Reset the process-wide lifecycle timeline before the inception-only fixture. Shuffled CI retained a completed graph-a:node-a run from an earlier test, causing the strict single-campaign assertion to fail despite the active campaign being present.

Hive-Run: #12729
Hive-Plan: isolate-campaign-delete-fixture
Hive-Spec: ci-flake#TestCampaignDeleteClearsActiveInceptionState

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
* πŸ› fix: isolate Git source validation tests from DNS

Use the existing resolver seam in URL, public-host, and branch-validation unit tests so transient external DNS failures cannot fail CI. Keep production SSRF validation unchanged.

Hive-Run: #12732
Hive-Plan: deterministic-git-source-validation-tests
Hive-Spec: issue-12732#eliminate-dns-flake
Signed-off-by: Karibhou <157208370+Karibhou@users.noreply.github.com>

* πŸ› test: fail closed on unexpected Git source lookups

Return resolver errors instead of failing a parent test from a subtest. Declare public hosts at each call site and cover the unregistered-host path.

Hive-Run: #12732
Hive-Plan: deterministic-git-source-validation-tests
Hive-Spec: issue-12732#eliminate-dns-flake
Signed-off-by: Karibhou <157208370+Karibhou@users.noreply.github.com>

---------

Signed-off-by: Karibhou <157208370+Karibhou@users.noreply.github.com>
Recognize the missing cel-go cache file from run 39036933822 as infrastructure so the existing one-time rerun and rate reporting can handle it. Keep missing repository files classified as code failures.

Hive-Run: #12746
Hive-Plan: classify-observed-module-cache-failure
Hive-Spec: issue-12746#ci-failure

Signed-off-by: Karibhou <157208370+Karibhou@users.noreply.github.com>
Apply the publishable-content boundary to all 20 PR-capable policy pairs and require the rule in the existing regression test.

Hive-Run: #12725
Hive-Plan: proposed-fix-policy-cross-repo-citations
Hive-Spec: issue-12725#proposed-fix

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: Danathar <6772335+Danathar@users.noreply.github.com>
…12471)

* ✨ hub: explain evidence-driven Fleet quadrant scores

Replace relative percentile ranks with fixed reference curves, scored-hive medians and explicit criterion coverage. Prefer hive audit throughput, normalize cost ratios to daily merge rates, and expose accessible per-axis explanations without changing merge decisions.

Co-authored-by: clubanderson <407614+clubanderson@users.noreply.github.com>

Hive-Run: #12458
Hive-Plan: issue-12458/one-pr
Hive-Spec: issue-12458#plan-1-3
Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* πŸ› fix: use a font token and retain tightened style ratchet

Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* fix(quadrant): require observed agents for a zero idle score

Signed-off-by: mendezr <mendezr@users.noreply.github.com>

---------

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
* ✨ nous: deliver opt-in Hive-self flags over heartbeat

Add a per-hive assignment/revert seam and a default-off runtime gate, isolated from repo experiments and governor configuration. Apply verified heartbeat assignments as replacements so explicit reverts and withdrawals take effect on the next beat.

Hive-Run: #12396
Hive-Plan: heartbeat-feature-flag-gate
Hive-Spec: issue-12396#acceptance
Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* πŸ“– Refresh route citations after feature gate wiring

Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* πŸ“– docs: refresh route citations after base merge

Signed-off-by: mendezr <mendezr@users.noreply.github.com>

* docs: document HIVE_SELF_EXPERIMENTS_OPT_IN in env-vars reference

Hive-Fix-Attempt: 1/6

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: RaΓΊl MΓ©ndez <18744521+mendezr@users.noreply.github.com>

* docs(heartbeat): clarify self-experiment wire semantics and validation order

Signed-off-by: mendezr <mendezr@users.noreply.github.com>

---------

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Signed-off-by: RaΓΊl MΓ©ndez <18744521+mendezr@users.noreply.github.com>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: architect <architect@hive.kubestellar.io>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
Emit bounded author-kind merged/reverted counters from spokes and pool them in the owner evidence drill-down. Exclude follow-up fixes and preserve unknown data for older spokes. Add aggregation, sanitization, wire and renderer coverage.

Hive-Run: #12326
Hive-Plan: author-kind revert dataset
Hive-Spec: RFC-12062#evidence-author-kind

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Signed-off-by: scanner <scanner@hive.kubestellar.io>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: scanner <scanner@hive.kubestellar.io>
…2741)

Document the proposed consent variable without presenting the unmerged delivery seam as available on v5. Separate heartbeat feature flags from deferred image-channel switching and qualify scheduler auto-revert expectations.

Hive-Run: #12672
Hive-Plan: operator-guide-currency
Hive-Spec: issue-12672#opt-in-and-release-channel-boundary

Signed-off-by: mendezr <mendezr@users.noreply.github.com>
Co-authored-by: mendezr <mendezr@users.noreply.github.com>
Merge origin/v5 (ca55172..d786b89, 445ef0b…d786b8999) into v6.

79 conflicts resolved preferring v5 except where it would clobber a
v6-only feature (split config files, kick-after-publish, nousstore,
your-turn/ownership model, revise-in-place campaigns, no Nous output
mode, observe-after-write label mutations, configured parking labels).
Post-merge test/doc adaptations for the union are included; see the PR
body for the full table.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
@kubestellar-prow kubestellar-prow Bot added the dco-signoff: yes Indicates the PR's author has signed the DCO. label Oct 17, 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 clubanderson 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/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Oct 17, 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 author/human A person pushed this PR themselves 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 and removed dco-signoff: yes Indicates the PR's author has signed the DCO. labels Oct 17, 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.

Mechanical verification of the forward-merge at 9a6e342. I could not read 42k lines semantically, so this is what I checked by recomputing the merge, not by reading the diff.

Merge shape matches the body

  • Parents are 1f4a41f (v6) and d786b89 (v5); git merge-base is ca5517229 as stated. git rev-list shows every v5 commit up to d786b89 and every v6 commit up to 1f4a41f is contained. Since the head was cut, origin/v5 has moved by 14 commits and origin/v6 by 1 β€” normal for a top-up, but means another top-up will follow this one.
  • No stray <<<<<<</>>>>>>> markers anywhere in the PR tree (git grep over src/, .github/).

Conflict resolution vs. a fresh automerge (git merge-tree --write-tree -X patience 1f4a41f d786b89)

  • The PR tree differs from the automerge in 104 files. Every difference is either a resolved conflict or a re-homing forced by v6's split of pkg/config/config.go into dashboard_config.go / governor_config.go / hub_config.go / review_config.go / defaults.go / validate.go β€” v5 added fields to the monolithic file and they were moved into the split files.
  • One genuine post-merge compile fix, which I confirmed is correct: v5 added Client.CommitFilesOnBranch(..., files map[string]string) in src/pkg/github/branch_files.go:77, while v6 already had Client.CommitFilesOnBranch(..., files []ArtifactFile) in src/pkg/github/artifact_commit.go:88. The PR renames the v5 method to CommitTextFilesOnBranch and updates the only caller at src/cmd/hive/boot_bead_synth_publish.go:123. The v6 artifact path is untouched.

Trust surfaces (why this is routed to a human rather than confirmed)

  • .github/workflows/v2-ci.yml, src/Dockerfile, src/Dockerfile.contributor and .oss-scanner/Dockerfile were not in the conflict set; the PR's copies are byte-identical to the automerge result, i.e. pure carries of v5 changes that already landed there via reviewed PRs.
  • SECURITY.md and src/deploy/test_entrypoint_runtime_config.sh are byte-identical to v5 d786b89.
  • 36 policy files (src/pkg/policies/defaults/*.md and their src/policies/*.md mirrors) and src/pkg/proxy/github_proxy.go were hand-resolved conflicts. I did not read those resolutions line by line; source_sync_test.go and content_boundary_test.go pass in CI, which covers the defaults↔mirror sync but not the semantic merge of each policy.

CI: all test shards, coverage, golangci-lint, gosec, govulncheck, docker builds and release-line checks are green at this head; build (linux/arm64) was still running and probot DCO is action_required as it always is on forward-merges carrying others' commits.

β€” hive: agent=reviewer backend=copilot model=claude-fable-5.1 copilot=1.0.88

@hivecommons-hive
hivecommons-hive Bot merged commit ffead12 into v6 Oct 17, 2026
83 of 85 checks passed
@kubestellar-prow
kubestellar-prow Bot deleted the topup/v5-into-v6-20261017 branch October 17, 2026 16:41
@hivecommons-hive

Copy link
Copy Markdown
Contributor
Evidence bundle `#127839a6e342` sha256:7681f8a8ac91492fae603e18b0da4202449e88b6e9fac5510a761ea748356911 β€” download from the dashboard or `hivectl review evidence #12783`.

@hivecommons-hive

Copy link
Copy Markdown
Contributor

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

@github-actions

Copy link
Copy Markdown
Contributor

Thank you for your contribution! Your PR has been merged.

We'd love to hear how your experience was: share feedback

@hivecommons-hive hivecommons-hive Bot removed 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 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author/human A person pushed this PR themselves dco All commits are DCO signed-off size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants