Skip to content

fix(slack-full): default gc slack upload to --via adapter - #5

Open
sjarmak wants to merge 27 commits into
mainfrom
fix/slack-upload-default-adapter
Open

fix(slack-full): default gc slack upload to --via adapter#5
sjarmak wants to merge 27 commits into
mainfrom
fix/slack-upload-default-adapter

Conversation

@sjarmak

@sjarmak sjarmak commented Jul 11, 2026

Copy link
Copy Markdown
Owner

What

Flip gc slack upload's --via default from gc to adapter.

Why

The --via gc path POSTs to /v0/city/{city}/extmsg/outbound-file, a route gc core never implemented (no handler in gascity-main; only /extmsg/outbound exists). Every default-path upload fails with 404 page not found. --via adapter (files-upload-v2 direct) works, so this makes the command succeed out of the box.

Scope

One-line default change plus its help text. --via gc stays available and is documented as needing the missing route; restore it as the default once /extmsg/outbound-file lands (tracked: gascity gc-oskcy).

Test

python3 -m py_compile clean. gc slack upload --via adapter confirmed delivering (uploaded 3 docs to #gascity-maintenance during triage).

sjarmak and others added 27 commits June 17, 2026 12:46
## Summary
Publishes the `pr-pipeline` pack — author-side PR discipline (plan,
blast-radius, self-review, pre-push gate) plus two dispatched formulas,
as an importable pack. Resolves the 3-competing-branch fork by
extracting the content-superset onto a clean branch off main; the other
two branches are strict content-subsets and dropped. EXTRACT-only — the
source branches are whole-repo snapshots and were NOT merged.

## Contents (v0.1.0) — 6 formulas
- `mol-pr-start` — issue → structured plan (wrapper `pr plan`)
- `mol-pr-blast-radius` — impact-surface mapping (wrapper `pr
blast-radius`)
- `mol-pr-review` — outgoing-PR 11-category scorecard (wrapper `pr
review`)
- `mol-pr-ship` — pre-push gate w/ adversarial multi-reviewer panel
(wrapper `pr ship`)
- `mol-pr-triage` — scan/classify open issues into a ranked queue
(dispatched)
- `mol-pr-from-issue` — issue → branch-ready PR macro chain (dispatched)

Plus wrapper `pr` commands, an adoption-review template, and pack tests;
CI runs `pr-pipeline/tests`.

## mol-pr-from-issue port (Scheme A)
Ported into its canonical home here. Renamed the colliding `issue` var →
`issue_number` (caller-supplied GitHub issue number) to avoid the
formulas-v2 reserved `issue` routed alias; kept `contract = "graph.v2"`
for lifecycle/halt/Slack semantics. Faithful to the formula's
caller-driven entry-point design (not convoy-routed).

## Validation
build + `go vet` clean; pack pytest pass; registry-validate 21 hashes
ok. (2 pre-existing baseline failures in `github/tests` — unrelated,
untouched; this PR's CI re-verifies.)

---------

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
…config-purity (gastownhall#118)

## Summary
Follow-up to gastownhall#117 (review finding gpk-4l3q). Makes `mol-pr-from-issue`
(phase=vapor) portable to consumer cities: replaces 5 author-absolute
`/home/ds/...` paths with `$HOME` / `${GC_*}` / pack-relative refs, and
makes the gas-city-specific protected-path list configurable.
Pre-graduation config-purity fix; no behavior change in the author
environment.

## Changes
- `pr-pipeline/formulas/mol-pr-from-issue.formula.toml`: 5 hardcoded
paths → portable refs; protected-paths configurable.
- `pr-pipeline/tests/test_pr_pipeline_formulas.py`: +tests asserting no
author-absolute paths remain.

## Validation
10 tests pass; three-dot diff = 2 files, +56/−22, `pr-pipeline/` only.

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
… split 1/2) (gastownhall#108)

Salvages the net-new `slack-full/doctor` preflight from gastownhall#90, which is
being superseded.

Per the agreed 2-PR split, this is the **doctor-preflight half** — 10
net-new files (4 `check-*.sh` scripts + their `doctor.toml` manifests),
additive only, no edits to existing files. The inbound-scan-test half is
split into a separate follow-up PR (it needs the escalating-window port
first).

**Scope (additive, 10 files, +102):**
- `slack-full/doctor/check-{binaries,env,funnel,gc,python}.sh` +
`binaries/env/funnel/gc/python/doctor.toml`

**Checks:** executable modes preserved; `sh -n` clean on all scripts;
`tomllib` parses all manifests. File-disjoint from the in-flight
registry overhaul (gastownhall#106) — touches neither `registry.toml` nor existing
`slack-full` files.

Supersedes gastownhall#90.

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
…patch (gastownhall#119)

## Problem

The slack-full adapter already downloads inbound Slack attachments to
local disk (`downloadSlackFiles`, with full SSRF / bot-token handling),
but the address-by-handle dispatch path (`dispatchToAliasedSession`)
extracts only `msg.Text` and ignores `msg.Attachments`. So when a user
`@<agent>:`-addresses a session with an image, the image never reaches
the aliased session — only the text does.

## Fix

In `dispatchToAliasedSession`, iterate the already-populated
`inbound.Attachments` and append them to the dispatch body the same way
channel-bound sessions receive them: an `Attachments (N):` block listing
each name + MIME + local `file://` path, run through the same
`neutralizeMarkupBoundaries` sanitization as the text. The aliased agent
then reads the local file (vision works).

Minimal (~25 lines), no gc-core session-message API change — native
content-blocks would require one and are out of scope here.

## Tests

- `TestDispatchToAliasedSessionIncludesAttachments` — attachments appear
in the dispatch body.
- `TestDispatchToAliasedSessionZeroAttachmentsUnchanged` — no
attachments → body unchanged.
- `go build ./...`, `go vet ./...`, `go test -race ./...` all pass.

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
## Summary

Stamps the **pr-pipeline** pack into `registry.toml` with its canonical
content hash, so the author-side PR-discipline pack is installable via
the registry — not just by direct-path import.

The pack files already live on `main` (commit
`26614e665705b33f586c8bc41ef73592548114fd`, gastownhall#118); this PR adds the
missing **release stamp** that makes `0.1.0` an installable release.

## What's in the pack

Four author-side formulas + their wrapper commands:
- `mol-pr-start` — issue → plan
- `mol-pr-blast-radius` — impact-surface mapping
- `mol-pr-review` — outgoing-PR self-review (11-category scorecard)
- `mol-pr-ship` — pre-push gate (simplify → review → check)

## Registry entry

```
[[pack]]
  name = "pr-pipeline"
  source = "https://github.com/gastownhall/gascity-packs//pr-pipeline"
  source_kind = "git"
  [[pack.release]]
    version = "0.1.0"
    ref = "main"
    commit = "26614e665705b33f586c8bc41ef73592548114fd"
    hash = "sha256:92b4debf702222eb5fbb516e78ebd6397b1bdb98c67df2e542522a8faaa337fe"
```

## Verification

- Hash computed via `gc pack release stamp` (canonical content hash,
mode-aware).
- `gc pack release validate registry.toml` → **registry release hashes
ok (22 checked)**.
- `validate_registry.py registry.toml` → **ok**.

Sibling `pr-review` (maintainer-side `mol-adopt-pr`) is a planned
fast-follow.

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
)

## Summary

Adds the **`contributing`** pack — the external-contributor lifecycle
for
`gastownhall/gascity`, distributed as a Gas City pack. It gives an
outside
contributor the full journey of landing work upstream and routes each
step to
the command that runs it:

1. **write a best-practice issue** — this pack's `write-issue` skill
(net-new)
2. **find priority work** — `pr-pipeline: mol-pr-triage`
3. **plan & open a PR** — `pr-pipeline: pr plan` + `pr blast-radius`
4. **self-review before pushing** — `pr-pipeline: pr review` + `pr ship`

Only **step 1 is net-new.** Steps 2–4 are already delivered by
`pr-pipeline`, so
this pack **composes** it via `[imports.pr-pipeline]` rather than
re-implementing
— the `contributing` skill stitches the four steps into one lifecycle
with two
entry points (PR a priority issue / PR your own issue).

## Contents

- `skills/write-issue/SKILL.md` — contributor issue-writing discipline:
verify
the bug on current `main` first, required duplicate search,
`engdocs/design`
invariant alignment, reconciler/dispatch blast-radius, file:line root
cause,
  ≥2 fix candidates, body template, anti-patterns, pre-flight checklist.
- `skills/contributing/SKILL.md` — the lifecycle map (both entry
points).
- `pack.toml` (schema 2, `[imports.pr-pipeline]`), README, doctor set
(gc/gh/git),
  tests.

## Verification

- **Gates:** `contributing/tests` 4/4, repo-wide `tests/` 52/52,
`pr-pipeline/tests`
  10/10, `validate_registry.py` ok.
- **Cross-pack refs checked against pr-pipeline:** `mol-pr-from-issue`
exists;
`gc sling … --formula` matches pr-pipeline's own documented syntax; the
  `pr plan/blast-radius/review/ship` commands all exist.
- **Repo refs checked against `gastownhall/gascity`:** the prescribed
labels
(`kind/bug|feature|docs`, `priority/p1–p3`, `status/needs-triage`) all
exist,
  and `engdocs/design/` is real — so `gh issue create --label` and the
  design-alignment step won't dead-end a contributor.
- **Config-pure / no role assumptions / no private SDK** per the pack
invariants;
  composes (does not duplicate) pr-pipeline.

A `0.1.0` registry release will be stamped as a follow-up once this
merges
(matching the pr-pipeline release flow).

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
## Summary

Stamps the **contributing** pack into `registry.toml` with its canonical
content
hash, so `0.1.0` is an installable registry release (not just a
direct-path
import). The pack files merged in gastownhall#124 (`16f8297`); this adds the
release stamp.

## Verification

- Hash computed via `gc pack release stamp`.
- `gc pack release validate registry.toml` → registry release hashes ok
(23 checked).

Follow-up to gastownhall#124, mirroring the pr-pipeline 0.1.0 release.

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
Replace the pr-pipeline delegation with the pack's own gas-city
contributor skills so the pack stands alone — no [imports.*], no
dependency on internal agents or maintainer-only tooling.

- pack.toml -> 0.2.0, schema=2, zero imports
- new skills find-work, plan-pr, blast-radius, check, ship (ported
  from gas-city's own contributor standards; embedded agent knowledge
  extracted into self-applicable checklists a contributor's own
  coding agent runs by reading the skill)
- check bakes in the full B1-B36 adoption-review audit (B32 reserved/
  unused; active set B1-B31, B33-B36) + mechanical gates +
  baseline-vs-regression classification
- blast-radius carries the gas-city impact dimensions (callers/
  execution-contexts, callees, config-field sync, six domain
  boundaries, concurrency, cross-repo contracts)
- plan-pr is adoption-review-aware (competing-PR + architectural-
  refactor/superseding gates, design-capture discipline, B-rule
  convention triggers, test-tier strategy)
- find-work adds actionability tiers + 3-method competing-PR
  detection + maintainer-decision gates
- ship is the pre-push self-review gate that STOPS before push
- write-issue/check/blast-radius/plan-pr use a fork-aware base ref
  (origin/main when origin is gastownhall/gascity, else upstream/main)
  so the commands work from a fork clone too
- contributing lifecycle map routes to THIS pack, not pr-pipeline
- README drops the pr-pipeline pairing (kept as a footnote for cities
  wanting generic discipline)
- tests renamed test_contributing_* to avoid the pytest basename
  collision with sibling packs; ci.yml now runs contributing/tests

Gates green: pytest contributing/tests (5 passed), validate_registry ok.
Stamps the self-contained contributing 0.2.0 into registry.toml with its
canonical content hash, and updates the pack description to reflect that the
pack now stands alone (no pr-pipeline composition) and stops before opening
the PR. Pack files are in the preceding commit; this adds the release entry
so 0.2.0 is an installable registry release.

Hash computed via gc pack release hash; validate_registry.py ok.
…ing-0.2.0

release(contributing): self-contained gas-city pack 0.2.0
Three skill descriptions (contributing, find-work, ship) used a bare
"Self-contained: ..." — the unquoted ": " makes a YAML parser read the
scalar as a nested mapping ("mapping values are not allowed here"), which
breaks GitHub's front-matter render and any YAML-based skill loader.
Replace with an em-dash to match the other skills.

- pack.toml -> 0.2.1
- harden test_contributing_skill_frontmatter: lint every skill's
  front-matter for unquoted ": " in single-line scalars (the exact
  bug class), so this can't regress.

pytest contributing/tests: 6 passed.
Make the skills resistant to staleness so they don't rot as gastownhall/gascity
evolves:
- check: drop all originating-PR-number citations from the B-rules; keep the
  illustrative bug examples (reworded as "e.g. ..."). Drop drift-prone counts
  ("five test tiers", "11 sub-checks"). Replace ~300s/~600s build-timeout
  numbers with durable phrasing.
- plan-pr: replace a hardcoded past-PR-title search string (used as the
  architectural-refactor gate) with a keyword-driven search; drop the named AI
  models (Claude/Codex/Gemini) from "what the maintainer will check".
- ship: drop the named automated-reviewer product.
- blast-radius: drop the drift-prone "six domain boundaries" count.

Internal symbol/path anchors (e.g. newCityRuntime, MemStore) are kept on
purpose — naming gas-city's real patterns is what makes the audit concrete; the
rule still teaches if a symbol is later renamed. No behavior change.
YAML-safe front matter + durability pass. Pack files in the preceding two
commits; content hash via gc pack release hash.
…0.2.1-yaml

fix(contributing): YAML-safe skill front matter (0.2.1)
A drop-in pack that disaggregates project-level work scoping out of the mayor.
Adds one always-on, rig-scoped project-lead role per rig:

- bounded to a single rig's beads; reads persona/focus/escalation triggers
  from <rig>/.gc/project-brief.md (each project owns its scoping context)
- triages its rig and dispatches its own ready, in-scope work directly
  instead of routing every dispatch through the mayor
- writes severity-labeled rollup beads; a condition-triggered order delivers
  the escalate ones via extmsg with no second agent in the path

The mayor stays unchanged and handles only cross-cutting work + escalations.
Human replies route straight back to the bound project-lead.

Composes with any slack adapter pack (slack-full/slack-channel/slack-mini) —
ships only the oversight role + escalation machinery, not a slack bridge.
Stamps the new oversight-rig pack (rig-scoped project-lead + deterministic
escalation) into registry.toml with its canonical content hash.
…g-pack

feat(oversight-rig): new pack — rig-scoped project-lead + deterministic escalation (0.1.0)
…t (gpk-9ln5)

Add a contributing/formulas/ dir with five thin wrapper formulas so a city
can drive the gas-city contributor lifecycle as gc-orchestrated methods, not
just agent-read skills. Each wrapper is orchestration only — root-bead run
state, output paths under .gc/contributing/, blocking early-exit — and
delegates every standard to its sibling skill (the single source of truth):

  mol-contributing-triage       -> find-work
  mol-contributing-start        -> plan-pr      (blocking gates)
  mol-contributing-blast-radius -> blast-radius
  mol-contributing-review       -> check
  mol-contributing-ship         -> ship         (stops at readiness; never pushes)

write-issue has no formula peer — issue authoring is upstream of the PR flow.

The pack stays self-contained: formulas reference the pack's own skills via
${GC_PACK_DIR}/skills/<skill>/SKILL.md — no [imports.pr-pipeline], no author
host paths. Modeled on the pr-pipeline mol-pr-* peers but kept thin (no
restated audit/dimension/scorecard text): 674 lines vs the peers' 1798.

- pack.toml: version 0.2.1 -> 0.3.0; header documents the two modes
- README: "Two ways to run it" section + formula map + updated contents tree
- tests: test_contributing_formulas.py — each formula parses, references a
  real sibling skill, stays import-free, and the ship STOP guard is present

Registry release (registry.toml 0.3.0 stamp) is a follow-up chore after merge:
it pins the merged main commit + content hash, like the pr-pipeline (gastownhall#122) and
oversight-rig release commits.
…mulas

feat(contributing): mol-contributing-* gc-orchestrated formula set
…arning (gpk-hdnr) (gastownhall#132)

Salvages the escalating inbound-scan window ladder + truncation warning
into `slack-full` (3 files), split from the closed reconcile PR gastownhall#90
(`bd-gpk-yipm`).

- `slack-full/scripts/slack_intake_common.py` — replaces the single 2h
inbound-scan shot with an escalating window ladder + a truncation
warning when results are clipped.
- `slack-full/tests/test_inbound_event_scan.py` — new coverage for the
ladder + truncation.
- `slack-full/tests/gc_mock.py` — mock support.

Cherry-picked onto current `gastownhall/gascity-packs` main (clean
base). Full slack-full suite: 85/85 pass.

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
…isp (port of gascity#3416) (gastownhall#121)

## What
The deacon + refinery patrol startup blocks and formulas query the
current/assigned patrol wisp with `gc bd list … --type=wisp`. `wisp` is
**not a valid bd type** — wisp roots are `issue_type=molecule` — so the
query matches nothing, the `CURRENT_WISP`/`ASSIGNED_WISP` lookup always
returns empty, and a **fresh patrol wisp is poured every restart** (the
leak @quad341 confirmed is still shipping). This substitutes
`--type=wisp → --type=molecule` on the 10 real queries (deacon +
refinery prompts + formulas) plus one doc reference. The witness
template was already fixed; this brings the other two patrol agents in
line. The explanatory "never use `--type=wisp`" warnings are
intentionally left.

## Provenance
Ports the query fix from `gastownhall/gascity#3416`, which @quad341
reviewed and confirmed correct, then closed because #3335 moved the
gastown pack out of gascity into this repo. Re-rooted to this repo's
`gastown/…` paths, authored by us.

## Note on scope — reconcile-to-exactly-one
gascity#3416 also added a witness-style **reconcile-to-exactly-one (burn
the surplus)** startup block to deacon + refinery. This PR is just the
`--type` query fix, which stops *new* leaks. The deacon/refinery
currently lack the surplus-burn the witness has
(`witness/prompt.template.md` Step 1), so any wisps already leaked from
prior `--type=wisp` restarts won't be auto-cleaned. Happy to add that
surplus-burn block in this PR if you'd like it here — say the word and
I'll mirror the witness pattern into both.

Co-authored-by: Brandon Martin <b+git@heyomayeah.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…mayor-mode umbrella (gastownhall#143)

Renames the contributing-pack lifecycle skills/formulas (start-contribution, plan-implementation, map-blast-radius, fine-tune, review), drops the role name, and adds the orchestrate-contribution mayor-mode umbrella. Includes a 0.4.0 migration note (rename table + upgrade steps) and resume-safe report paths (mint-once, persisted to root-bead notes, re-resolved per step). 22/22 pack tests pass.

Co-authored-by: Emmanuel Sciara <esciara@users.noreply.github.com>
…gastownhall#75)

## What

Adds a way to **compute** the `registry.toml` content hash so new packs
can be
registered. Closes the mechanism gap in gastownhall#53.

`[[pack.release]]` entries carry a `hash = "sha256:…"` that
`validate_registry.py`
enforces against the pack tree at the pinned `commit` (via the existing
`git_pack_content_hash`). Until now there was no way to *produce* that
value, so
packs already on `main` but absent from the catalog (`slack-channel`,
`slack-mini`, and the wave-1 builtins) couldn't be added.

This exposes the **already-canonical** algorithm — the computed hashes
reproduce
the live `cass` and `slack-full` pins exactly — rather than inventing a
new one.

## Usage

```bash
# Print the content hash for a pack at a commit (default: HEAD)
python3 validate_registry.py --compute <pack> --commit <ref>

# Print a ready-to-paste [[pack]] block with the correct hash + pin
python3 validate_registry.py --emit-entry <pack> \
  --version 0.1.0 \
  --pack-description "One-line catalog description." \
  --release-description "Initial <pack> pack release."
```

## Notes

- **Backward compatible**: no-arg `python3 validate_registry.py`
validates exactly
  as before — CI step unchanged.
- TOML basic-string escaping on emitted free-text fields; reuses the
hardened
  `git_bytes` helper for ref resolution.
- README documents the publish-a-pack-to-the-registry flow (answering
gastownhall#53 Ask 1).
- A maintainer still re-pins releases to a single published commit at
release
  time; this just removes the "we can't generate the hash" blocker.

@julianknutsen — this is the packs-side compute/stamp helper from gastownhall#53.
Happy to
align it with the `gc` commands you mentioned (or fold it in) if you'd
rather the
canonical tool live there; opening this so the wave-1 +
slack-channel/slack-mini
registrations aren't blocked in the meantime.

## Test plan

- [x] `python3 -m pytest tests -q` → 7 passing (incl. round-trip +
quote-escaping regression)
- [x] `python3 validate_registry.py` → `registry.toml: ok`
- [x] `--compute cass --commit 788b6e8…` reproduces the live pinned hash
- [x] `--emit-entry slack-mini` block splices into registry.toml and
validates

---------

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
…es errors (gastownhall#89)

`slackPutFileBytes` error paths embedded the full pre-signed
`getUploadURLExternal` URL — including its auth token — in error strings
that propagate to logs and agent transcripts.

- redact via `url.Parse` + `RawQuery` strip before formatting the error
(with test)
- audited `slack-channel` and `slack-mini`: neither has the
`slackPutFileBytes` / `getUploadURLExternal` pattern, no port needed

Port of a fork-local fix originally authored against the pre-split
`slack-pack/` layout, re-based fresh onto upstream `main` per the tiered
restructure (same pattern as gastownhall#69/gastownhall#72). `go test -race` clean.

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
…d_message_id_for_session (redo of gastownhall#64) (gastownhall#150)

## Summary
Redo of gastownhall#64 on a clean base. Fixes newest-first transcript lookup in
`find_latest_inbound_message_id_for_session` (consumes
gastownhall/gascity#3128) and reconciles slack-pack ↔ slack-full.

## Validation
- 86 slack-full pytests pass (incl. a new 130-entry e2e); review gate
re-verified PASS.

Supersedes gastownhall#64 (stale/conflicting base; this branch is rebased clean on
main).

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
…ownhall#88 onto clean main (gastownhall#151)

## Summary
Salvage of gastownhall#88 onto fresh main. Six slack-pack hardening commits:
dispatch-drops observability, thread-context TTL+cap, OAuth/SIGHUP
generation-stamps, confined_open symlink race, writing_hand reaction;
gofmt. Dropped superseded/stale-base commits (doctor, escalating-scan, 3
tiering commits).

## Validation
- adapter `go build`/`vet`/`test -race` + cli + gofmt + 85 pytests pass.
- Note: pre-existing `-race` flakiness on thread_context/thread_teardown
reproduces on upstream/main too (candidate for a separate flaky-test
bead).

Supersedes gastownhall#88 (stale/conflicting base; salvaged clean on main).

---------

Co-authored-by: sjarmak <sjarmak@users.noreply.github.com>
The default --via gc path POSTs to /v0/city/{city}/extmsg/outbound-file,
a route gc core never implemented, so every default upload fails with
404. --via adapter (files-upload-v2 direct) works. Flip the default so
the command works out of the box; restore gc once the route lands.

Refs: gascity gc-oskcy
Copilot AI review requested due to automatic review settings July 11, 2026 16:54

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR changes defaults and tooling across the packs repo, notably making gc slack upload succeed by default via the adapter path, while also adding new registry/pack authoring utilities, expanding Slack adapter reliability/observability behaviors, and introducing multiple new packs (pr-pipeline, contributing, oversight-rig) with corresponding CI coverage.

Changes:

  • Flip gc slack upload --via default to adapter and update CLI help text accordingly.
  • Improve Slack adapter/CLI correctness and operator ergonomics (thread-current transcript ordering/limits, inbound-event scan windows, registry reload race defense, thread context cache eviction, confined file open, /healthz drop counter + summary logging, “doctor” checks).
  • Add and register new packs (pr-pipeline, contributing, oversight-rig), plus validator CLI enhancements/tests and CI updates to run the new suites.

Reviewed changes

Copilot reviewed 93 out of 101 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
validate_registry.py Adds commit resolution, TOML escaping, hash/entry emit helpers, and CLI flags for hashing/emitting entries.
tests/test_validate_registry.py Adds unit tests for the new validator helper functions and CLI modes.
slack-full/tests/test_slack_pack_e2e.py Adds regression coverage for newest-inbound threading on large transcripts; clarifies existing comment.
slack-full/tests/test_inbound_event_scan.py New tests covering escalating inbound-event scan windows and truncation warnings.
slack-full/tests/gc_mock.py Enhances mock to honor since/limit/total semantics for events and order/limit semantics for transcript.
slack-full/scripts/slack_intake_common.py Implements escalating scan windows and updates transcript fetch to order=desc/limit=500.
slack-full/scripts/slack_chat_upload.py Switches --via default to adapter and updates help text to match.
slack-full/scripts/slack_chat_bind_room.py Updates the operator protocol wording/emoji guidance in the system reminder.
slack-full/README.md Clarifies adapter-owned stores and enriches /healthz operator guidance.
slack-full/doctor/python/doctor.toml New doctor check metadata for python availability/version.
slack-full/doctor/gc/doctor.toml New doctor check metadata for gc CLI availability.
slack-full/doctor/funnel/doctor.toml New doctor check metadata for Funnel ingress.
slack-full/doctor/env/doctor.toml New doctor check metadata for required env vars.
slack-full/doctor/check-python.sh New doctor check script validating python3 3.11+.
slack-full/doctor/check-gc.sh New doctor check script validating gc is on PATH.
slack-full/doctor/check-funnel.sh New doctor check script validating a Funnel rule exists for the adapter port.
slack-full/doctor/check-env.sh New doctor check script validating required adapter env vars are present.
slack-full/doctor/check-binaries.sh New doctor check script validating adapter/CLI binaries are built.
slack-full/doctor/binaries/doctor.toml New doctor check metadata for built binaries.
slack-full/adapter/thread_handle_stickiness.go Formatting-only alignment tweaks.
slack-full/adapter/thread_context.go Adds TTL + cap eviction to thread context cache; introduces injectable clock for tests.
slack-full/adapter/thread_context_test.go Adds TTL/cap eviction tests and minor formatting alignment updates.
slack-full/adapter/subteam_mention_prefix.go Comment indentation/formatting fixes.
slack-full/adapter/subteam_alias_map.go Formatting-only alignment tweaks.
slack-full/adapter/subteam_alias_map_test.go Formatting-only alignment tweaks.
slack-full/adapter/room_launch_dispatch_test.go Formatting-only alignment tweaks.
slack-full/adapter/rig_dispatch_test.go Formatting-only alignment tweaks.
slack-full/adapter/registry_reload.go Adds retry commit path for apps registry commit vs in-process Set race.
slack-full/adapter/interactions_test.go Formatting-only alignment tweaks.
slack-full/adapter/double_handle_dispatch_test.go Formatting-only alignment tweaks.
slack-full/adapter/dispatch_drops.go New dropped-dispatch counter, /healthz reporting, and periodic summary logger.
slack-full/adapter/dispatch_drops_test.go New tests for /healthz body shape and summary logging behavior.
slack-full/adapter/confined_open.go New openat-based “open beneath root” helper to harden confined file reads.
slack-full/adapter/confined_open_test.go New tests for open-beneath confinement behavior and readConfinedFile integration.
slack-full/adapter/apps_registry.go Adds generation-stamped Stage/Commit to prevent stale snapshot installs; retries in Reload.
slack-full/adapter/apps_registry_test.go Adds tests pinning stale snapshot refusal and retry converge behavior.
registry.toml Adds registry entries/releases for pr-pipeline, contributing, oversight-rig.
README.md Documents contributor workflow packs and new validate_registry CLI usage for publishing.
pr-pipeline/tests/test_pr_pipeline_formulas.py New tests pinning formula variable binding/purity expectations.
pr-pipeline/README.md New pack documentation for PR pipeline usage and contents.
pr-pipeline/pack.toml New pack manifest for pr-pipeline.
pr-pipeline/formulas/mol-pr-blast-radius.formula.toml New blast-radius mapping formula for the pack.
pr-pipeline/commands/pr/ship/run.sh New wrapper command to sling mol-pr-ship.
pr-pipeline/commands/pr/ship/help.md Help for gc <binding> pr ship.
pr-pipeline/commands/pr/review/run.sh New wrapper command to sling mol-pr-review.
pr-pipeline/commands/pr/review/help.md Help for gc <binding> pr review.
pr-pipeline/commands/pr/plan/run.sh New wrapper command to sling mol-pr-start.
pr-pipeline/commands/pr/plan/help.md Help for gc <binding> pr plan.
pr-pipeline/commands/pr/blast-radius/run.sh New wrapper command to sling mol-pr-blast-radius.
pr-pipeline/commands/pr/blast-radius/help.md Help for gc <binding> pr blast-radius.
oversight-rig/README.md New pack documentation describing the rig-scoped project-lead model and escalation.
oversight-rig/pack.toml New pack manifest + named_session template for project-lead.
oversight-rig/orders/patrol-project-leads.toml New cooldown order to nudge project-leads.
oversight-rig/orders/escalate-rollups.toml New condition order to deliver severity:escalate rollups mechanically.
oversight-rig/assets/scripts/test_resolve_rig_channel.py New tests for rig→channel resolver library/CLI behavior.
oversight-rig/assets/scripts/resolve_rig_channel.py New resolver to find a rig’s project-lead binding and emit outbound params.
oversight-rig/assets/scripts/nudge-project-leads.sh New script to nudge all active project-lead sessions.
oversight-rig/assets/scripts/has-undelivered-escalates.sh New condition-check script for undelivered escalation rollups.
oversight-rig/assets/scripts/deliver-rollup.sh New delivery script to POST rollups to extmsg and label beads delivered.
oversight-rig/agents/project-lead/prompt.template.md New project-lead role prompt (rig-bounded triage + rollup writing).
oversight-rig/agents/project-lead/project-brief.template.md New template for per-rig project brief.
oversight-rig/agents/project-lead/agent.toml New agent config for project-lead role.
oversight-rig/.gitignore New ignore rules for caches and local state.
gastown/formulas/mol-refinery-patrol.toml Updates bead type references from wisp→molecule in embedded shell snippets.
gastown/formulas/mol-deacon-patrol.toml Updates bead type references from wisp→molecule in embedded shell snippets.
gastown/agents/refinery/prompt.template.md Updates bead type references from wisp→molecule in embedded shell snippets.
gastown/agents/deacon/prompt.template.md Updates bead type references from wisp→molecule in embedded shell snippets.
contributing/tests/test_contributing_skill_frontmatter.py New tests for skill front matter presence and YAML-safety.
contributing/tests/test_contributing_pack_structure.py New tests for self-contained pack structure and executable doctor scripts.
contributing/tests/test_contributing_orchestration.py New tests pinning the orchestration map/gates requirements.
contributing/tests/test_contributing_formulas.py New tests pinning formula set, delegation, and stop guards.
contributing/skills/start-contribution/SKILL.md New entry router skill defining lifecycle gating and routing.
contributing/skills/orchestrate-contribution/SKILL.md New mayor-mode orchestration skill that sequences per-step formulas and gates.
contributing/skills/map-blast-radius/SKILL.md New blast-radius mapping skill for gascity contributions.
contributing/skills/find-work/SKILL.md New skill to triage and select a suitable gascity issue for contributors.
contributing/pack.toml New pack manifest describing modes (skills/formulas/mayor loop) and constraints.
contributing/formulas/mol-contributing-review.formula.toml New thin wrapper formula delegating standards to the review skill.
contributing/formulas/mol-contributing-plan-implementation.formula.toml New thin wrapper formula delegating standards to the plan-implementation skill, with blocking gates.
contributing/formulas/mol-contributing-map-blast-radius.formula.toml New thin wrapper formula delegating standards to the map-blast-radius skill.
contributing/formulas/mol-contributing-fine-tune.formula.toml New thin wrapper formula delegating standards to the fine-tune skill, with explicit no-push guard.
contributing/formulas/mol-contributing-find-work.formula.toml New thin wrapper formula delegating standards to the find-work skill.
contributing/doctor/git/doctor.toml New doctor check metadata for git availability.
contributing/doctor/gh/doctor.toml New doctor check metadata for gh availability.
contributing/doctor/gc/doctor.toml New doctor check metadata for gc availability.
contributing/doctor/check-git.sh New doctor script validating git on PATH.
contributing/doctor/check-gh.sh New doctor script validating gh on PATH.
contributing/doctor/check-gc.sh New doctor script validating gc on PATH.
.github/workflows/ci.yml Expands Python test run to include contributing and pr-pipeline suites.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread registry.toml
Comment on lines +198 to +202
[[pack]]
name = "pr-pipeline"
description = "Author-side PR discipline as a pack: planning, blast-radius mapping, outgoing-PR scorecard review, and pre-push gating (mol-pr-start / mol-pr-blast-radius / mol-pr-review / mol-pr-ship)."
source = "https://github.com/gastownhall/gascity-packs//pr-pipeline"
source_kind = "git"
Comment thread registry.toml
Comment on lines +211 to +215
[[pack]]
name = "contributing"
description = "The external-contributor lifecycle for gastownhall/gascity — write a good issue, find priority work, plan a PR, map its blast radius, and self-review against the codebase audit. Each step produces an artifact you act on; the pack stops before pushing — opening the PR is your call. Self-contained: gas-city's actual standards (the B-rule adoption-review audit, blast-radius dimensions, test tiers) are baked into the skills; no imports."
source = "https://github.com/gastownhall/gascity-packs//contributing"
source_kind = "git"
Comment thread validate_registry.py
Comment on lines +294 to +307
return (
"[[pack]]\n"
f'name = "{_toml_escape(name)}"\n'
f'description = "{_toml_escape(description)}"\n'
f'source = "{_toml_escape(source)}"\n'
'source_kind = "git"\n'
"\n"
" [[pack.release]]\n"
f' version = "{_toml_escape(version)}"\n'
f' ref = "{_toml_escape(ref)}"\n'
f' commit = "{commit}"\n'
f' hash = "{content_hash}"\n'
f' description = "{_toml_escape(release_description)}"\n'
)
Comment thread .github/workflows/ci.yml
Comment on lines 40 to 42
- name: Run Python pack tests
run: python3 -m pytest tests gascity/tests discord/tests github/tests slack-full/tests slack-channel/tests -q
run: python3 -m pytest tests contributing/tests gascity/tests discord/tests github/tests slack-full/tests slack-channel/tests pr-pipeline/tests -q

Comment on lines +17 to +20
if ! tailscale funnel status 2>/dev/null | grep -q ":${port}\b"; then
echo "no Tailscale Funnel rule forwarding to adapter port ${port}"
echo "Re-add it (e.g. tailscale funnel --bg ${port}) — the rule is not declared in the city, so a host reboot or 'tailscale funnel reset' silently stops Slack traffic."
exit 2
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.

4 participants