fix(slack-full): default gc slack upload to --via adapter - #5
Open
sjarmak wants to merge 27 commits into
Open
Conversation
## 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
There was a problem hiding this comment.
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 --viadefault toadapterand 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 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 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 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 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Flip
gc slack upload's--viadefault fromgctoadapter.Why
The
--via gcpath POSTs to/v0/city/{city}/extmsg/outbound-file, a route gc core never implemented (no handler ingascity-main; only/extmsg/outboundexists). Every default-path upload fails with404 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 gcstays available and is documented as needing the missing route; restore it as the default once/extmsg/outbound-filelands (tracked: gascitygc-oskcy).Test
python3 -m py_compileclean.gc slack upload --via adapterconfirmed delivering (uploaded 3 docs to #gascity-maintenance during triage).