diff --git a/.github/workflows/release-loop-gate.yml b/.github/workflows/release-loop-gate.yml
new file mode 100644
index 0000000..59afb72
--- /dev/null
+++ b/.github/workflows/release-loop-gate.yml
@@ -0,0 +1,63 @@
+name: Release loop-gate
+
+on:
+ push:
+ tags:
+ - 'loop-gate-v*'
+ workflow_dispatch:
+ inputs:
+ tag:
+ description: 'Tag to publish (e.g. loop-gate-v1.0.0)'
+ required: true
+ type: string
+
+permissions:
+ contents: read
+ id-token: write
+
+jobs:
+ test-and-publish:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+ with:
+ ref: ${{ github.event_name == 'workflow_dispatch' && format('refs/tags/{0}', github.event.inputs.tag) || github.ref }}
+
+ - uses: actions/setup-node@v7
+ with:
+ node-version: '22'
+ registry-url: 'https://registry.npmjs.org'
+ cache: 'npm'
+ cache-dependency-path: tools/loop-gate/package-lock.json
+
+ - name: Ensure npm supports trusted publishing (OIDC)
+ run: npm install -g npm@latest
+
+ - name: Install, build, test
+ working-directory: tools/loop-gate
+ run: |
+ npm ci
+ npm run build
+ npm test
+
+ - name: Skip if version already published
+ id: check
+ working-directory: tools/loop-gate
+ run: |
+ VERSION=$(node -p "require('./package.json').version")
+ if npm view "@cobusgreyling/loop-gate@${VERSION}" version 2>/dev/null; then
+ echo "Version ${VERSION} already on npm — skipping publish."
+ echo "skip=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "Publishing @cobusgreyling/loop-gate@${VERSION}"
+ echo "skip=false" >> "$GITHUB_OUTPUT"
+ fi
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: Publish to npm
+ if: steps.check.outputs.skip != 'true'
+ working-directory: tools/loop-gate
+ run: npm publish --access public --provenance
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 850cbab..15fd30c 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -2,11 +2,11 @@
Thank you to everyone who shipped docs, stories, examples, and tool fixes.
-*Generated 2026-07-16 via `node scripts/generate-contributors.mjs` — re-run after merges.*
+*Generated 2026-07-17 via `node scripts/generate-contributors.mjs` — re-run after merges.*
| Contributor | Highlights |
|-------------|------------|
-| [@KhaiTrang1995](https://github.com/KhaiTrang1995) | #274 feat(loop-worktree): add advisory path locking to prevent multi-loop collisions
#273 feat(loop-context): track daily token spend across runs, add --on-exceed hook |
+| [@KhaiTrang1995](https://github.com/KhaiTrang1995) | #291 feat(loop-gate): mechanical enforcement of the path denylist + auto-merge allowlist
#289 fix(build): drop chmod +x from build scripts, npm handles it on install |
| [@k-anushka14](https://github.com/k-anushka14) | #249 Add Codeium (Windsurf) appendix to primitives matrix (#228)
#248 Add loop-init validation checklist (#231) |
| [@Mahizhan-S](https://github.com/Mahizhan-S) | #251 docs: added Cursor Dependency Sweeper example #222
#217 docs: add npx quickstart for MCP server (#201) |
| [@50thycal](https://github.com/50thycal) | story: `quant-loop-out-of-time.md`
story: `quant-loop-the-verifier-problem.md` |
@@ -23,6 +23,7 @@ Thank you to everyone who shipped docs, stories, examples, and tool fixes.
| [@jiaobotao](https://github.com/jiaobotao) | #141 Add Hermes Agent example (daily-triage) + primitives matrix column |
| [@KevinGuo1007](https://github.com/KevinGuo1007) | #206 docs: add Zed appendix to primitives matrix |
| [@lorenzobosio](https://github.com/lorenzobosio) | #247 docs(examples): add Hermes PR Babysitter example |
+| [@THRISHAL12345](https://github.com/THRISHAL12345) | #296 feat(loop-context): add similarity-based stagnation detection |
| [@Zhang-986](https://github.com/Zhang-986) | #138 fix(loop-sync): honor json output flag |
## Your first PR
diff --git a/RELEASE_NOTES_DRAFT.md b/RELEASE_NOTES_DRAFT.md
index 5730676..323ec76 100644
--- a/RELEASE_NOTES_DRAFT.md
+++ b/RELEASE_NOTES_DRAFT.md
@@ -1,23 +1,34 @@
-# Release notes draft — since `loop-context-v1.2.0`
+# Release notes draft — since Discussion #294
-**Status:** Stub for next changelog-drafter run.
+**Status:** Stub for next changelog-drafter run / maintainer publish of `loop-gate`.
**Last published:** [Discussion #294](https://github.com/cobusgreyling/loop-engineering/discussions/294) (2026-07-16) — `loop-context` 1.2.0, `loop-worktree` 1.1.0.
-**Window:** 2026-07-16 → (next tag)
+**Since then on npm:** `loop-worktree` **1.2.0**, `loop-context` **1.3.0** (tags live).
+
+**Window:** 2026-07-16 → (next community announcement)
---
## Highlights
-_(changelog-drafter will fill from merges since `loop-context-v1.2.0`)_
+### Shipped on npm
+
+| Package | What shipped |
+|---------|--------------|
+| `@cobusgreyling/loop-worktree` **1.2.0** | Wait queue (`--wait`) + deadlock detection on path locks ([#295](https://github.com/cobusgreyling/loop-engineering/pull/295) / #292, @THRISHAL12345) |
+| `@cobusgreyling/loop-context` **1.3.0** | Similarity-based stagnation detection ([#296](https://github.com/cobusgreyling/loop-engineering/pull/296), @THRISHAL12345) |
-### Pending npm publish
+### Pending first publish
| Package | PR | What ships |
|---------|-----|------------|
-| `@cobusgreyling/loop-worktree` **1.2.0** | [#292](https://github.com/cobusgreyling/loop-engineering/pull/292) | Wait queue (`--wait`) + deadlock detection on path locks (@THRISHAL12345) |
-| `@cobusgreyling/loop-gate` **1.0.0** | [#291](https://github.com/cobusgreyling/loop-engineering/pull/291) | Mechanical denylist + auto-merge allowlist from `gate.yaml` (@KhaiTrang1995) |
+| `@cobusgreyling/loop-gate` **1.0.0** | [#291](https://github.com/cobusgreyling/loop-engineering/pull/291) | Mechanical denylist + auto-merge allowlist from `gate.yaml` (@KhaiTrang1995). Release workflow: `release-loop-gate.yml`. |
+
+### Docs / community
+
+- Architecture diagrams ([#288](https://github.com/cobusgreyling/loop-engineering/pull/288))
+- Cross-platform build fix ([#289](https://github.com/cobusgreyling/loop-engineering/pull/289))
---
@@ -26,4 +37,6 @@ _(changelog-drafter will fill from merges since `loop-context-v1.2.0`)_
```bash
npx @cobusgreyling/loop-init . --pattern daily-triage --tool grok
npx @cobusgreyling/loop-audit . --suggest
-```
\ No newline at end of file
+# after gate publish:
+# npx @cobusgreyling/loop-gate check --action auto-merge --paths README.md
+```
diff --git a/STATE.md b/STATE.md
index 95c2cd0..65ec9f6 100644
--- a/STATE.md
+++ b/STATE.md
@@ -1,11 +1,15 @@
# Loop State — loop-engineering reference
-Last run: 2026-07-16T12:00:00Z (scheduled maintenance)
+Last run: 2026-07-17T06:55:00Z (scheduled maintenance)
## High Priority (loop is acting or waiting on human)
- Maintain loop readiness score ≥ 58 (current: **100**, level **L3**).
-- npm publish in flight: `loop-worktree` 1.2.0, `loop-context` 1.3.0 (tags pushed this run). **`loop-gate` 1.0.0** still needs a `release-loop-gate.yml` workflow before first publish.
+- **First publish `loop-gate` 1.0.0**: release workflow added this run; after merge, tag `loop-gate-v1.0.0` and configure npm trusted publisher / `NPM_TOKEN`.
+- Review open contributor PRs (all CI green where applicable):
+ - [#303](https://github.com/cobusgreyling/loop-engineering/pull/303) — MCP `loop-gate` integration (@THRISHAL12345)
+ - [#302](https://github.com/cobusgreyling/loop-engineering/pull/302) — wire `loop-gate` into starter scripts (@THRISHAL12345)
+ - [#299](https://github.com/cobusgreyling/loop-engineering/pull/299) — loop-worktree week-two story; closes #229 (@k-anushka14)
## Watch List
@@ -13,17 +17,21 @@ Last run: 2026-07-16T12:00:00Z (scheduled maintenance)
- Collect a production story for Post-Merge Cleanup.
- Remaining Cursor doc gaps: [#220](https://github.com/cobusgreyling/loop-engineering/issues/220), [#223](https://github.com/cobusgreyling/loop-engineering/issues/223), [#224](https://github.com/cobusgreyling/loop-engineering/issues/224).
- Validate `loop-init` scaffolds on fresh projects across all patterns.
+- Optional: stack-map notice [#300](https://github.com/cobusgreyling/loop-engineering/issues/300) (external listing).
-## Housekeeping (2026-07-16 maintenance)
+## Housekeeping (2026-07-17 maintenance)
-- Merged [#288](https://github.com/cobusgreyling/loop-engineering/pull/288) (architecture diagrams) and [#296](https://github.com/cobusgreyling/loop-engineering/pull/296) (loop-context similarity stagnation).
-- No open PRs; CI green on `main`.
-- Pruned stale remote branches (automated daily-triage, star-history, merged feature/fix branches).
-- Bumped `loop-context` to 1.3.0 for npm publish after #296.
+- Pulled `main` (star-history [#301](https://github.com/cobusgreyling/loop-engineering/pull/301)).
+- CI green on `main`; readiness audit **100 / L3**.
+- Confirmed npm live: `loop-worktree` 1.2.0, `loop-context` 1.3.0 (cleared prior “in flight” notes).
+- Added `release-loop-gate.yml` + documented in `docs/RELEASE.md`.
+- Regenerated `CONTRIBUTORS.md` (19 contributors); pruned run-log entries older than 30 days.
+- Refreshed `RELEASE_NOTES_DRAFT.md` for post-1.2.0/1.3.0 window.
## Recent Noise (ignored this run)
-—
+- Dependabot / star-history automation noise (merged routinely).
+- StackMap outreach issue #300 — marketing, not product work.
---
-Run log: Updated by `.github/workflows/daily-triage.yml`. See `LOOP.md` for cadence and gates.
\ No newline at end of file
+Run log: Updated by `.github/workflows/daily-triage.yml`. See `LOOP.md` for cadence and gates.
diff --git a/docs/RELEASE.md b/docs/RELEASE.md
index bd9c3db..0e8ba49 100644
--- a/docs/RELEASE.md
+++ b/docs/RELEASE.md
@@ -1,6 +1,6 @@
# Release playbook — npm packages
-This repo ships eight public npm packages from `tools/`:
+This repo ships nine public npm packages from `tools/`:
| Package | Directory | Release tag |
|---------|-----------|-------------|
@@ -11,6 +11,7 @@ This repo ships eight public npm packages from `tools/`:
| `@cobusgreyling/loop-context` | `tools/loop-context` | `loop-context-v*` |
| `@cobusgreyling/loop-mcp-server` | `tools/mcp-server` | `loop-mcp-server-v*` |
| `@cobusgreyling/loop-worktree` | `tools/loop-worktree` | `loop-worktree-v*` |
+| `@cobusgreyling/loop-gate` | `tools/loop-gate` | `loop-gate-v*` |
| `@cobusgreyling/goal-audit` | `tools/goal-audit` | `goal-audit-v*` |
## One-time setup (trusted publishing — recommended)
@@ -26,6 +27,7 @@ Link npm to GitHub, then for **each package** on [npmjs.com](https://www.npmjs.c
| `@cobusgreyling/loop-context` | `cobusgreyling/loop-engineering` | `release-loop-context.yml` |
| `@cobusgreyling/loop-mcp-server` | `cobusgreyling/loop-engineering` | `release-loop-mcp-server.yml` |
| `@cobusgreyling/loop-worktree` | `cobusgreyling/loop-engineering` | `release-loop-worktree.yml` |
+| `@cobusgreyling/loop-gate` | `cobusgreyling/loop-engineering` | `release-loop-gate.yml` |
| `@cobusgreyling/goal-audit` | `cobusgreyling/loop-engineering` | `release-goal-audit.yml` |
Names must match **exactly** (case-sensitive). No `NPM_TOKEN` secret is required when trusted publishing is configured.
@@ -73,12 +75,16 @@ git push origin loop-mcp-server-v1.0.0
git tag loop-worktree-v1.0.0
git push origin loop-worktree-v1.0.0
+# loop-gate (path denylist + auto-merge allowlist from gate.yaml)
+git tag loop-gate-v1.0.0
+git push origin loop-gate-v1.0.0
+
# goal-audit (Goal Engineering readiness scorer — companion repo)
git tag goal-audit-v1.0.2
git push origin goal-audit-v1.0.2
```
-Workflows: `.github/workflows/release-loop-audit.yml`, `.github/workflows/release-loop-init.yml`, `.github/workflows/release-loop-cost.yml`, `.github/workflows/release-loop-sync.yml`, `.github/workflows/release-loop-context.yml`, `.github/workflows/release-loop-mcp-server.yml`, `.github/workflows/release-loop-worktree.yml`, `.github/workflows/release-goal-audit.yml`.
+Workflows: `.github/workflows/release-loop-audit.yml`, `.github/workflows/release-loop-init.yml`, `.github/workflows/release-loop-cost.yml`, `.github/workflows/release-loop-sync.yml`, `.github/workflows/release-loop-context.yml`, `.github/workflows/release-loop-mcp-server.yml`, `.github/workflows/release-loop-worktree.yml`, `.github/workflows/release-loop-gate.yml`, `.github/workflows/release-goal-audit.yml`.
## Verify after publish
@@ -90,6 +96,7 @@ npx @cobusgreyling/loop-sync --help
npx @cobusgreyling/loop-context --help
npx @cobusgreyling/loop-mcp-server --help
npx @cobusgreyling/loop-worktree --help
+npx @cobusgreyling/loop-gate --help
npx @cobusgreyling/goal-audit --help
mkdir /tmp/loop-init-test && cd /tmp/loop-init-test
diff --git a/loop-run-log.md b/loop-run-log.md
index 2792c0d..2b7900c 100644
--- a/loop-run-log.md
+++ b/loop-run-log.md
@@ -21,7 +21,6 @@ Append one entry per run. Prune entries older than 30 days.
-{"run_id":"2026-06-16T12:43:13Z","pattern":"daily-triage","duration_s":10,"items_found":1,"actions_taken":1,"escalations":0,"tokens_estimate":52000,"readiness_score":100,"outcome":"report-only","workflow_run":"27618341632"}
{"run_id":"2026-06-17T12:08:32Z","pattern":"daily-triage","duration_s":12,"items_found":1,"actions_taken":1,"escalations":0,"tokens_estimate":52000,"readiness_score":100,"outcome":"report-only","workflow_run":"27687793882"}
{"run_id":"2026-06-18T11:41:06Z","pattern":"daily-triage","duration_s":8,"items_found":2,"actions_taken":1,"escalations":1,"tokens_estimate":52000,"readiness_score":100,"outcome":"escalated","workflow_run":"27756924361"}
{"run_id":"2026-06-19T11:56:44Z","pattern":"daily-triage","duration_s":12,"items_found":1,"actions_taken":1,"escalations":0,"tokens_estimate":52000,"readiness_score":100,"outcome":"report-only","workflow_run":"27824250272"}
@@ -45,3 +44,4 @@ Append one entry per run. Prune entries older than 30 days.
{"run_id":"2026-07-14T09:41:52Z","pattern":"daily-triage","duration_s":8,"items_found":1,"actions_taken":1,"escalations":0,"tokens_estimate":52000,"readiness_score":100,"outcome":"report-only","workflow_run":"29322649617"}
{"run_id":"2026-07-15T09:44:51Z","pattern":"daily-triage","duration_s":9,"items_found":1,"actions_taken":1,"escalations":0,"tokens_estimate":52000,"readiness_score":100,"outcome":"report-only","workflow_run":"29405626165"}
{"run_id":"2026-07-16T09:50:58Z","pattern":"daily-triage","duration_s":6,"items_found":1,"actions_taken":1,"escalations":0,"tokens_estimate":52000,"readiness_score":100,"outcome":"report-only","workflow_run":"29488647294"}
+{"run_id":"2026-07-17T06:55:00Z","pattern":"scheduled-maintenance","duration_s":900,"items_found":4,"actions_taken":3,"escalations":0,"tokens_estimate":80000,"readiness_score":100,"outcome":"fix-proposed"}