Skip to content

docs(ops): Slack Stage 1 spec; co-own .github/workflows/ - #72

Open
unixwhisperer wants to merge 1 commit into
mainfrom
security-lead/slack-stage1-workflow-codeowners
Open

unixwhisperer wants to merge 1 commit into
mainfrom
security-lead/slack-stage1-workflow-codeowners

Conversation

@unixwhisperer

Copy link
Copy Markdown
Collaborator

Stage 1 of the Slack integration you approved, plus the workflow co-ownership you asked for. No workflow file changes — CI behaviour is byte-for-byte unchanged, and Stage 2 is deliberately not here.

Slack Stage 1 — docs/ops/SLACK_INTEGRATION.md

Official GitHub app for Slack, not a custom bot. That choice does the security work for us: it's OAuth between GitHub and Slack, so there is no webhook URL and no bot token — nothing to store in secrets, nothing to commit, nothing to rotate. Secrets required: none. A custom bot would hand us a credential to own; this doesn't.

It also can't break the gate. Subscriptions are read-only consumers of GitHub events — there is no workflow step to fail, so Slack is structurally incapable of failing the security gate rather than merely configured not to.

The doc carries the exact per-channel commands. Defaults are stripped rather than assumed quiet: /github subscribe applies GitHub's defaults (issues, pulls, statuses, commits, releases, deployments), so each channel gets an explicit unsubscribe line. #flashstack-ci gets PR/review/merge activity plus FlashStack CI scoped to main; #flashstack-security gets Security Scan on main and little else.

One limitation I'd rather state than paper over

The official app has no subscription for Dependabot or code-scanning alerts. They're restricted to users with repo security access and aren't exposed as a Slack feature. So #flashstack-security gets Security Scan workflow outcomes, not the alert feed. §4.1 says so explicitly. If that gap matters to you, closing it is a Stage 2 job (an Actions step reading the alerts API), not something the official integration can do.

Nothing here is live on merge

Every command is a Slack slash command, not a repository file. §5 is your checklist — install the app, create the channels, /github signin, run the commands. I can't do any of it from the repo and haven't pretended otherwise.

One ask: run /github subscribe list features in each channel afterwards and paste the output. I'd like to replace the intended state in this doc with verified state.

Stage 2 — not implemented, blocked on #69

Both audit steps in security.yml still carry continue-on-error: true, so the job concludes success even with high/critical findings. PR #61's run did exactly that: several Severity: high printed, conclusion success. A Stage 2 summary built today would post a green "Security CI passed" at precisely that moment — automating false assurance, which is worse than no notification at all.

audit finds high/critical -> continue-on-error -> job SUCCESS -> Slack says "all clear"

After #69 removes the flag, the failure is real and a summary can be trusted. §7 has the full diagram. Stage 2 waits.

CODEOWNERS — one thing to flag before you merge

/.github/workflows/ is now @unixwhisperer @mattglory, as requested. But the semantics are worth being explicit about, because they're the opposite of what "co-owner" suggests:

GitHub satisfies a code-owner requirement when ANY ONE listed owner approves — not all of them. Today the line is @unixwhisperer alone, so my approval on a workflow change is mandatory. After this PR it becomes "Hillary or Matt". For reaching both of us, that's right and it's what you asked for. But read strictly, it widens who can approve a workflow change rather than narrowing it.

That's a small practical change on a two-person repo where you're the admin — and per Flashstack-ajv.2.5, enforce_admins is off, so admin bypass exists regardless. I'm not arguing against it; I've made the change. I just won't land a control that reads stronger than it is without saying so, and the file now carries that note inline.

If you do want both reviewers guaranteed, CODEOWNERS can't express it — it needs branch protection with required approvals >= 2, which is admin-side.

Both handles verified against the collaborator list rather than guessed: unixwhisperer (push) and mattglory (admin). CODEOWNERS syntax validated via the API — 0 errors.

Validation

  • git diff touches exactly two paths: CODEOWNERS, docs/ops/SLACK_INTEGRATION.md
  • .github/workflows/ unchanged — confirmed empty diff
  • Both workflow YAMLs still parse
  • Secret scan clean: no hooks.slack.com, no xox* token, no mnemonic
  • Slack is not a required check and appears in no workflow

🤖 Generated with Claude Code

Stage 1 of the approved Slack integration, plus the workflow co-ownership
Matt asked for. No workflow file changes, so CI behaviour is unchanged.

Slack (docs/ops/SLACK_INTEGRATION.md):
- Official GitHub app for Slack, not a custom bot: OAuth, so there is no
  webhook URL and no token to store, commit or rotate. Secrets required: none.
- Exact per-channel subscribe/unsubscribe commands for #flashstack-ci and
  #flashstack-security, defaults stripped rather than assumed low-noise.
- Records a real limitation rather than papering over it: the official app has
  no subscription for Dependabot or code-scanning alerts, so the security
  channel gets Security Scan workflow outcomes and not the alert feed.
- Activation is Slack-side and cannot be done from this repo. Nothing here is
  live on merge; §5 is the admin checklist for Matt.

Stage 2 is deliberately NOT implemented. It depends on #69: while both audit
steps carry continue-on-error, the job concludes success even with high/critical
findings (PR #61's run did exactly that), so a summary built today would post
false assurance into the security channel.

CODEOWNERS:
- /.github/workflows/ is now @unixwhisperer @mattglory.
- Comment states the semantics plainly: GitHub satisfies a code-owner rule when
  ANY ONE listed owner approves. This widens who can approve a workflow change
  from Hillary to Hillary-or-Matt; it does not require both. Guaranteeing two
  reviewers needs branch protection (required approvals >= 2), which is
  admin-side and still unverifiable from the repo (Flashstack-ajv.2.5).
@vercel

vercel Bot commented Sep 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
web Ready Ready Preview Sep 22, 2026 6:05am UTC

Request Review

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant