Promote: main-is-released check and the codified star-chart shape - #35
Conversation
Adds organization-wide community health defaults, validation, ownership, contribution guidance, security policy, and hardened workflow checks.
* ci(workflows): add reusable CI foundation * fix(workflows): harden reusable release contracts
* feat(quality): add normalized reporting foundation * test(quality): run reporting contracts in standards validation * fix(quality): align report validator with schema * test(quality): verify GitHub integration outputs
* ci(profile): make asset generation read-only * fix(profile): restrict asset validation egress
* ci(review): add deduplicated Greptile summon * fix(review): serialize exact-head Greptile summons * test(review): lock Greptile security controls
go-ci.yml's test and lint jobs ran unconditionally, so a Go-less repo that only wants the language-agnostic workflow-security (zizmor) job couldn't call it. Add run-test/run-lint boolean inputs, mirroring the existing run-govulncheck/run-workflow-security/etc. toggle pattern, defaulting to true so existing callers see no behavior change. Fixes: #18
* ci(workflows): add module-directory input to node-ci Mirrors go-ci's module-directory idiom: a string input defaulting to "." threaded into each fixed script's env as MODULE_DIRECTORY, so a repo with several independently-gated Node projects can call node-ci once per project. The default preserves current behavior for existing callers. Extends the reusable CI contract test to assert the new input and its threading, matching how run-test/run-lint were added for go-ci in #19. * test(workflows): assert module-directory threads into all three node jobs
* docs(onboarding): align with the codified standards registry - docs(onboarding): name Codecov as the coverage cloud; Qlty Cloud App and maintainability badge stay, checks stay non-required - docs(onboarding): trivy deprecated in favor of Grype, including the qlty plugin blocks in the two reference configs (drydock#753, portwing#135) - docs(onboarding): CodeRabbit free Pro is public-only; private repos use cross-account human review - docs(onboarding): add the greptile.json contract and the label-gated second-opinion caller * docs(onboarding): reword the CodeRabbit private-repo claim as org policy - docs(onboarding): free-plan private-repo reviews exist but are rate-limited and never fired here; the skip is policy, not a plan fact - docs(onboarding): pair the Greptile caller with auto-applied CodeRabbit labeling so the second-opinion label is criteria-driven
* chore(repo): meet our own onboarding checklist - chore(repo): MIT LICENSE (infrastructure repos are MIT; products AGPL) - docs(repo): root AGENTS.md with repo-specific rules and validation - build(hooks): lefthook with commit-msg + pre-push mirroring CI via scripts/validate.sh * fix(hooks): tighten the commit-msg exemptions and mirror zizmor's CI flags - fix(hooks): merge/revert exemptions match git's generated subjects only, so a hand-typed 'Merge ...' subject no longer bypasses the check - fix(hooks): require a non-whitespace character after the colon - fix(hooks): zizmor runs --no-online-audits locally, matching CI's online-audits: false for local/CI parity * fix(hooks): exempt only git-generated merge and revert subjects
* docs(community): add org-default code of conduct and community checklist items CODE_OF_CONDUCT.md is Contributor Covenant 2.0 (drydock's tuned copy) with the org contact security@codeswhat.com, cascading to every repo without a local one. Onboarding checklist gains the cascade-first rule and the Discussions on/off split for product vs meta repos. * test(community): assert the code of conduct in the community-health contract
…32) * feat(workflows): add the shared star-chart refresh reusable workflow Replaces both retired star-chart engines org-wide. The chart becomes a first-party SVG generated from GitHub's own stargazer timestamps and committed into the consuming repository, so it needs no secret and makes no request at render time. That property is the point. A live route that loses its credential serves a plausible placeholder at HTTP 200 forever with nothing reporting red, which is exactly how drydock's chart sat broken. A committed artifact fails visibly or not at all. The generator is embedded in the workflow rather than checked out from a second repository, so a caller's SHA pin covers every line of behaviour with nothing resolved at run time. Verified against live data before committing: byte-identical output to the reference implementation for drydock at 238 stars and 3 API calls, and a clean no-op exit on a repo with a single star. - feat(workflows): starchart-refresh.yml, egress-blocked to api.github.com and github.com, contents: write as its only elevated scope - test(workflows): contract test covering the embedded generator, env-var input handling, the self-contained SVG, and the conditional commit-back - ci(validation): run the new contract test in standards validation - docs(onboarding): document the caller shape and why the artifact is committed rather than served * test(workflows): syntax-check the embedded star-chart generator This workflow never runs in this repository, so a syntax error inside the heredoc would first surface in a consumer's scheduled job, days later and in someone else's lane. The test recovers the generator the way the shell will actually see it, stripping the run block's base indentation rather than reading the file as written, since a heredoc body that looks correct in YAML can still reach node malformed. Then node --check parses it. Verified with a negative control rather than assumed: injecting a syntax error into the generator fails the test, and reverting passes it. * fix(workflows): reject the inputs that would publish a wrong star chart All three from CodeRabbit on #32, and the max-pages one was a real bug of exactly the kind this workflow exists to prevent. max-pages: 0 made pages 0, which fetched nothing, which hit the "too few stars" clean exit. A repository with 238 stars would have reported a green no-op. A cap below the needed page count was worse than that: it drew a chart from the first N pages and published a partial history as a whole one behind a ::warning:: nobody reads. Both now fail loudly, and the cap must be a positive integer. branch had no runtime guard. Omitting a default only prevents omission, so a caller could still pass main and, on a repository whose ruleset let the push through, commit straight to the default branch. Rejected before checkout rather than at the push, where the error would be confusing. output-path was read through the environment, which stops script injection but not traversal. An absolute or ../ path reached writeFileSync outside the checkout, and the commit step then found nothing staged and reported success. Writes now use the resolved and validated path rather than the raw input, since a check that doesn't govern the write is decoration. Verified behaviourally, not by reading: each rejected input throws, the one-star exit still no-ops, nothing lands outside the workspace, and the happy path is still byte-identical to the reference output for drydock.
* ci(standards): assert main points at a release tag Reusable workflow for the invariant behind "main is the released version, not the newest work": every commit on main is a tagged release, so an untagged main head is itself the alarm. Callers pin it by SHA and run it on a schedule plus push to main. It separates three states that all look like "not tagged" from the outside. A repository with zero tags cannot be evaluated at all and says so rather than reporting drift. A drifted main reports the newest reachable tag and how many commits it is behind. A prerelease on main is its own failure by default, since a release candidate on the default branch is the exact drift this exists to catch. Read-only: contents: read, egress blocked to github.com, and no credentials persisted through checkout. fetch-depth: 0 because tags only travel with full history and a shallow clone would fail for the wrong reason and read as real drift. * ci(starchart): render the codified chart shape in both themes Scott drew the target and it is now the renderer. The chart reads as native GitHub UI rather than as a third-party embed: a 900x460 card on GitHub's own border colour, sans for the words and mono for every number, a 2px accent line over a faint gradient, interior gridlines and a solid baseline. The accent is the repository's logo colour, passed as a new required input, and an accent that is not a colour now fails instead of drawing a chart with no line. Three behaviours the renderer decides rather than hard-codes, each because the naive version produced something wrong on a real repository. The y-axis searches step-and-tick-count pairs, since rounding the step alone put drydock's 239 stars on a 0-400 axis with the curve in the bottom 60% of the plot. The curve is a monotone cubic, since a cardinal spline overshoots on a curve this flat and an overshoot on a cumulative count draws a dip that never happened. X labels drop to day precision when month names collide, which is the actual condition rather than a guessed span threshold. Two files ship now, not one. GitHub's theme toggle does not reach a media query inside an <img>-embedded SVG, so a self-theming file shows a white card to anyone reading GitHub dark with a light OS. It does drive a <picture> element in the README, so the pair is generated from one fetch and the markup chooses. They commit together or not at all: a <picture> with a fresh light chart and a stale dark one shows two different histories depending on who is looking, and nothing reports it. The documented trigger moves from a cron to the release cut. A committed artifact refreshed on a schedule mutates underneath a tag, which is what the main-is-released rule forbids. The renderer block is generated from ops render-chart.mjs by splice-into-workflow.mjs rather than hand-copied, and byte parity with that module was verified against live drydock data before this landed. Also fixes an assertion in the main-is-released test that sliced the whole if-block as the decisive expression and so could never pass. * docs(onboarding): add the main-is-released caller to the section 4 checklist
|
@coderabbitai review |
|
Warning Review limit reached
Next review available in: 51 minutes Limit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?Wait for the limit to reset, then comment An organization admin can change what happens after included review limits in Billing. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (6)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
biggest-littlest
left a comment
There was a problem hiding this comment.
Promotion of #34, already reviewed there. Diff against main is the same six files.
ALARGECOMPANY
left a comment
There was a problem hiding this comment.
Promotion of #34, already reviewed there. Diff against main is the same six files.
Promotion of #34. Only six files differ from
main; everything earlier on this branch is already promoted.main-is-released.yml— reusable check for the release invariant, read-only, separating drifted / prerelease / no-tags-so-unevaluable.starchart-refresh.yml— Scott's chart shape as the renderer, per-repo logo accent as a required input, light and dark pair for a README<picture>, and the trigger moved from a cron to the release cut so a committed artifact can't mutate underneath a tag.REPOSITORY_ONBOARDING.md.Verified on #34: both contract suites green (14 and 7),
node --checkon the extracted heredoc, byte parity against the ops renderer on live drydock data, actionlint and markdownlint clean.Consumers re-pin to this merge SHA. The starchart caller gains a required
accentinput, so an un-updated caller fails loudly rather than rendering a chart with no line.