Skip to content

[architect] refactor(store): decompose monolithic Store interface into 7 domain sub-interfaces#16453

Closed
clubanderson wants to merge 7420 commits into
mainfrom
architect/store-isp-sub-interfaces
Closed

[architect] refactor(store): decompose monolithic Store interface into 7 domain sub-interfaces#16453
clubanderson wants to merge 7420 commits into
mainfrom
architect/store-isp-sub-interfaces

Conversation

@clubanderson

Copy link
Copy Markdown
Collaborator

Summary

Decomposes the monolithic pkg/store.Store interface (102 methods across 20 unrelated domains) into 7 domain-aligned sub-interfaces, then makes Store embed them all.

Closes/addresses #16425.


Problem

store.Store is a fat interface with 102 methods covering: users, dashboards, cards, pending swaps, events, feature requests, PR feedback, notifications, GPU reservations, GPU utilization snapshots, token revocation, rewards, token usage, OAuth credentials, OAuth state, audit logs, cluster groups, KB gaps, and cluster events.

Any handler or service that needs one method must mock/stub all 102. This is the primary testability bottleneck in the codebase — every handler test that uses a fake store must either implement 102 stubs or accept a concrete *SQLiteStore in tests.


Change

pkg/store/store.gostructural only, no behaviour changes:

Sub-interface Domain Methods
UserStore User accounts + onboarding 13
DashboardStore Dashboards, cards, card history, pending swaps 24
GPUStore GPU reservations + utilization snapshots 15
AuthStore Token revocation + OAuth lifecycle 8
RewardsStore Gamification balances + token-usage counters 7
ContentStore Feature requests, PR feedback, notifications, events 23
InfraStore Audit logs, cluster groups, KB gaps, cluster events 10

Store is rewritten to embed all 7 sub-interfaces + WithTransaction + Close.

WithTransaction and Close remain at the Store level because they are cross-cutting infrastructure concerns, not domain capabilities.


Compatibility guarantee

  • Zero implementation changes — no sqlite_*.go files are touched.
  • Zero caller changes — every existing callsite that accepts store.Store compiles unchanged because Store still exposes the identical 102-method set.
  • SQLiteStore satisfies all interfaces — enforced by compile-time assertions added to store.go:
    var (
        _ Store          = (*SQLiteStore)(nil)
        _ UserStore      = (*SQLiteStore)(nil)
        _ DashboardStore = (*SQLiteStore)(nil)
        _ GPUStore       = (*SQLiteStore)(nil)
        _ AuthStore      = (*SQLiteStore)(nil)
        _ RewardsStore   = (*SQLiteStore)(nil)
        _ ContentStore   = (*SQLiteStore)(nil)
        _ InfraStore     = (*SQLiteStore)(nil)
    )
    If any method is missing from any sub-interface the build fails immediately.

Migration path (next steps, not in this PR)

Once merged, new handlers can be narrowed:

// Before
func NewGPUHandler(store store.Store) *GPUHandler { ... }

// After
func NewGPUHandler(store store.GPUStore) *GPUHandler { ... }

This PR establishes the interfaces; narrowing individual callers is incremental follow-up work.


⚠️ hold — Architect-generated PR. Do not merge until human review confirms the interface decomposition is correct and no mock implementations in tests are broken.

Filed by architect agent (ACMM L5 — hold-gated mode)

kubestellar-hive Bot and others added 30 commits May 27, 2026 18:36
Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ActiveAlerts: Guard stats.firing check and use optional chaining for stats.critical/warning/acknowledged
- AlertRules: Guard rules.filter() and rule.channels.map() with array safety pattern (data || [])

Fixes #15867
Fixes #15868

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…es (#15881)

Fixes #15865
Fixes #15866

Adds array safety guards to prevent crashes when API returns undefined/null data on:
- Pods page: podIssues.length, clusters.filter()
- Nodes page: clusters.filter()
- Helm Releases page: clusters.filter()
- Services page: clusters.filter(), services.filter()
- Deployments page: deployments.filter(), deploymentIssues.filter(), podIssues.filter()

All array operations now use (data || []) pattern to safely handle undefined/null values.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Guards gpuNodes array with (gpuNodes || []) before calling .forEach() to prevent TypeError when GPU data is undefined. This allows the ClusterCosts card to gracefully handle GPU API failures and continue showing CPU/memory cost data.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Restores zoom UI (10 levels: 15%-150%) with localStorage persistence
and a popout-to-new-window button. Uses CSS `transform: scale()`
instead of `font-size: %` to bypass browser minimum font-size
clamping that previously made the smallest zoom levels (15/20/25/35%)
visually indistinguishable.

Popout URL switched from hardcoded `http://localhost:30500/...` to
the relative proxy path so it works on the hosted site.

Adds a visual regression test that captures the circuit at 100%,
25%, and 15% to catch the clamping bug if it ever returns.

Signed-off-by: Kevin Roche <kproche@us.ibm.com>
pok-prod was failing with "Progress deadline exceeded" after 10 minutes even though the Helm deploy step waited longer.

Make the Deployment progress deadline configurable and raise the chart default to 900 seconds so slower clusters do not fail before Helm's timeout window.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
)

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Revert the detection-phase fallback model to gpt-4.1 for stuck-detection, implement-fix, and auto-triage so threat detection does not fail with an unsupported model error.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#15891)

Add prompt-specific memory formatting for cluster AI prompts and cover the regression with tests.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Cover getStaleCacheMetaKeys (stale/fresh threshold, malformed JSON, missing\ntimestamp fields, boundary conditions, priority order of timestamp fields,\ninvalid values, localStorage throws) and useStaleCacheCleanup hook (runs\nonce on mount, calls safeRemoveItem for each stale key).\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add structured event emission (staleKeysFound, staleKeysRemoved,
oldestStaleAgeMs, cleanupDurationMs, timestamp) after each cleanup run.
No key names are included in emitted events per sec-check recommendation.

- New staleCacheEvents.ts module following backendHealthEvents pattern
- getStaleCacheMetaKeysWithAge helper tracks per-key age
- No event emitted when zero stale keys found (no noise)
- Event emitted even on partial cleanup (some removals fail)
- Comprehensive tests for all observability scenarios

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…) (#15894)

* 🐛 Address Copilot feedback on Quantum Circuit zoom (follow-up to #15884)

PR #15884 was merged before a fix-up commit could land. This restores
the 6 Copilot-flagged improvements as a follow-up.

- Guard localStorage with try/catch + isBrowser check (privacy modes,
  unavailable storage, future SSR safety) via readPersistedZoom /
  writePersistedZoom helpers
- Validate + snap persisted zoom values to the nearest entry in
  CIRCUIT_ZOOM_LEVELS_PCT, rejecting non-finite or non-positive values
  from corrupted storage
- Add type="button" to all <button> elements so they never default to
  submit if rendered inside a <form>
- Reserve scrollable layout space matching the scaled circuit by
  measuring the unscaled <pre> with useLayoutEffect and sizing the
  wrapper to naturalSize * zoomFactor; <pre> is positioned absolutely
  with transform: scale(). Scrollbars now match visible content at
  every zoom level. (Avoids reverting to font-size: % which would
  re-introduce browser minimum-font-size clamping.)
- Visual test: clear localStorage in addInitScript so the 100%
  baseline is deterministic regardless of prior test state
- Visual test: fix stale "eight" comment that should have read "ten"

Signed-off-by: Kevin Roche <kproche@us.ibm.com>

* 🐛 Address Copilot review on PR #15894

- Export CIRCUIT_ZOOM_STORAGE_KEY and import it in the visual test so the
  storage key isn't duplicated as a string literal (test would silently
  clear the wrong key if the constant ever changed).
- Hide the circuit wrapper with visibility:hidden until useLayoutEffect
  records the natural size, eliminating the one-frame flash where the
  unscaled <pre> rendered before the wrapper had dimensions.

The third comment (p-4 padding scaling) is intentional — offsetWidth
already includes the unscaled padding, so scaledWidth = (content + p-4)
× zoom matches what's actually painted. No double-counting; reply on PR.

Signed-off-by: Kevin Roche <kproche@us.ibm.com>

* 🐛 Move CIRCUIT_ZOOM_STORAGE_KEY to a leaf module so the visual test runs

Importing from QuantumCircuitViewer.tsx pulled the app-level logger into
Playwright's Node runtime and threw `Cannot read properties of undefined
(reading 'DEV')` from `import.meta.env.DEV` before any test could execute.

Splitting the constant into QuantumCircuitViewer.constants.ts gives the
e2e test a dependency-free import target, and the component re-imports
the same constant so the source of truth is preserved.

CI generates the snapshot baselines itself in the "Generate baseline
snapshots" step when none exist, so no PNGs need to be committed.

Signed-off-by: Kevin Roche <kproche@us.ibm.com>

---------

Signed-off-by: Kevin Roche <kproche@us.ibm.com>
#15901)

* 🐛 Guard deployment replica values against undefined in diagnose prompt

When deployment data hasn't fully loaded, readyReplicas and replicas can be undefined, causing "undefined/undefined ready" in AI diagnose/repair prompts. Use nullish coalescing to default to 0.

Fixes #15899

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

* 🌱 Add Vitest unit tests for diagnose prompt replica counts

Add comprehensive tests verifying deployment replica values are never
'undefined' or 'null' in AI diagnose/repair prompts. Covers:
- Normal replica counts
- Both replicas undefined (bug case from #15899)
- Partially undefined replicas
- Null values
- Zero replicas (healthy zero state)
- Large replica counts
- Empty deployment issues array
- Repair prompt with undefined replicas

Also applies the nullish coalescing fix (?? 0) from PR #15901 to guard
against runtime undefined values.

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

---------

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace incorrect page redirect with an inline workload import modal so the Workloads page opens a creation flow instead of bouncing back to Deploy.

Imported workloads are added to the local workloads list so the new flow has visible in-page feedback.

Signed-off-by: kubestellar-hive[bot] <kubestellar-hive[bot]@users.noreply.github.com>
Co-authored-by: kubestellar-hive[bot] <kubestellar-hive[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…mode (#15909)

Only show demo namespaces when in demo mode. When connected to a live cluster, fetch namespaces exclusively from the cluster API without mixing in demo data.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Implement retry logic with exponential backoff and jitter when
/api/workloads/resolve-deps returns HTTP 429. Adds max retry limit,
Retry-After header support, AbortController cleanup, and user-facing
error messaging after retries are exhausted.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* 🌱 Add Vitest unit tests for diagnose prompt builder

Assert deployment replica counts are never undefined/null
in generated prompts. Covers normal, edge, and error cases.

Signed-off-by: kubestellar-hive[bot] <kubestellar-hive[bot]@users.noreply.github.com>

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

* 🌱 Retrigger CI (infra timeout on Docker cache upload)

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* 🐛 Sanitize user input in AI mission prompt builder

Strip HTML tags and limit length of user-provided search input before interpolating into AI mission prompts and dialog titles. Prevents XSS and prompt injection via crafted search queries.

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

* 🌱 Retrigger CI (infra timeout on Docker cache upload)

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Update Workloads component tests and cached data hook tests to align with the namespace demo-data hiding changes from PR #15909. Fixes mock return values and assertions to match the new hook behavior.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* 🐛 Fix deploy page critical issues badge inconsistency (#15906)

The header badge on the Deployments page used the global
DashboardHealthIndicator, which derives its count from usePodIssues via
useDashboardHealth. The stats cards and Deployment Issues card both
derive their counts from useCachedDeploymentIssues filtered by the
global cluster selection. These are two completely different data
sources, causing the badge to display stale or unrelated issue counts
(e.g. '2 critical issues' while stats showed Failed: 0, Healthy: 1).

Fix: pass a deployment-specific afterTitle badge to DashboardPage that
reads from the same issueCount (filteredDeploymentIssues.length) already
used by the stats blocks. This ensures the badge, stats cards, and
Deployment Issues card all reflect the same underlying data.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>

* 🌱 Add test coverage for deploy badge fix

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

---------

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Apply sanitizeForPrompt() centrally inside buildEnhancedPrompt() on
params.initialPrompt and cluster names before they are interpolated
into prompt strings. This ensures ALL mission entry points (SearchDropdown,
InlineAIAssist, ConfirmMissionPromptDialog, drill-down views) are
protected against prompt injection regardless of whether the caller
remembered to sanitize.

Also sanitizes the content string used for resolution matching to
prevent injection via title/description fields.

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Passed: 30/32
Failed: 2

[skip ci]
Fixes #15927

When resolution matching succeeds, the code was replacing the sanitized enhancedPrompt with raw params.initialPrompt, bypassing sanitizeForPrompt. Use enhancedPrompt instead.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* 🐛 Fix sanitizeForPrompt bypass in buildEnhancedPrompt

When resolution matching succeeds, the code was replacing the sanitized
enhancedPrompt with raw params.initialPrompt, bypassing sanitization.
Use the already-sanitized enhancedPrompt variable instead.

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

* 🌱 Add test for sanitizeForPrompt bypass in resolution matching (#15927)

Verifies that angle brackets in initialPrompt are stripped even when
the resolution-matching branch triggers, preventing prompt injection.

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

* 🌱 Add regression test for sanitizeForPrompt bypass (#15927)

Verifies that buildEnhancedPrompt preserves sanitization when resolution
matching triggers, preventing the raw initialPrompt from bypassing the
sanitizeForPrompt call.

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

---------

Signed-off-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@netlify

netlify Bot commented Jun 2, 2026

Copy link
Copy Markdown

Deploy Preview for kubestellarconsole canceled.

Name Link
🔨 Latest commit 16acf14
🔍 Latest deploy log https://app.netlify.com/projects/kubestellarconsole/deploys/6a1efa4f4b9b3b000841cedf

@kubestellar-prow kubestellar-prow Bot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Jun 2, 2026
@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

👋 Hey @clubanderson — thanks for opening this PR!

🤖 This project is developed exclusively using AI coding assistants.

Please do not attempt to code anything for this project manually.
All contributions should be authored using an AI coding tool such as:

This ensures consistency in code style, architecture patterns, test coverage,
and commit quality across the entire codebase.


This is an automated message.

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

🐝 Hi @clubanderson! I'm kubestellar-hive[bot], an automation bot for this repo.

Trusted users — org members and contributors with write access — can mention @kubestellar-hive in a comment to trigger repo automation.
On issues, that mention queues an automated fix attempt. On pull requests, it records extra context for existing automation.
This is not an interactive Q&A bot, so mentions should be treated as requests for automation rather than a conversation.

Automation may take a moment to start, and follow-up happens through workflow activity rather than chat replies.

@github-actions github-actions Bot added the ai-generated Pull request generated by AI label Jun 2, 2026

Copilot AI 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.

Pull request overview

Refactors the backend persistence contract by decomposing the previously monolithic pkg/store.Store interface into seven domain-focused sub-interfaces, with Store now embedding those sub-interfaces while retaining cross-cutting lifecycle/transaction methods.

Changes:

  • Introduces UserStore, DashboardStore, GPUStore, AuthStore, RewardsStore, ContentStore, and InfraStore interfaces grouping related persistence methods.
  • Rewrites Store to embed the seven sub-interfaces, keeping WithTransaction and Close at the top level.
  • Adds compile-time assertions ensuring *SQLiteStore satisfies Store and each sub-interface.

Comment thread pkg/store/store.go
Comment on lines +607 to +609
// WithTransaction runs fn inside a database transaction. Rollback is
// automatic on fn error; callers must not call Rollback themselves.
WithTransaction(ctx context.Context, fn func(tx *sql.Tx) error) error
@github-actions github-actions Bot added the ai-needs-human AI automation unavailable - needs human intervention label Jun 4, 2026
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Status Check

This PR has been idle for 49+ hours with no activity.

Current state: hold · mergeable_state: dirty (needs rebase) · checks passing

Findings

  • Unresolved review thread: The Copilot reviewer suggested clarifying the WithTransaction doc comment to warn callers against calling Commit within fn (not just Rollback) to prevent double-commit errors. Comment is 49h old and unaddressed.
  • Branch needs rebase against main before it can merge.
  • No human has approved or acted on this PR since creation.

Recommended Next Steps

A human maintainer should:

  1. Review the PR and confirm the interface decomposition is correct.
  2. Check that no mock implementations in tests are broken.
  3. Address or dismiss the review comment about WithTransaction doc.
  4. Rebase and merge (or close) as appropriate.

Generated by Stuck Detection Workflow · sonnet46 1.8M ·

@kubestellar-prow kubestellar-prow Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jun 4, 2026
@kubestellar-prow

Copy link
Copy Markdown
Contributor

PR needs rebase.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Status Check

PR: #16453[architect] refactor(store): decompose monolithic Store interface into 7 domain sub-interfaces
Stuck since: ~2026-06-02 (5+ days, no human action)
Current state: hold · needs-rebase · DCO signoff missing · ai-needs-human

Findings

  • This large (size/L) architectural refactor has been open since June 2 with no human review.
  • Two blockers prevent merging: (1) branch needs rebase against main, (2) the single commit is missing a DCO Signed-off-by trailer.
  • No prior stuck-detection status comment has been posted on this PR.
  • The change decomposes a 102-method monolithic Store interface into 7 domain-aligned sub-interfaces (users, dashboards, cards, events, GPU, etc.), addressing #16425.

Recommended Next Steps

  1. A human maintainer should evaluate whether this architectural change aligns with current priorities.
  2. The branch needs a rebase and the commit needs a DCO signoff (git commit --amend -s) before it can merge.
  3. If the design is acceptable, address the two blockers, remove hold, and approve.
  4. If the design needs revision, leave specific review feedback on the PR.
  5. If the PR is not needed, close it with a note referencing the related issue.

Generated by Stuck Detection Workflow · sonnet46 1.6M ·

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Requires Human Intervention

PR: #16453[architect] refactor(store): decompose monolithic Store interface into domain sub-interfaces
Stuck since: 2026-06-02T15:44:16Z (3+ days idle)
Current state: hold · needs-rebase · missing DCO signoff · not approved

Findings

  • PR has been open for 3 days with no human review or follow-up action.
  • The branch needs a rebase against main before it can merge (needs-rebase label set).
  • DCO signoff is missing for commit 16acf14 — the DCO bot flagged this on creation.
  • All CI checks (builds, CodeQL, go tests, console smoke) are passing.
  • The hold label indicates a human maintainer must explicitly clear it before merging.
  • This is a large architectural refactoring (size/L) that decomposes the 102-method Store interface into 7 domain sub-interfaces.

Recommended Next Steps

  1. A human maintainer should review the Store interface decomposition for correctness and completeness.
  2. The author should add DCO signoff (git commit --amend -s) and rebase against main.
  3. Once reviewed and rebased, remove hold and needs-rebase labels if the changes are acceptable.
  4. If the PR is no longer needed or the approach has changed, close it with an explanation.

Generated by Stuck Detection Workflow · sonnet46 1.3M ·

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-05T12:04:58Z

Summary

Check Count
Issues with ai-processing stuck >2h 0
Issues with ai-awaiting-fix stuck >4h 0
Issues with ai-fix-requested+triage/accepted, no PR after 2h 0
Draft PRs stalled >1h 0
ai-generated PRs without escalation, stalled >2h 0

Previously Escalated PRs (already labeled ai-needs-human)

The following PRs are open and idle but have already been escalated (labels: ai-needs-human, hold). No new action taken per anti-spam policy:

Result

✅ No new stuck items detected. No labels or status comments were added this run.

Generated by Stuck Detection Workflow · sonnet46 923.3K ·

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-05T16:23:03Z

Summary

Check Count
Issues with ai-processing stuck >2h 0
Issues with ai-awaiting-fix stuck >4h 0
Issues with ai-fix-requested+triage/accepted, no PR after 2h 0
Draft PRs stalled >1h 0
ai-generated PRs without escalation, stalled >2h 0

Previously Escalated PRs (already labeled ai-needs-human)

The following PRs are open and idle but have already been escalated in prior runs. No new action taken per anti-spam policy:

PR Title Last Updated Blockers
#16453 refactor(store): decompose monolithic Store interface 2026-06-05T12:07Z needs-rebase, DCO missing, hold
#16452 fix: use %q to safely quote cluster context in AI provider 2026-06-05T05:42Z needs-rebase, hold
#16451 planning: CNCF adopter conversion strategy 2026-06-04T20:24Z hold
#16438 fix: make check-vendor-safety.mjs chunk-name-agnostic 2026-06-04T23:02Z needs-rebase, hold

All four PRs remain idle with no human action since creation (June 2). Each has been escalated with ai-needs-human and detailed status comments — no further automated action is available until a human maintainer reviews.

Result

✅ No new stuck items detected. No new labels or status comments added this run.

Generated by Stuck Detection Workflow · sonnet46 1.3M ·

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-05T20:12:32Z

Summary

Check Count
Issues with ai-processing stuck >2h 0
Issues with ai-awaiting-fix stuck >4h 0
Issues with ai-fix-requested+triage/accepted, no PR after 2h 0
Draft PRs stalled >1h 0
ai-generated PRs with failing checks needing attention 0

Active Items (not stuck yet)

Previously Escalated PRs (already labeled ai-needs-human)

The following PRs remain idle with no human action. All have been fully escalated in prior runs with detailed status comments. No new action taken per anti-spam policy:

PR Title Last Updated Blockers
#16453 refactor(store): decompose monolithic Store interface 2026-06-05T16:26Z needs-rebase, DCO missing, hold
#16452 fix: use %q to safely quote cluster context 2026-06-05T05:42Z needs-rebase, hold
#16451 planning: CNCF adopter conversion strategy 2026-06-04T20:24Z hold
#16438 fix: make check-vendor-safety.mjs chunk-name-agnostic 2026-06-04T23:02Z needs-rebase, hold

All four PRs are blocked on human review. No automated recovery is available.

Result

✅ No new stuck items detected. No new labels or status comments added this run.

Generated by Stuck Detection Workflow · sonnet46 1.1M ·

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-05T22:01:55Z

Summary

Check Count
Issues with ai-processing stuck >2h 0
Issues with ai-awaiting-fix stuck >4h 0
Issues with ai-fix-requested + triage/accepted >2h 0
Draft PRs stuck >1h (business hours) 0
New ai-needs-human labels added 0
New status comments posted 0

Open AI-Generated PRs (already escalated)

All open AI-generated PRs already have ai-needs-human and hold labels applied. No new action needed.

PR Title Last Activity Labels
#16453 refactor(store): decompose monolithic Store interface 2026-06-05T20:16Z hold, needs-rebase, ai-needs-human
#16452 fix: use %q to safely quote cluster context in AI prompts 2026-06-05T05:42Z hold, needs-rebase, ai-needs-human
#16438 fix: make check-vendor-safety.mjs chunk-name-agnostic 2026-06-04T23:02Z hold, needs-rebase, ai-needs-human
#16451 planning: CNCF adopter conversion strategy 2026-06-04T20:24Z hold, ai-needs-human

Notes

  • Run time is outside business hours (22:01 UTC) — conservative escalation threshold applied.
  • All escalated PRs are hold-gated and awaiting human review. No automated recovery is possible.
  • No new stuck items detected this cycle.

Generated by Stuck Detection Workflow · sonnet46 1.1M ·

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Status Check

This PR appears to be stuck and requires human intervention.

Item: PR #16453[architect] refactor(store): decompose monolithic Store interface into 7 domain sub-interfaces
Stuck since: 2026-06-02T15:44:16Z (3+ days)
Current state: Open, not draft

Findings

  • Build: PASSING (all CI checks passed on 2026-06-02)
  • Review: NOT APPROVED — awaiting /lgtm and /approve from a maintainer
  • Merge state: dirty — needs rebase against current main
  • DCO: missing sign-off on commit 16acf14 (DCO bot flagged this)
  • Hold label is set: merge is intentionally blocked pending human review
  • No human activity since the PR was opened

Why this matters

This is a large architectural refactor decomposing the 102-method monolithic Store interface into 7 focused domain sub-interfaces. It addresses tech debt tracked in #16425 and improves testability, modularity, and maintainability of the storage layer.

Recommended Next Steps

  1. A maintainer should review the architecture decomposition
  2. The DCO sign-off issue needs to be resolved (commit needs Signed-off-by: trailer)
  3. Rebase against current main after DCO fix
  4. Add /lgtm to approve once reviewed
  5. Remove the hold label once satisfied
  6. Merge via /approve

Generated by Stuck Detection Workflow · sonnet46 1.5M ·

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Status Check

This PR has been open for 4 days with no human review or merge activity.

Current state: hold · needs-rebase · missing DCO sign-off · checks passing (as of 2026-06-02)

Findings

  • Branch needs a rebase against main before it can merge.
  • The commit 16acf14 is missing a DCO sign-off (Signed-off-by: trailer).
  • No human has approved or reviewed the architectural refactor.
  • The hold label indicates human review is required before any automation proceeds.

Recommended Next Steps

A human maintainer should:

  1. Review the Store interface decomposition (7 domain sub-interfaces replacing 102-method monolith).
  2. If approved, request the author to rebase and add DCO sign-off, then remove the hold label.
  3. If changes are needed, leave a review comment with specific feedback.
  4. If the PR is no longer needed, close it with an explanation.

Generated by Stuck Detection Workflow · sonnet46 1.6M ·

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-06T06:14:59Z

Summary

Check Count
Issues with ai-processing stuck >2h 0
Issues with ai-awaiting-fix stuck >4h 0
Issues with ai-fix-requested+triage/accepted, no PR after 2h 0
Draft PRs stalled >1h 0
New ai-needs-human labels added 0
New status comments posted 0

Open AI-Generated PRs (already fully escalated)

All open AI-generated PRs already have ai-needs-human and hold labels and have received multiple status comments. No new automated action is available.

PR Title Last Detection Comment Blockers
#16453 refactor(store): decompose monolithic Store interface 2026-06-06T03:18Z needs-rebase, DCO missing, hold
#16452 fix: use %q to safely quote cluster context in AI provider 2026-06-06T03:18Z needs-rebase, hold
#16451 planning: CNCF adopter conversion strategy 2026-06-05 hold
#16438 fix: make check-vendor-safety.mjs chunk-name-agnostic 2026-06-04 needs-rebase, hold

Notes

  • Run time is outside business hours (06:14 UTC) — conservative escalation applied.
  • All escalated PRs are hold-gated and awaiting human review. No further automated recovery is possible.
  • No new stuck items detected this cycle.

Result

No new stuck items detected. No new labels or status comments added this run.

Generated by Stuck Detection Workflow · sonnet46 1.8M ·

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-06T09:47 UTC

Results

Category Count
Issues stuck in ai-processing (>2h) 0
Issues stuck in ai-awaiting-fix (>4h) 0
ai-fix-requested + triage/accepted without PR (>2h) 0
New draft PRs stalled >1h 0
New items escalated this run 0

Pre-existing Escalations (already labeled ai-needs-human)

These were escalated in prior runs and are awaiting human review:

PR Title Also Labeled
#16453 [architect] refactor(store): decompose monolithic Store interface needs-rebase, hold
#16452 [sec-check] fix: use %q to safely quote cluster context needs-rebase, hold
#16451 [strategist] planning: CNCF adopter conversion strategy hold
#16438 [ci-maintainer] fix: make check-vendor-safety.mjs chunk-name-agnostic needs-rebase, hold

Next Steps

No new action required this cycle. The 4 held PRs above need a human maintainer to review and decide whether to rebase, approve, or close them.

Generated by Stuck Detection Workflow · sonnet46 774.6K ·

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-06T11:35 UTC

Results

Category Count
Issues stuck in ai-processing (>2h) 0
Issues stuck in ai-awaiting-fix (>4h) 0
ai-fix-requested + triage/accepted without PR (>2h) 0
New draft PRs stalled >1h 0
New items escalated this run 0

Pre-existing Escalations (already labeled ai-needs-human)

All open AI-generated PRs have been fully escalated in prior runs. Last detection comment was posted at 09:50 UTC (1h45m ago — within anti-spam window). No new action taken.

PR Title Also Labeled
#16453 [architect] refactor(store): decompose monolithic Store interface needs-rebase, hold
#16452 [sec-check] fix: use %q to safely quote cluster context needs-rebase, hold
#16451 [strategist] planning: CNCF adopter conversion strategy hold
#16438 [ci-maintainer] fix: make check-vendor-safety.mjs chunk-name-agnostic needs-rebase, hold

Result

✅ No new stuck items detected. No new labels or status comments added this run.

Generated by Stuck Detection Workflow · sonnet46 1.1M ·

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Stuck Detection Run — 2026-06-06T21:56 UTC

Results

Category Count
Issues stuck in ai-processing (>2h) 0
Issues stuck in ai-awaiting-fix (>4h) 0
ai-fix-requested + triage/accepted without PR (>2h) 0
New draft PRs stalled >1h 0
New ai-needs-human labels added 0
New status comments posted 1 (on #17125)

Open AI-Generated PRs — Still Stuck

All 5 open AI-generated PRs have ai-needs-human and hold labels and remain unresolved. Each has received multiple prior escalation comments.

PR Title Blockers Last Human Activity
#17125 [quality] Add unit tests for mixed-mode security CI: go test ./... failing (pre-existing flake per #17140) · hold None since creation
#16453 [architect] refactor(store): decompose monolithic Store interface needs-rebase · hold None since creation (Jun 2)
#16452 [sec-check] fix: use %q to safely quote cluster context needs-rebase · hold None since creation (Jun 2)
#16451 [strategist] planning: CNCF adopter conversion strategy hold (planning artifact, no code) None since creation (Jun 2)
#16438 [ci-maintainer] fix: make check-vendor-safety.mjs chunk-name-agnostic needs-rebase · hold None since creation (Jun 2)

Notes

Generated by Stuck Detection Workflow · sonnet46 1.9M ·

@clubanderson

Copy link
Copy Markdown
Collaborator Author

Closing: branch is catastrophically stale (1.2M+ line diff). The Store decomposition design is sound — re-create on a fresh branch from main.

@clubanderson clubanderson removed the hold Blocked — do not touch label Jun 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-generated Pull request generated by AI ai-needs-human AI automation unavailable - needs human intervention architecture needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. tech-debt tier/2-standard

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants