-
Notifications
You must be signed in to change notification settings - Fork 0
chore(release): add Helm chart, Grafana dashboard, GoReleaser + workflows, changelog automation, promotion checklists, evidence harness #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 4 commits
dd2bbfd
37ca42d
605ea9d
66ca59a
8b6a17f
d45946d
8dac5ed
b223210
8ddbb5a
207ca84
25d8cc7
4918a18
4bb66e0
773b361
f25f669
2a026f3
5ddfd98
842f342
4b1ef37
09eddd7
9ee3e5e
a3dead2
dbd897f
4f44ea6
738e606
202c488
d09edac
59e1d27
11220a1
518d193
72f6e31
190293a
423df1e
203fdf5
698655f
2f598e2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
name: Update Changelog | ||
|
||
on: | ||
workflow_dispatch: | ||
push: | ||
tags: | ||
- 'v*' | ||
|
||
permissions: | ||
contents: write | ||
|
||
jobs: | ||
changelog: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- name: Install git-chglog | ||
run: go install github.com/git-chglog/git-chglog/cmd/git-chglog@latest | ||
flyingrobots marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
- name: Generate CHANGELOG.md | ||
run: | | ||
$(go env GOPATH)/bin/git-chglog -o CHANGELOG.md || echo "git-chglog not configured; keeping existing CHANGELOG.md" | ||
- name: Commit changes | ||
run: | | ||
git config user.name "github-actions" | ||
git config user.email "[email protected]" | ||
git add CHANGELOG.md || true | ||
git commit -m "chore(changelog): update CHANGELOG for ${GITHUB_REF_NAME}" || echo "no changes" | ||
flyingrobots marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
- name: Push changes | ||
run: | | ||
git push || echo "no push" | ||
coderabbitai[bot] marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,38 @@ | ||||||||||||||||||||||||||||||||
name: GoReleaser | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
on: | ||||||||||||||||||||||||||||||||
push: | ||||||||||||||||||||||||||||||||
tags: | ||||||||||||||||||||||||||||||||
- 'v*' | ||||||||||||||||||||||||||||||||
workflow_dispatch: {} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
permissions: | ||||||||||||||||||||||||||||||||
contents: write | ||||||||||||||||||||||||||||||||
packages: write | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
jobs: | ||||||||||||||||||||||||||||||||
release: | ||||||||||||||||||||||||||||||||
runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||
steps: | ||||||||||||||||||||||||||||||||
- uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||
- uses: actions/setup-go@v5 | ||||||||||||||||||||||||||||||||
with: | ||||||||||||||||||||||||||||||||
go-version: '1.24.x' | ||||||||||||||||||||||||||||||||
coderabbitai[bot] marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||
- name: Set repo env | ||||||||||||||||||||||||||||||||
run: | | ||||||||||||||||||||||||||||||||
echo "GITHUB_REPOSITORY_OWNER=${GITHUB_REPOSITORY%/*}" >> $GITHUB_ENV | ||||||||||||||||||||||||||||||||
echo "GITHUB_REPOSITORY_NAME=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV | ||||||||||||||||||||||||||||||||
- name: Login to GHCR | ||||||||||||||||||||||||||||||||
flyingrobots marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||
uses: docker/login-action@v3 | ||||||||||||||||||||||||||||||||
with: | ||||||||||||||||||||||||||||||||
registry: ghcr.io | ||||||||||||||||||||||||||||||||
username: ${{ github.actor }} | ||||||||||||||||||||||||||||||||
password: ${{ secrets.GITHUB_TOKEN }} | ||||||||||||||||||||||||||||||||
- name: Run GoReleaser | ||||||||||||||||||||||||||||||||
flyingrobots marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||
uses: goreleaser/goreleaser-action@v6 | ||||||||||||||||||||||||||||||||
with: | ||||||||||||||||||||||||||||||||
distribution: goreleaser | ||||||||||||||||||||||||||||||||
version: latest | ||||||||||||||||||||||||||||||||
args: release --clean | ||||||||||||||||||||||||||||||||
env: | ||||||||||||||||||||||||||||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||||||||||||||||||||||||||||
Comment on lines
+34
to
+41
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Scope permissions narrowly and surface attestations. Consider adding provenance/signing (SLSA/cosign) and setting tighter permissions per step. Not blocking, but you’ll thank me later. 🤖 Prompt for AI Agents
Comment on lines
+35
to
+41
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion “version: latest” is non-deterministic. Pin your toolchain. Releases must be reproducible. - - name: Run GoReleaser
- uses: goreleaser/goreleaser-action@v6
+ - name: Run GoReleaser
+ uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
- version: latest
+ version: v2.6.1 # pin a known-good Goreleaser version
args: release --clean Also consider guarding workflow_dispatch to snapshots to avoid accidental publishes: - args: release --clean
+ args: ${{ github.event_name == 'workflow_dispatch' && 'release --clean --skip=publish --snapshot' || 'release --clean' }} 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,10 +24,17 @@ go.work | |
|
||
# IDE/Editor | ||
.idea/ | ||
.vscode/ | ||
# VS Code: ignore all by default, allow key shared files | ||
.vscode/* | ||
!.vscode/extensions.json | ||
!.vscode/settings.json | ||
!.vscode/launch.json | ||
Comment on lines
+27
to
+31
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Selective .vscode tracking is fine; ensure no secrets slip in. extensions.json/settings.json/launch.json can hold credentials (e.g., debug env). Recommend adding a pre-commit check to block secrets in these files. 🤖 Prompt for AI Agents
|
||
*.swp | ||
*.swo | ||
|
||
# Obsidian | ||
.obsidian/ | ||
|
||
# Logs | ||
*.log | ||
logs/ |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,45 @@ | ||||||
version: 2 | ||||||
|
||||||
project_name: job-queue-system | ||||||
|
||||||
builds: | ||||||
- id: job-queue-system | ||||||
main: ./cmd/job-queue-system | ||||||
env: | ||||||
- CGO_ENABLED=0 | ||||||
goos: [linux, darwin, windows] | ||||||
goarch: [amd64, arm64] | ||||||
ldflags: | ||||||
- -s -w -X main.version={{.Version}} | ||||||
Comment on lines
+12
to
+13
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Harden builds: add -trimpath for reproducibility. Reduces path leakage and improves determinism. ldflags:
- - -s -w -X main.version={{.Version}}
+ - -s -w -trimpath -X main.version={{.Version}}
🤖 Prompt for AI Agents
|
||||||
|
||||||
archives: | ||||||
- id: binaries | ||||||
builds: [job-queue-system] | ||||||
format: tar.gz | ||||||
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" | ||||||
|
||||||
flyingrobots marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
checksum: | ||||||
name_template: "checksums_{{ .Version }}.txt" | ||||||
|
||||||
changelog: | ||||||
sort: desc | ||||||
use: github | ||||||
|
||||||
dockers: | ||||||
- image_templates: | ||||||
- ghcr.io/{{ .RepoOwner }}/{{ .RepoName }}:{{ .Version }} | ||||||
- ghcr.io/{{ .RepoOwner }}/{{ .RepoName }}:latest | ||||||
Comment on lines
+31
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainDon’t slap :latest on alpha builds. Tagging “latest” for pre-releases is how you torch users. Gate “latest” to stable releases only (e.g., via templating/conditions or a separate docker entry that runs only when not prerelease). Verify the exact GoReleaser field to key off (e.g., .Prerelease or similar) and wire it accordingly. 🌐 Web query:
💡 Result: Use GoReleaser template conditionals in image_templates to emit :latest only when .Prerelease is empty (i.e., not a prerelease). Example config snippet: .goreleaser.yaml
References: GoReleaser Docker docs [1], Template variables (.Prerelease) [2]. DO NOT tag prereleases with :latest — gate :latest to stable releases. File: .goreleaser.yaml (lines 31–33) — replace the unconditional :latest with a template conditional that only emits :latest when .Prerelease is empty:
This uses .Prerelease to ensure only stable releases get :latest. 🤖 Prompt for AI Agents
|
||||||
dockerfile: Dockerfile | ||||||
build_flag_templates: | ||||||
- "--pull" | ||||||
|
||||||
Comment on lines
+30
to
+37
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Enable multi-arch Docker images via buildx + add OCI labels. Without buildx/platforms, images will be single-arch (runner default). Add platforms and basic OCI labels. dockers:
- image_templates:
- ghcr.io/{{ .RepoOwner }}/{{ .RepoName }}:{{ .Version }}
- ghcr.io/{{ .RepoOwner }}/{{ .RepoName }}:latest
dockerfile: Dockerfile
+ use: buildx
+ platforms:
+ - linux/amd64
+ - linux/arm64
build_flag_templates:
- "--pull"
+ labels:
+ - "org.opencontainers.image.source={{.GitURL}}"
+ - "org.opencontainers.image.revision={{.FullCommit}}"
+ - "org.opencontainers.image.version={{.Version}}"
🤖 Prompt for AI Agents
|
||||||
release: | ||||||
github: | ||||||
owner: {{ .Env.GITHUB_REPOSITORY_OWNER }} | ||||||
name: {{ .Env.GITHUB_REPOSITORY_NAME }} | ||||||
draft: false | ||||||
prerelease: auto | ||||||
flyingrobots marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
||||||
snapshot: | ||||||
name_template: SNAPSHOT-{{ .ShortCommit }} | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Kill the stray trailing blank line. YAMLlint already complained. Remove it. - name_template: SNAPSHOT-{{ .ShortCommit }}
-
+ name_template: SNAPSHOT-{{ .ShortCommit }} 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,6 @@ | ||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||
"recommendations": [ | ||||||||||||||||||||||||||||||
"golang.go" | ||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||
"unwantedRecommendations": [] | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
Comment on lines
+1
to
+6
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Add YAML/Helm tooling to match new chart assets Recommend adding Kubernetes/Helm and YAML support to align with the new Helm chart and K8s manifests. {
"recommendations": [
- "golang.go"
+ "golang.go",
+ "redhat.vscode-yaml",
+ "ms-kubernetes-tools.vscode-kubernetes-tools"
],
"unwantedRecommendations": []
} 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
{ | ||
"editor.formatOnSave": false, | ||
"[go]": { | ||
"editor.formatOnSave": true, | ||
"editor.codeActionsOnSave": { | ||
"source.organizeImports": true | ||
} | ||
flyingrobots marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
}, | ||
"gopls": { | ||
"ui.semanticTokens": true, | ||
"build.experimentalWorkspaceModule": true | ||
}, | ||
Comment on lines
+12
to
+15
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainVerify gopls experimental flag; it may be obsolete gopls’s build.experimentalWorkspaceModule has changed across versions; confirm it’s still valid with your pinned Go extension/gopls. If obsolete, drop it. "gopls": {
"ui.semanticTokens": true,
- "build.experimentalWorkspaceModule": true
+ // "build.experimentalWorkspaceModule": true
}, To verify with upstream docs: 🌐 Web query:
💡 Result: Short answer: No — it was deprecated and then removed. Use go.work (multi-module workspace support in the go command) instead. Details / sources:
Sources: Remove deprecated gopls setting "build.experimentalWorkspaceModule" Deprecated in gopls v0.10.x and removed by v0.12.0; use go.work (e.g. 🤖 Prompt for AI Agents
|
||
"go.testFlags": ["-race", "-count=1"], | ||
"go.toolsManagement.autoUpdate": true | ||
Comment on lines
+16
to
+17
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Test flags trade-off Running tests with -race and -count=1 by default is great for catching issues but slower. If dev feedback becomes a concern, consider moving -race to a separate profile/task. 🤖 Prompt for AI Agents
|
||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,37 @@ | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
"title": "Go Redis Work Queue", | ||||||||||||||||||||||
"schemaVersion": 38, | ||||||||||||||||||||||
"panels": [ | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
"type": "timeseries", | ||||||||||||||||||||||
"title": "Job Processing Duration (p95)", | ||||||||||||||||||||||
"targets": [{"expr": "histogram_quantile(0.95, sum(rate(job_processing_duration_seconds_bucket[5m])) by (le))"}] | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
Comment on lines
+6
to
+9
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Histogram quantile: add explicit sum by(le) and preserve other labels with without(). Current expr is fine; this version avoids accidental label fan-out. - "targets": [{"expr": "histogram_quantile(0.95, sum(rate(job_processing_duration_seconds_bucket[5m])) by (le))"}]
+ "targets": [{"expr": "histogram_quantile(0.95, sum without (instance, pod) (rate(job_processing_duration_seconds_bucket[5m])) by (le))"}]
🤖 Prompt for AI Agents
|
||||||||||||||||||||||
{ | ||||||||||||||||||||||
"type": "timeseries", | ||||||||||||||||||||||
"title": "Jobs Completed / Failed / Retried", | ||||||||||||||||||||||
"targets": [ | ||||||||||||||||||||||
{"expr": "rate(jobs_completed_total[5m])"}, | ||||||||||||||||||||||
{"expr": "rate(jobs_failed_total[5m])"}, | ||||||||||||||||||||||
{"expr": "rate(jobs_retried_total[5m])"} | ||||||||||||||||||||||
] | ||||||||||||||||||||||
Comment on lines
+13
to
+17
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Counter rates: ensure aggregation to a single series per metric. Add sum without volatile labels to avoid per-instance sprawl. - {"expr": "rate(jobs_completed_total[5m])"},
- {"expr": "rate(jobs_failed_total[5m])"},
- {"expr": "rate(jobs_retried_total[5m])"}
+ {"expr": "sum without (instance, pod) (rate(jobs_completed_total[5m]))"},
+ {"expr": "sum without (instance, pod) (rate(jobs_failed_total[5m]))"},
+ {"expr": "sum without (instance, pod) (rate(jobs_retried_total[5m]))"} 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||
}, | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
"type": "stat", | ||||||||||||||||||||||
"title": "Circuit Breaker State", | ||||||||||||||||||||||
"targets": [{"expr": "circuit_breaker_state"}], | ||||||||||||||||||||||
"options": {"reduceOptions": {"calcs": ["last"], "fields": ""}} | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
Comment on lines
+21
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Stat panel may show multiple series; reduce in query. Use max() or sum() over labels and map values to text. - "targets": [{"expr": "circuit_breaker_state"}],
+ "targets": [{"expr": "max without (instance, pod) (circuit_breaker_state)"}],
"options": {"reduceOptions": {"calcs": ["last"], "fields": ""}} 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||
{ | ||||||||||||||||||||||
"type": "timeseries", | ||||||||||||||||||||||
"title": "Queue Lengths", | ||||||||||||||||||||||
"targets": [{"expr": "queue_length"}] | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
flyingrobots marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||
{ | ||||||||||||||||||||||
"type": "stat", | ||||||||||||||||||||||
"title": "Active Workers", | ||||||||||||||||||||||
"targets": [{"expr": "worker_active"}], | ||||||||||||||||||||||
"options": {"reduceOptions": {"calcs": ["last"], "fields": ""}} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
Comment on lines
+31
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Active workers stat: reduce to a single value. Aggregate across labels to avoid arbitrary series selection. - "targets": [{"expr": "worker_active"}],
+ "targets": [{"expr": "sum without (instance, pod) (worker_active)"}],
"options": {"reduceOptions": {"calcs": ["last"], "fields": ""}} 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||
] | ||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,75 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||
# Promotion Checklists | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
- Last updated: 2025-09-12 | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
## Alpha → Beta Checklist | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Functional completeness: producer, worker, all-in-one, reaper, breaker, admin CLI | ||||||||||||||||||||||||||||||||||||||||||||||||||
coderabbitai[bot] marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Observability: /metrics, /healthz, /readyz live and correct | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] CI green on main (build, vet, race, unit, integration, e2e) | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Unit coverage ≥ 80% core packages (attach coverage report) | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] E2E passes deterministically (≥ 5 runs) | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] govulncheck: no Critical/High in code paths/stdlib | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Performance baseline: 1k jobs at 500/s complete; limiter ±10%/60s | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Docs: README, PRD, test plan, deployment, runbook updated | ||||||||||||||||||||||||||||||||||||||||||||||||||
- Evidence links: | ||||||||||||||||||||||||||||||||||||||||||||||||||
- CI run URL: … | ||||||||||||||||||||||||||||||||||||||||||||||||||
- Bench JSON: … | ||||||||||||||||||||||||||||||||||||||||||||||||||
- Metrics snapshot(s): … | ||||||||||||||||||||||||||||||||||||||||||||||||||
- Issues list: … | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
### Confidence Scores (Alpha → Beta) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| Criterion | Confidence | Rationale | How to improve | | ||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---:|---|---| | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Functional completeness | 0.9 | All core roles implemented and tested; admin CLI present | Add more end-to-end tests for admin flows; document edge cases | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Observability endpoints | 0.95 | Live and exercised in CI/e2e; stable | Add /healthz readiness probes to example manifests; alert rules examples | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| CI health | 0.9 | CI green with race, vet, e2e, govulncheck | Increase matrix (Go versions, OS); add flaky-test detection | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Coverage ≥ 80% | 0.75 | Core packages covered; gaps in admin/obs | Add tests for admin and HTTP server handlers | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| E2E determinism | 0.8 | E2E with Redis service stable locally and in CI | Add retries and timing buffers; run 5x in workflow and gate | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Security (govulncheck) | 0.95 | Using Go 1.24; no critical findings | Add image scanning; pin base image digest | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Performance baseline | 0.7 | Bench harness exists; sample run meets ~960 jobs/min, latency sampling coarse | Improve latency measurement via metrics; run on 4 vCPU node and document env | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Documentation completeness | 0.9 | PRD, runbook, deployment, perf, checklists present | Add Helm usage examples and alert rules | | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||
## Beta → RC Checklist | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Throughput ≥ 1k jobs/min for ≥ 10m; p95 < 2s (<1MB files) | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Chaos tests: Redis outage/latency/worker crash → no lost jobs; breaker transitions | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Admin CLI validated against live instance | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Queue gauges and breaker metric accurate under load | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] 24–48h soak: error rate < 0.5%, no leaks | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] govulncheck clean; deps pinned | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Docs: performance report and tuning | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] No P0/P1; ≤ 3 P2s w/ workarounds | ||||||||||||||||||||||||||||||||||||||||||||||||||
- Evidence links as above | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||
## RC → GA Checklist | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Code freeze; only showstopper fixes | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] 0 P0/P1; ≤ 2 P2s with workarounds; no flakey tests across 10 runs | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Release workflow proven; rollback rehearsal complete | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Config/backcompat validated or migration guide | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] Docs complete; README examples validated | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] govulncheck clean; image scan no Critical | ||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] 7-day RC soak: readiness > 99.9%, DLQ < 0.5% | ||||||||||||||||||||||||||||||||||||||||||||||||||
- Evidence links as above | ||||||||||||||||||||||||||||||||||||||||||||||||||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||
### Confidence Scores (Beta → RC) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| Criterion | Confidence | Rationale | How to improve | | ||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---:|---|---| | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ≥1k jobs/min for ≥10m | 0.6 | Not yet run on dedicated 4 vCPU node | Schedule controlled benchmark; record metrics and environment | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| p95 < 2s (<1MB) | 0.6 | Latency sampling method is coarse | Use Prometheus histogram quantiles on /metrics; run sustained test | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Chaos (outage/latency/crash) | 0.7 | Logic supports recovery; tests cover happy-path and reaper | Add chaos e2e in CI (stop Redis container; tc latency); verify no loss | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Admin validation | 0.85 | Admin commands tested manually; unit tests for helpers | Add e2e assertions for stats and peek outputs | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Gauges/breaker accuracy | 0.85 | Metrics wired; observed locally | Add metric assertions in e2e; dashboards and alerts validate | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| 24–48h soak | 0.5 | Not yet executed | Run soak in staging and record dashboards | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Security and deps | 0.9 | govulncheck in CI; deps pinned | Add Renovate/Dependabot; image scanning stage | | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Issue hygiene | 0.9 | No open P0/P1 | Enforce labels and triage automation | | ||||||||||||||||||||||||||||||||||||||||||||||||||
### Confidence Scores (RC → GA) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
| Criterion | Confidence | Rationale | How to improve | | |
|---|---:|---|---| | |
| ≥1k jobs/min for ≥10m | 0.6 | Not yet run on dedicated 4 vCPU node | Schedule controlled benchmark; record metrics and environment | | |
| p95 < 2s (<1MB) | 0.6 | Latency sampling method is coarse | Use Prometheus histogram quantiles on /metrics; run sustained test | | |
| Chaos (outage/latency/crash) | 0.7 | Logic supports recovery; tests cover happy-path and reaper | Add chaos e2e in CI (stop Redis container; tc latency); verify no loss | | |
| Admin validation | 0.85 | Admin commands tested manually; unit tests for helpers | Add e2e assertions for stats and peek outputs | | |
| Gauges/breaker accuracy | 0.85 | Metrics wired; observed locally | Add metric assertions in e2e; dashboards and alerts validate | | |
| 24–48h soak | 0.5 | Not yet executed | Run soak in staging and record dashboards | | |
| Security and deps | 0.9 | govulncheck in CI; deps pinned | Add Renovate/Dependabot; image scanning stage | | |
| Issue hygiene | 0.9 | No open P0/P1 | Enforce labels and triage automation | | |
### Confidence Scores (RC → GA) | |
| Criterion | Confidence | Rationale | How to improve | | |
|---|---:|---|---| | |
| ≥1k jobs/min for ≥10m | 0.6 | Not yet run on dedicated 4 vCPU node | Schedule controlled benchmark; record metrics and environment | | |
| p95 < 2s (<1MB) | 0.6 | Latency sampling method is coarse | Use Prometheus histogram quantiles on /metrics; run sustained test | | |
| Chaos (outage/latency/crash) | 0.7 | Logic supports recovery; tests cover happy-path and reaper | Add chaos e2e in CI (stop Redis container; tc latency); verify no loss | | |
| Admin validation | 0.85 | Admin commands tested manually; unit tests for helpers | Add e2e assertions for stats and peek outputs | | |
| Gauges/breaker accuracy | 0.85 | Metrics wired; observed locally | Add metric assertions in e2e; dashboards and alerts validate | | |
| 24–48h soak | 0.5 | Not yet executed | Run soak in staging and record dashboards | | |
| Security and deps | 0.9 | govulncheck in CI; deps pinned | Add Renovate/Dependabot; image scanning stage | | |
| Issue hygiene | 0.9 | No open P0/P1 | Enforce labels and triage automation | | |
### Confidence Scores (RC → GA) | |
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)
64-64: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
65-65: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above
(MD022, blanks-around-headings)
🤖 Prompt for AI Agents
In docs/15_promotion_checklists.md around lines 55–65, the markdown table is not
surrounded by blank lines (MD058) and the next heading lacks a preceding blank
line (MD022); edit the file to ensure there is an empty line before the table
and an empty line after the table, and also insert a blank line immediately
before the "### Confidence Scores (RC → GA)" heading; additionally replace or
augment the "Evidence" placeholders in the table with links to actual
docs/evidence/* files (or add relative links to new evidence files) so each
evidence cell points to the corresponding document.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Evidence for v0.4.0-alpha Promotion | ||
|
||
- CI run: see `ci_run.json` (contains URL to the successful workflow run) | ||
- Bench JSON: `bench.json` (admin bench with 1000 jobs at 500 rps) | ||
- Config used: `config.alpha.yaml` | ||
- Metrics snapshots: `metrics_before.txt`, `metrics_after.txt` | ||
|
||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Reproduce locally | ||
|
||
1) Ensure Redis is running on `localhost:6379` (e.g., `docker run -p 6379:6379 redis:7-alpine`) | ||
2) Build binary: `make build` | ||
3) Start worker: `./bin/job-queue-system --role=worker --config=docs/evidence/config.alpha.yaml` | ||
4) In another terminal, run bench: `./bin/job-queue-system --role=admin --config=docs/evidence/config.alpha.yaml --admin-cmd=bench --bench-count=1000 --bench-rate=500 --bench-priority=low --bench-timeout=60s` | ||
5) Capture metrics: `curl -sS localhost:9191/metrics | head -n 200 > docs/evidence/metrics_after.txt` | ||
|
||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Notes | ||
- The simple latency reported in `bench.json` is measured by comparing current time to each job's creation_time after completion sampling and is a coarse approximation. For precise latency distributions, prefer Prometheus histogram `job_processing_duration_seconds` and compute quantiles there. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"count": 1000, | ||
"duration": 62125591875, | ||
"throughput_jobs_per_sec": 16.096426123586127, | ||
"p50_latency": 252446328000, | ||
"p95_latency": 252878289000 | ||
} | ||
Comment on lines
+1
to
+7
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainEvidence inconsistency: units/values don’t match the “1000 jobs @ 500 rps” claim.
Please verify collection units and recompute metrics before using this for promotion. Run to sanity-check units and derived values: 🏁 Script executed: #!/bin/bash
set -euo pipefail
jq -r '
. as $r |
"count=\($r.count)",
"duration_ns=\($r.duration) (~\($r.duration/1e9) s)",
"throughput_jobs_per_sec=\($r.throughput_jobs_per_sec)",
"p50_ns=\($r.p50_latency) (~\($r.p50_latency/1e9) s)",
"p95_ns=\($r.p95_latency) (~\($r.p95_latency/1e9) s)"
' docs/evidence/bench.json Length of output: 167 Fix inconsistent benchmark metrics in docs/evidence/bench.json
🤖 Prompt for AI Agents
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[{"conclusion":"success","displayTitle":"chore(release): add Helm chart, Grafana dashboard, GoReleaser + workflows, changelog automation, promotion checklists, evidence harness","headBranch":"release/alpha-v0.4.0","status":"completed","url":"https://github.com/flyingrobots/go-redis-work-queue/actions/runs/17684747392"}] | ||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,47 @@ | ||||||||||||||||||||||||||||||||||
redis: | ||||||||||||||||||||||||||||||||||
addr: "localhost:6379" | ||||||||||||||||||||||||||||||||||
pool_size_multiplier: 10 | ||||||||||||||||||||||||||||||||||
min_idle_conns: 5 | ||||||||||||||||||||||||||||||||||
dial_timeout: 5s | ||||||||||||||||||||||||||||||||||
read_timeout: 3s | ||||||||||||||||||||||||||||||||||
write_timeout: 3s | ||||||||||||||||||||||||||||||||||
max_retries: 3 | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
worker: | ||||||||||||||||||||||||||||||||||
count: 8 | ||||||||||||||||||||||||||||||||||
heartbeat_ttl: 30s | ||||||||||||||||||||||||||||||||||
max_retries: 3 | ||||||||||||||||||||||||||||||||||
backoff: | ||||||||||||||||||||||||||||||||||
base: 100ms | ||||||||||||||||||||||||||||||||||
max: 2s | ||||||||||||||||||||||||||||||||||
priorities: ["high", "low"] | ||||||||||||||||||||||||||||||||||
queues: | ||||||||||||||||||||||||||||||||||
high: "jobqueue:high_priority" | ||||||||||||||||||||||||||||||||||
low: "jobqueue:low_priority" | ||||||||||||||||||||||||||||||||||
processing_list_pattern: "jobqueue:worker:%s:processing" | ||||||||||||||||||||||||||||||||||
heartbeat_key_pattern: "jobqueue:processing:worker:%s" | ||||||||||||||||||||||||||||||||||
Comment on lines
+19
to
+22
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. YAML lint: extra spaces after colon (lines 20, 22). Normalize spacing. - low: "jobqueue:low_priority"
+ low: "jobqueue:low_priority"
...
- heartbeat_key_pattern: "jobqueue:processing:worker:%s"
+ heartbeat_key_pattern: "jobqueue:processing:worker:%s" 📝 Committable suggestion
Suggested change
🧰 Tools🪛 YAMLlint (1.37.1)[error] 20-20: too many spaces after colon (colons) [error] 22-22: too many spaces after colon (colons) 🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
completed_list: "jobqueue:completed" | ||||||||||||||||||||||||||||||||||
dead_letter_list: "jobqueue:dead_letter" | ||||||||||||||||||||||||||||||||||
brpoplpush_timeout: 1s | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
producer: | ||||||||||||||||||||||||||||||||||
scan_dir: "./data" | ||||||||||||||||||||||||||||||||||
include_globs: ["**/*"] | ||||||||||||||||||||||||||||||||||
exclude_globs: ["**/*.tmp", "**/.DS_Store"] | ||||||||||||||||||||||||||||||||||
default_priority: "low" | ||||||||||||||||||||||||||||||||||
high_priority_exts: [".pdf", ".docx", ".xlsx", ".zip"] | ||||||||||||||||||||||||||||||||||
rate_limit_per_sec: 1000 | ||||||||||||||||||||||||||||||||||
rate_limit_key: "jobqueue:rate_limit:producer" | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
Comment on lines
+27
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Producer limiter defaults: 1000/s may exceed Alpha perf targets. If Alpha bench targets 1k jobs/min, consider 20/s default in alpha config to avoid accidental overload during demos. - rate_limit_per_sec: 1000
+ rate_limit_per_sec: 20 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
circuit_breaker: | ||||||||||||||||||||||||||||||||||
failure_threshold: 0.5 | ||||||||||||||||||||||||||||||||||
window: 1m | ||||||||||||||||||||||||||||||||||
cooldown_period: 30s | ||||||||||||||||||||||||||||||||||
min_samples: 20 | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
observability: | ||||||||||||||||||||||||||||||||||
metrics_port: 9191 | ||||||||||||||||||||||||||||||||||
log_level: "info" | ||||||||||||||||||||||||||||||||||
tracing: | ||||||||||||||||||||||||||||||||||
enabled: false | ||||||||||||||||||||||||||||||||||
endpoint: "" | ||||||||||||||||||||||||||||||||||
Comment on lines
+42
to
+47
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainPort mismatch vs README (9090 vs 9191). Align or document. Either switch metrics_port to 9090 (matches README) or update README and Helm values to 9191 to avoid confusion. -observability:
- metrics_port: 9191
+observability:
+ metrics_port: 9090 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
echo "PWD: $(pwd)"
echo "---- search for 'metrics_port' ----"
if command -v rg >/dev/null 2>&1; then
rg -n --hidden -S '\bmetrics_port\b' -g '!*node_modules/**' -C3 || true
else
grep -RIn --exclude-dir=node_modules -E '\bmetrics_port\b' . || true
fi
echo "---- search for '9090' or '9191' ----"
if command -v rg >/dev/null 2>&1; then
rg -n --hidden -S '\b9090\b|\b9191\b' -g '!*node_modules/**' -C3 || true
else
grep -RIn --exclude-dir=node_modules -E '\b9090\b|\b9191\b' . || true
fi
echo "---- search README* for 9090/9191 ----"
if [ -e README* ]; then
if command -v rg >/dev/null 2>&1; then
rg -n --hidden -S '9090|9191' README* || true
else
grep -RIn --exclude-dir=node_modules -E '9090|9191' README* || true
fi
else
echo "No README files found at repo root."
fi
echo "---- show docs/evidence/config.alpha.yaml (first 200 lines) ----"
if [ -f docs/evidence/config.alpha.yaml ]; then
sed -n '1,200p' docs/evidence/config.alpha.yaml
else
echo "docs/evidence/config.alpha.yaml: not found"
fi Length of output: 1883 Fix metrics port mismatch — align README (9090) and config (9191) README documents Prometheus/health endpoints on localhost:9090 (README, lines 33, 37, 38, 51) but docs/evidence/config.alpha.yaml sets observability.metrics_port: 9191 — either set metrics_port to 9090 or update README/Helm to 9191. Locations:
Suggested quick fix: -observability:
- metrics_port: 9191
+observability:
+ metrics_port: 9090 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
Uh oh!
There was an error while loading. Please reload this page.