Skip to content

feat(github-automation): branch strategy integration with NATS observability - #901

Closed
POWERFULMOVES wants to merge 71 commits into
PMOVES.AI-Edition-Hardened-Integrationsfrom
docs/github-automation
Closed

POWERFULMOVES wants to merge 71 commits into
PMOVES.AI-Edition-Hardened-Integrationsfrom
docs/github-automation

Conversation

@POWERFULMOVES

@POWERFULMOVES POWERFULMOVES commented Mar 13, 2026 •

Copy link
Copy Markdown
Owner

Summary

Implements comprehensive integration between GitHub automation services and branch strategy enforcement with NATS event-driven architecture for real-time observability.

What's Included

Phase 1 - PR Workflow Enhancement:

  • ✅ NATS event publishing in pr-base-validation.yml workflow
  • ✅ Promotion Makefile with NATS broadcasting
  • ✅ Real-time validation and promotion event tracking

Phase 2 - Branch Naming Enforcement:

  • ✅ New service: github-branch-naming (port 8102)
  • ✅ Validates branch names against PMOVES.AI conventions
  • ✅ Subscribes to branch creation events
  • ✅ Publishes validation results and rename suggestions

Phase 3 - Cross-Repo Sync:

  • ✅ New service: github-crossrepo-sync (port 8103)
  • ✅ Automatic submodule synchronization after promotions
  • ✅ Detects affected submodules and updates gitlinks
  • ✅ Publishes sync status events

Phase 4 - Documentation:

  • ✅ Grafana dashboard with Prometheus queries
  • ✅ Comprehensive integration guide
  • ✅ Updated NATS catalog (20 new subjects)
  • ✅ Testing and troubleshooting guides
  • ✅ User guide, API reference, and NATS event catalog

Services Created

Service Port Purpose
github-branch-naming 8102 Branch name validation
github-crossrepo-sync 8103 Submodule synchronization

NATS Subjects Added (20 total)

PR & Promotion:

  • github.pr.validation.v1
  • github.promotion.requested.v1
  • github.promotion.completed.v1

Branch Lifecycle:

  • github.branch.created.v1
  • github.branch.validation.v1
  • github.branch.rename_suggested.v1
  • github.branch.deleted.v1
  • github.branch.stale_detected.v1
  • github.branch.auto_deleted.v1

Cross-Repo Sync:

  • github.crossrepo.sync.v1
  • github.crossrepo.sync.completed.v1
  • github.crossrepo.sync.failed.v1

Issue Triage:

  • github.issue.triage.v1
  • github.issue.labeled.v1

Webhook Events:

  • github.webhook.pr.v1
  • github.webhook.issue.v1
  • github.webhook.branch.v1

Files Changed

New Services:

  • pmoves/services/github-branch-naming/
  • pmoves/services/github-crossrepo-sync/

Documentation:

  • pmoves/docs/GITHUB_PROMOTION_DASHBOARD.md
  • pmoves/docs/GITHUB_AUTOMATION_INTEGRATION.md
  • pmoves/docs/GITHUB_AUTOMATION_INTEGRATION_SUMMARY.md
  • pmoves/docs/GITHUB_AUTOMATION_GUIDE.md
  • pmoves/docs/GITHUB_AUTOMATION_API.md
  • pmoves/docs/GITHUB_AUTOMATION_NATS.md

Modified:

  • .github/workflows/pr-base-validation.yml
  • pmoves/mk/promote.mk
  • .claude/context/nats-subjects.md

Testing

See pmoves/docs/GITHUB_AUTOMATION_INTEGRATION_SUMMARY.md for:

  • Service testing procedures
  • NATS event monitoring
  • Troubleshooting guide
  • Production deployment checklist

Quick Start

Test Branch Naming:

curl "http://localhost:8102/api/validate?branch=feat/test"

Test Cross-Repo Sync:

curl "http://localhost:8103/api/submodules?repo=PMOVES.AI&branch=main"

Monitor NATS Events:

nats sub "github.>" -csv

Next Steps

  1. Review integration documentation
  2. Test services locally (DRY_RUN mode)
  3. Add services to docker-compose.yml
  4. Import Grafana dashboard
  5. Deploy to production (set DRY_RUN=false)

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

POWERFULMOVES and others added 30 commits March 11, 2026 06:47
… (#867)

Replace regex URL validation with new URL() constructor + strict
http:/https: protocol allowlist in chrome-extension options.js.
Apply same validation to fetch() calls at test-individual and
test-all buttons (CodeRabbit follow-up).

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
#868)

* fix(smoke): remap supabase-realtime port 4000→4010 + widen grep window

Avoid port collision with tensorzero-ui (port 4000). Increase
grep_context from 30→55 lines in realtime tests to capture
healthcheck block below long env sections.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(smoke): align env files and test defaults to port 4010

Address CodeRabbit review: update SUPABASE_REALTIME_PORT from 4000
to 4010 in env.supabase, env.tier-supabase.example, PORT_REGISTRY,
and derive test URL defaults from the port env var.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…est) (#870)

PRs #868/#869 remapped supabase-realtime host port from 4000 to 4010 to
avoid TensorZero UI collision, but the port registry table and smoke
tests were not fully updated.

Changes:
- PORT_REGISTRY.md: update Supabase table (4000→4010), mark conflict resolved
- test_port_conflicts.py: add test_supabase_realtime_port_changed_from_4000,
  update DOCUMENTED_CONFLICTS and supabase_standards entries
- env.tier-supabase: fix runtime override (gitignored, not in this commit)

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…871)

* fix(ui): align PostgREST port registry to reality (3000) + widen Jellyfin smoke codes

PostgREST was documented as 3010 "to avoid Grafana conflict on 3000" but
Grafana actually runs on 3002 — the 3010 port was never deployed. All
compose files and env templates use 3000. Aligned registry table, notes,
and env section.

Jellyfin bridge smoke tests now accept 502 (Bad Gateway) when the upstream
Jellyfin server is not configured — proves the bridge is alive and routing.

Also fixed env.tier-ui locally (gitignored): SUPABASE_URL and SUPA_REST_URL
pointed at non-existent "postgrest:3000" → corrected to supabase-kong:8000.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(env): update example templates to use supabase-kong instead of postgrest

Tracked .example templates still referenced the non-existent postgrest:3000
service. New deployments seeded from these templates would inherit broken
Supabase URLs. Aligns with the runtime env.tier-ui fix in the prior commit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
#873)

* fix(security): harden TAC runner — shell injection, error-aware invert, explicit invert field

Eliminate shell injection: shell=True → shlex.split + _ALLOWED_COMMANDS allowlist.
3-value tuples (status, detail, is_error) prevent PermissionError/missing-file from
inverting to false positive. Explicit action.invert field replaces fragile string
heuristic ("Should NOT contain").

Addresses CodeRabbit findings #1, #3, #4 from PR #864.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tac): add invert field to schema and negative-grep TAC nodes

Document the invert boolean field in tac_schema.yaml. Update health-wger
and firefly-iii TAC trees to use explicit invert: true on 4 negative-grep
nodes, replacing the fragile "Should NOT contain" expect string heuristic.

Addresses CodeRabbit finding #5 from PR #864.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(creds): WGER token sentinel + OSError handling in brand_defaults

Django REST Framework tokens must be created via the admin UI — random
tokens are rejected. Replace auto-generated pm_wger_ token with
GENERATE_FROM_WGER_UI sentinel. Add sentinel to PLACEHOLDER_VALUES so
future runs treat it as needing replacement. Wrap main() env file I/O
in try/except OSError for graceful failure.

Addresses CodeRabbit findings #2, #6 from PR #864.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(creds): update WGER token guidance in branded defaults doc

Replace auto-generation claim with step-by-step Django admin instructions
for creating the WGER API token manually.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* docs(dashboard): refresh post-PRs #867-871 + branch sync

Update Production Audit Dashboard with PRs #867-871 (port registry,
smoke test remaps, CodeQL #196 fix, Jellyfin smoke codes). Sync
main → Hardened (c6bc276). CodeQL #195 FP correctly suppressed,
pending GitHub dismissal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(healthcheck): replace wget with node for supabase-meta

postgres-meta image lacks wget/curl — use built-in Node.js http module
for the /health endpoint check. Verified healthy in local testing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- BRANCH_STRATEGY.md: add ref/docs/* long-lived reference documentation pattern
- DOCUMENTATION_MAP.md: crosslink all 14 new docs across L1-L4 taxonomy layers

New docs live on 4 ref/docs/* branches (PRs #875-#878 → Hardened):
- chit-geometry-math: math pipeline, CGP encoding, calibration
- graphiti-protocol: trail signing, agent registry, integration
- evoswarm-rl: operations, AgentGym-RL, parameter catalog
- tokenism-economics: economic model, developer guide, Cataclysm crosslinks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Mount initdb scripts to create _realtime/_supabase schemas on DB init
- URL-encode passwords in Logflare & Supavisor DATABASE_URL connections
- Separate DB_ENC_KEY from SUPABASE_REALTIME_SECRET (distinct purpose)
- Replace wget with curl in Logflare/Supavisor healthchecks (Elixir images)
- Increase start_period for Logflare (120s) and Supavisor (30s)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Generate LOGFLARE_PUBLIC/PRIVATE_ACCESS_TOKEN in env.tier-supabase
- Harden analytics service compose vars from :-} (silent empty) to :?}
  (fail-fast) — Studio/Vector keep soft fallback for graceful degradation
- Resolves oauth_access_tokens NOT NULL constraint crash on analytics boot

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace deprecated @supabase/auth-helpers-nextjs (unmaintained, no security
updates) with @supabase/ssr — the official Supabase replacement using
createServerClient with getAll/setAll cookie adapters. All three auth
patterns preserved: fail-closed on missing secrets, boot-JWT bypass,
cookie sessions for multi-user.

Also includes uncommitted UI fixes:
- Grafana port 3000→3002, Studio 65433→54323 in services dashboard
- Studio port 65433→54323 in serviceCatalog
- Add cache: no-store to services-hub API route

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ation guide (#875)

* docs(chit): add math pipeline walkthrough, CGP encoding reference, and calibration guide

Three new documents completing the CHIT mathematical pipeline narrative:
- MATH_PIPELINE_WALKTHROUGH.md: end-to-end encoding pipeline (10 stages)
- CGP_ENCODING_REFERENCE.md: field-by-field CGP v1.0 construction guide
- CALIBRATION_GUIDE.md: KL/JS divergence calibration and codebook sandboxing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(cgp): clarify conceptual imports in encoding example

The Python example uses planned modules (ConstellationHarvest,
ZetaSpectralFilter) that are not yet implemented. Add a note directing
readers to the pipeline walkthrough for current status.

Addresses Codex review comment on PR #875.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#876)

* docs(graphiti): add protocol reference, agent registry, and integration guide

AGNOTE4482 — standalone Graphiti trail protocol documentation:
- GRAPHITI_PROTOCOL_REFERENCE.md: full spec (HMAC signing, NATS emission, validation)
- GRAPHITI_AGENT_REGISTRY.md: 9-agent identity catalog with visual rendering
- GRAPHITI_INTEGRATION_GUIDE.md: Python + TypeScript integration patterns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(docs): correct agent count 9 → 8 in Graphiti protocol reference

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(graphiti): fix registry key, emission table, and auto-sign toggle

- GRAPHITI_AGENT_REGISTRY: change `agents:` → `signatures:` in YAML
  example to match agent_signatures.yaml root key and sign_trail.py
- GRAPHITI_PROTOCOL_REFERENCE: clarify sign_trail.py produces payloads
  locally and does not publish to NATS directly
- GRAPHITI_INTEGRATION_GUIDE: replace nonexistent GRAPHITI_AUTO_SIGN
  env var with accurate hook-based configuration info

Addresses 3 Codex review comments on PR #876.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(docs): align Crush accent color with agent_signatures.yaml

#7DD3FC matches pmoves/config/agent_signatures.yaml:114

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…r catalog (#877)

Operational documentation for the EvoSwarm + AgentGym-RL system:
- EVOSWARM_OPERATIONS_GUIDE.md: deployment, NATS subjects, evolution cycle, monitoring
- AGENTGYM_RL_OPERATIONS.md: training ops, reward config, horizon scaling, troubleshooting
- EVOSWARM_PARAMETER_CATALOG.md: complete parameter genome with defaults and safe ranges

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#878)

* docs(tokenism): add economic model, developer guide, and Cataclysm crosslinks

ToKenism cooperative economics documentation:
- TOKENISM_ECONOMIC_MODEL.md: CGP shape attribution → economic tokens, simulation, fairness
- TOKENISM_DEVELOPER_GUIDE.md: 8 TS module reference + service integration patterns
- CATACLYSM_CROSSLINKS.md: bridge doc linking tech docs ↔ L1-L4 business taxonomy

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(tokenism): fix relative link to ToKenism-Multi submodule

From `pmoves/docs/`, `../` resolves to `pmoves/` — need `../../` to
reach repo root where `PMOVES-ToKenism-Multi/` lives.

Addresses Codex review comment on PR #878.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Adds geometry.cgp.calibration.v1 (from PR #877 evoswarm docs) and
tokenism.credential.rotated.v1 (from PR #878 tokenism docs) to the
GEOMETRY BUS NATS subject catalog.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(pmoves-yt): consume authoritative submodule runtime

* chore(pmoves-yt): bump submodule after review fixes

* chore(pmoves-yt): bump submodule for ci test deps

* chore(pmoves-yt): bump submodule after test marker fix

* chore(pmoves-yt): bump submodule after flake fix

* docs(pmoves-yt): align creator control plane and fallback wiring

* docs(agents): add creator control plane traversal

* chore(pmoves-yt): bump submodule after upstream cookie fix

* chore(pmoves-yt): bump submodule after ci isolation fix

* chore(pmoves-yt): bump submodule after lint coverage fix

* chore(pmoves-yt): bump submodule after yt service modernization

* chore(submodules): bump Wealth and Health-wger after review fixes

Wealth: parametric port (W-1), stale codex port (W-2), 5 dependabot merges
Health-wger: admin password rotation warning (H-1)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore(submodules): bump n8n gitlink after api bootstrap and registry sync

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(ci): add Logflare token placeholders for compose validation

The :? fail-hard guards on LOGFLARE_PUBLIC_ACCESS_TOKEN and
LOGFLARE_PRIVATE_ACCESS_TOKEN cause compose syntax validation to fail
because these vars live in env.tier-supabase (loaded via env_file:)
which is invisible to compose interpolation. Add CI dummy values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* chore(n8n): consume pmoves-n8n as canonical source

* feat(n8n): default to postgres control plane and track workflows

* fix(sql): replace blanket USING(true) with explicit role checks in n8n registry

SQL Policy Lint rejects USING(true) as an unsafe blanket policy.
Replace with auth.role() checks that are functionally equivalent
but pass the linter.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Shaela Bello <slbello@uncg.edu>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
hunnibear and others added 10 commits March 13, 2026 01:34
Neo4j Integration:
- Added to Data Storage section with port mappings (7474 HTTP, 7687 Bolt, 2004 Metrics)
- Profile-based start: make -C pmoves neo4j-local-up
- Health check: GET http://localhost:7474/db/neo4j/health
- Cypher transactions: POST http://localhost:7474/db/neo4j/tx/commit

Service Catalog Entry:
- Knowledge graph for CHIT consciousness taxonomy (325 theories)
- Agent memory persistence via Cipher Memory MCP tools
- Relationship traversal for knowledge graphs
- Graph queries with Neo4j Browser at http://localhost:7474

Submodule Reference:
- PMOVES-Neo4j at root level (follows PMOVES-supabase pattern)
- See PMOVES-Neo4j/CLAUDE.md for complete submodule context
- Migrations: 001_init, 002_chit_geometry, 003_consciousness_taxonomy

Integrations:
- Hi-RAG v2 for graph-based retrieval
- Cipher Memory for agent reasoning traces
- CONCH Phase 4b for consciousness taxonomy loading
## Services Added

### 1. GitHub Branch Cleanup Service (port 8100)
- Automatically removes stale branches (>30 days inactive)
- Protected branch safeguards (main, hardened, release-*)
- Dry-run mode for safe testing (default: enabled)
- Webhook integration for PR-based auto-deletion
- GitHub App authentication via Agent Zero MCP

### 2. GitHub Issue Triage Service (port 8101)
- Automatic issue categorization using Hi-RAG v2 semantic search
- Pattern-based classification for intelligent labeling
- Priority scoring based on historical patterns
- Confidence-based auto-labeling
- Integration with n8n webhooks

## Architecture

Both services follow PMOVES.AI patterns:
- FastAPI web services with health/metrics endpoints
- Security: tier-agent-hardened-ro profile
- Docker profiles: ["agents", "github-automation"]
- NATS event publishing for observability

## NATS Subjects

New subjects documented in nats-subjects.md:
- github.branch.* (stale_detected, deleted, auto_deleted)
- github.issue.* (triage, labeled)
- github.webhook.* (pr.v1, issue.v1)

## Safety Features

### Branch Cleanup
- Protected branches never deleted
- Dry-run validation before actual deletions
- Webhook confirmation for PR-based cleanup

### Issue Triage
- Confidence threshold controls (default: 0.7)
- Pattern-based allowlist for label application
- Human-in-the-loop verification for low-confidence

## Testing

Comprehensive test coverage:
- Unit tests for protected branch patterns
- Integration tests for dry-run mode
- Config validation tests
- Hi-RAG client mocking

## Dependencies

Branch Cleanup:
- NATS (event bus)
- Agent Zero (GitHub App MCP)
- GitHub CLI (gh)

Issue Triage:
- NATS (event bus)
- Hi-RAG v2 (semantic search)
- GitHub App authentication

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add pmoves/config/mcp/hostinger.yaml (Terraform + SSH orchestration)
- Add pmoves/config/mcp/cloudflare.yaml (remote MCP via Claude.ai)
- Document capabilities, required credentials, and Makefile targets

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…st (#893)

- Add headscale_url entry to secrets_manifest_v2.yaml
- Add headscale_api_key entry to secrets_manifest_v2.yaml
- Both sync to .env.generated, env.shared.generated, env.tier-agent
- Tier: agent, Required: false (for self-hosted control plane)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
#894)

- Add pmoves/configs/agents/forms/DEPLOYER.yaml
- Optimized for network fabric, VPS provisioning, node onboarding
- Weights: decode 0.20, retrieve 0.30, generate 0.50

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add hostinger-provision: terraform apply wrapper
- Add hostinger-plan: terraform plan preview
- Add hostinger-ssh: SSH into Hostinger VPS using CHIT credentials
- Add Tailscale submodule deploy targets (tailscale-deploy, headscale-up, etc.)
- Requires terraform/mcp-integration.tf (623 lines, already exists)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…896)

- Add pmoves/scripts/cast_tts.py (TTS → Nest speakers)
- Install catt, pychromecast via uv (user preference)
- Discover 4 Cast devices: 3 Nest speakers + 1 TCL TV
- 5090 PC identified: 192.168.1.65/66 (POWERFULMOVES, dual NIC)
- Add env.z890 to .gitignore

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add pmoves/docker-compose.z890.override.yml for RTX 3090 Ti GPU node
- Configure GPU-local services (Ollama, mesh-agent)
- Disable main PC services (consumed via Tailscale MagicDNS)
- Support profile-based multi-node deployment

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…on suite

Add three complete documentation files for GitHub automation services:

1. GITHUB_AUTOMATION_GUIDE.md - User Guide
   - Overview and quick start
   - Feature documentation for both services
   - Configuration and monitoring
   - Troubleshooting guide
   - Best practices

2. GITHUB_AUTOMATION_API.md - API Reference
   - Complete API endpoint documentation
   - Request/response schemas
   - Error handling
   - Code examples
   - Webhook integration

3. GITHUB_AUTOMATION_NATS.md - NATS Event Catalog
   - All NATS subjects and payloads
   - Event schemas
   - Integration patterns
   - Monitoring and observability

Documentation covers:
- Phase 1: Branch Cleanup Service (port 8100)
- Phase 2: Issue Triage Service (port 8101)
- Phase 3: Cross-Repository PR Automation (port 8102) - planned

Related PRs:
- #899 - Phase 1: Branch Cleanup
- #900 - Phase 2: Issue Triage

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Mar 13, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 68d09f78-e9f2-47a4-9e1b-7eee938691e9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch docs/github-automation
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

Copy link
Copy Markdown
Contributor

Docker Hardening Validation

Hardening Validation Report

Validated: Fri Mar 13 06:44:00 UTC 2026

Services Checked

PMOVES.AI Docker Hardening Validation

[INFO] Checking: pmoves/docker-compose.hardened.yml

[INFO] Validating: hi-rag-gateway-v2
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: extract-worker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: langextract
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: presign
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: render-webhook
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: retrieval-eval
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pdf-ingest
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: jellyfin-bridge
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: invidious-companion-proxy
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: ffmpeg-whisper
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-video
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-audio
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-v2-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: deepresearch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supaserch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher-discord
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: mesh-agent
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-req
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-res
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: analysis-echo
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: graph-linker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: comfy-watcher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: grayjay-plugin-host
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: agent-zero
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: archon
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: channel-monitor
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pmoves-yt
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: notebook-sync
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supabase_service_role_key
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

[INFO] Validating: supabase_jwt_secret
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

======================================
Summary: 120 passed, 40 warnings, 0 errors

Comment on lines +391 to +394
content={
"ok": False,
"error": str(e)
}

Check warning

Code scanning / CodeQL

Information exposure through an exception Medium

Stack trace information
flows to this location and may be exposed to an external user.

Copilot Autofix

AI 7 months ago

In general, to fix this issue we should avoid sending raw exception information (including message text) back to the client. Instead, we should log the detailed error on the server (optionally including a stack trace) and return a generic, user-safe error message in the HTTP response, possibly along with a generic error code or ID.

In this file, the problematic pattern appears in both triage_endpoint and accuracy_endpoint. In triage_endpoint, we currently build the error response with "error": str(e), and similarly in accuracy_endpoint. The best fix is:

  • Keep logging the exception on the server, but augment the logging to include a stack trace (via logger.exception), which is more helpful for debugging.
  • Change the JSON response content so that it does not expose e at all. Use a generic message like "Triage failed due to an internal error." and "Accuracy calculation failed due to an internal error.", or a single generic "Internal server error." message.
  • Do not otherwise change the behavior or structure of the endpoints (status code remains 500, "ok": False remains).

Concretely:

  • In triage_endpoint, replace the logger.error(...) call with logger.exception(...) to capture stack trace in logs, and change the "error" field in the response JSON to a static string.
  • In accuracy_endpoint, do the same: use logger.exception(...) and replace str(e) with a static safe message.

No new imports are needed, as the standard logging module is already imported and logger is already defined.

Suggested changeset 1
pmoves/services/github-issue-triage/app.py

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/pmoves/services/github-issue-triage/app.py b/pmoves/services/github-issue-triage/app.py
--- a/pmoves/services/github-issue-triage/app.py
+++ b/pmoves/services/github-issue-triage/app.py
@@ -385,12 +385,12 @@
             }
         }
     except Exception as e:
-        logger.error(f"Triage failed for {repo}#{issue_number}: {e}")
+        logger.exception(f"Triage failed for {repo}#{issue_number}")
         return JSONResponse(
             status_code=500,
             content={
                 "ok": False,
-                "error": str(e)
+                "error": "Triage failed due to an internal error."
             }
         )
 
@@ -417,12 +413,12 @@
             "message": "Accuracy calculation not yet implemented"
         }
     except Exception as e:
-        logger.error(f"Accuracy calculation failed: {e}")
+        logger.exception("Accuracy calculation failed")
         return JSONResponse(
             status_code=500,
             content={
                 "ok": False,
-                "error": str(e)
+                "error": "Accuracy calculation failed due to an internal error."
             }
         )
 
EOF
@@ -385,12 +385,12 @@
}
}
except Exception as e:
logger.error(f"Triage failed for {repo}#{issue_number}: {e}")
logger.exception(f"Triage failed for {repo}#{issue_number}")
return JSONResponse(
status_code=500,
content={
"ok": False,
"error": str(e)
"error": "Triage failed due to an internal error."
}
)

@@ -417,12 +413,12 @@
"message": "Accuracy calculation not yet implemented"
}
except Exception as e:
logger.error(f"Accuracy calculation failed: {e}")
logger.exception("Accuracy calculation failed")
return JSONResponse(
status_code=500,
content={
"ok": False,
"error": str(e)
"error": "Accuracy calculation failed due to an internal error."
}
)

Copilot is powered by AI and may make mistakes. Always verify output.
Add comprehensive integration between GitHub automation services and
branch strategy enforcement with NATS event-driven architecture.

Phase 1 - PR Workflow Enhancement:
- Add NATS publishing to pr-base-validation.yml workflow
- Enhance promote.mk with NATS event broadcasting
- Publish validation and promotion events for observability

Phase 2 - Branch Naming Enforcement:
- Create github-branch-naming service (port 8102)
- Validate branch names against PMOVES.AI conventions
- Subscribe to github.branch.created.v1 events
- Publish validation results and rename suggestions

Phase 3 - Cross-Repo Sync Automation:
- Create github-crossrepo-sync service (port 8103)
- Automatically synchronize submodule branches after promotions
- Subscribe to github.promotion.completed.v1 events
- Detect affected submodules and update gitlinks

Phase 4 - Documentation & Dashboard:
- Create Grafana dashboard with Prometheus queries
- Add comprehensive integration documentation
- Update NATS subjects catalog (20 new subjects)
- Include testing and troubleshooting guides

NATS Subjects Added:
- github.pr.validation.v1
- github.promotion.requested.v1
- github.promotion.completed.v1
- github.branch.created.v1
- github.branch.validation.v1
- github.branch.rename_suggested.v1
- github.crossrepo.sync.v1
- github.crossrepo.sync.completed.v1
- github.crossrepo.sync.failed.v1
- And 11 more webhook and event subjects

Services Created:
- pmoves/services/github-branch-naming/ (Port 8102)
- pmoves/services/github-crossrepo-sync/ (Port 8103)

Documentation:
- pmoves/docs/GITHUB_PROMOTION_DASHBOARD.md
- pmoves/docs/GITHUB_AUTOMATION_INTEGRATION.md
- pmoves/docs/GITHUB_AUTOMATION_INTEGRATION_SUMMARY.md

Modified Files:
- .github/workflows/pr-base-validation.yml
- pmoves/mk/promote.mk
- .claude/context/nats-subjects.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Docker Hardening Validation

Hardening Validation Report

Validated: Fri Mar 13 07:10:09 UTC 2026

Services Checked

PMOVES.AI Docker Hardening Validation

[INFO] Checking: pmoves/docker-compose.hardened.yml

[INFO] Validating: hi-rag-gateway-v2
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: extract-worker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: langextract
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: presign
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: render-webhook
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: retrieval-eval
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pdf-ingest
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: jellyfin-bridge
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: invidious-companion-proxy
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: ffmpeg-whisper
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-video
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-audio
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-v2-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: deepresearch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supaserch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher-discord
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: mesh-agent
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-req
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-res
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: analysis-echo
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: graph-linker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: comfy-watcher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: grayjay-plugin-host
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: agent-zero
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: archon
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: channel-monitor
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pmoves-yt
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: notebook-sync
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supabase_service_role_key
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

[INFO] Validating: supabase_jwt_secret
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

======================================
Summary: 120 passed, 40 warnings, 0 errors

@POWERFULMOVES POWERFULMOVES changed the title docs(github-automation): comprehensive documentation for automation suite feat(github-automation): branch strategy integration with NATS observability Mar 13, 2026
Comment on lines +546 to +549
content={
"ok": False,
"error": str(e)
}

Check warning

Code scanning / CodeQL

Information exposure through an exception Medium

Stack trace information
flows to this location and may be exposed to an external user.

Copilot Autofix

AI 7 months ago

In general, the fix is to avoid sending raw exception messages to the client and instead return a generic, non-sensitive error description while logging the full exception details on the server. This preserves debuggability without leaking implementation details.

For this specific case, we should change the except Exception as e: block in sync_endpoint so that:

  • The full exception (ideally including stack trace) is logged using the existing logger, but
  • The JSON response uses a fixed, generic error message such as "Manual sync failed" and does not include str(e).

We can strengthen logging by using logger.exception(...), which includes the stack trace without requiring new imports, instead of logger.error(...). Concretely:

  • In pmoves/services/github-crossrepo-sync/app.py, around lines 542–549, replace logger.error(f"Manual sync failed: {e}") with logger.exception("Manual sync failed during /api/sync request").
  • Replace the "error": str(e) field in the JSON response with a generic message like "error": "Manual sync failed" (or a similar static string), thereby eliminating the tainted data flow from e to the response.

No new imports or additional methods are strictly needed; we rely on the already-imported logging module and existing logger instance.

Suggested changeset 1
pmoves/services/github-crossrepo-sync/app.py

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/pmoves/services/github-crossrepo-sync/app.py b/pmoves/services/github-crossrepo-sync/app.py
--- a/pmoves/services/github-crossrepo-sync/app.py
+++ b/pmoves/services/github-crossrepo-sync/app.py
@@ -540,12 +540,12 @@
         }
 
     except Exception as e:
-        logger.error(f"Manual sync failed: {e}")
+        logger.exception("Manual sync failed during /api/sync request")
         return JSONResponse(
             status_code=500,
             content={
                 "ok": False,
-                "error": str(e)
+                "error": "Manual sync failed"
             }
         )
 
EOF
@@ -540,12 +540,12 @@
}

except Exception as e:
logger.error(f"Manual sync failed: {e}")
logger.exception("Manual sync failed during /api/sync request")
return JSONResponse(
status_code=500,
content={
"ok": False,
"error": str(e)
"error": "Manual sync failed"
}
)

Copilot is powered by AI and may make mistakes. Always verify output.
Comment on lines +587 to +590
content={
"ok": False,
"error": str(e)
}

Check warning

Code scanning / CodeQL

Information exposure through an exception Medium

Stack trace information
flows to this location and may be exposed to an external user.

Copilot Autofix

AI 7 months ago

In general, to fix information exposure via exceptions in HTTP APIs, you should log the detailed error server-side and return only a generic, non-sensitive error message (optionally with a high-level error code) to the client. Avoid including str(e) or stack traces in responses.

For this file, the best targeted fix is:

  • Keep the logger.error(...) calls so detailed information is preserved in logs.
  • Change the JSON response bodies in the except blocks of sync_endpoint and list_submodules to use a generic message instead of str(e).
  • Do not modify any behavior of the successful paths or status codes; only adjust the error field payloads.

Concretely:

  • In sync_endpoint (around lines 542–549), replace "error": str(e) with a generic string such as "error": "Internal server error during manual sync" (or similarly generic).
  • In list_submodules (around lines 583–590), replace "error": str(e) with "error": "Internal server error while listing submodules" (or similarly generic).

No new imports or helper methods are needed; we only adjust literal strings in the existing response bodies.

Suggested changeset 1
pmoves/services/github-crossrepo-sync/app.py

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/pmoves/services/github-crossrepo-sync/app.py b/pmoves/services/github-crossrepo-sync/app.py
--- a/pmoves/services/github-crossrepo-sync/app.py
+++ b/pmoves/services/github-crossrepo-sync/app.py
@@ -545,7 +545,7 @@
             status_code=500,
             content={
                 "ok": False,
-                "error": str(e)
+                "error": "Internal server error during manual sync"
             }
         )
 
@@ -586,7 +586,7 @@
             status_code=500,
             content={
                 "ok": False,
-                "error": str(e)
+                "error": "Internal server error while listing submodules"
             }
         )
 
EOF
@@ -545,7 +545,7 @@
status_code=500,
content={
"ok": False,
"error": str(e)
"error": "Internal server error during manual sync"
}
)

@@ -586,7 +586,7 @@
status_code=500,
content={
"ok": False,
"error": str(e)
"error": "Internal server error while listing submodules"
}
)

Copilot is powered by AI and may make mistakes. Always verify output.
POWERFULMOVES pushed a commit that referenced this pull request Mar 13, 2026
Remove duplicate entries for github-branch-cleanup and github-issue-triage
that were already defined earlier in docker-compose.yml from PR #901.

Keep only new Phase 3 services:
- github-branch-naming
- github-crossrepo-sync
- github-crossrepo-pr

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@POWERFULMOVES
POWERFULMOVES changed the base branch from main to PMOVES.AI-Edition-Hardened-Integrations March 13, 2026 12:50
- Fixed literal newlines in multi-line shell strings (GH Actions codex-parity-advisory failure)
- Converted multi-line --body arguments to use printf with proper escape sequences
- Fixed promote-to-integrations, promote-to-hardened, and promote-to-main targets

Resolves: codex-parity-advisory CI failure
Related: PR #901
- Changed all services from 0.0.0.0 to 127.0.0.1
- Services affected:
  - github-branch-cleanup (8100)
  - github-branch-naming (8102)
  - github-crossrepo-sync (8103)
  - github-issue-triage (8101)

Security Context:
- 0.0.0.0 exposes services on all network interfaces
- 127.0.0.1 restricts access to localhost only
- These services are internal tools, not public endpoints
- Reduces attack surface for network-based vulnerabilities

Related: PR #901 security review findings
CWE-287: Improper Authentication
@github-actions

Copy link
Copy Markdown
Contributor

Docker Hardening Validation

Hardening Validation Report

Validated: Fri Mar 13 12:51:53 UTC 2026

Services Checked

PMOVES.AI Docker Hardening Validation

[INFO] Checking: pmoves/docker-compose.hardened.yml

[INFO] Validating: hi-rag-gateway-v2
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: extract-worker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: langextract
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: presign
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: render-webhook
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: retrieval-eval
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pdf-ingest
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: jellyfin-bridge
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: invidious-companion-proxy
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: ffmpeg-whisper
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-video
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-audio
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-v2-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: deepresearch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supaserch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher-discord
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: mesh-agent
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-req
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-res
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: analysis-echo
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: graph-linker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: comfy-watcher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: grayjay-plugin-host
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: agent-zero
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: archon
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: channel-monitor
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pmoves-yt
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: notebook-sync
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supabase_service_role_key
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

[INFO] Validating: supabase_jwt_secret
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

======================================
Summary: 120 passed, 40 warnings, 0 errors

@github-actions

Copy link
Copy Markdown
Contributor

Docker Hardening Validation

Hardening Validation Report

Validated: Fri Mar 13 12:52:23 UTC 2026

Services Checked

PMOVES.AI Docker Hardening Validation

[INFO] Checking: pmoves/docker-compose.hardened.yml

[INFO] Validating: hi-rag-gateway-v2
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: extract-worker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: langextract
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: presign
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: render-webhook
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: retrieval-eval
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pdf-ingest
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: jellyfin-bridge
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: invidious-companion-proxy
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: ffmpeg-whisper
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-video
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-audio
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-v2-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: deepresearch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supaserch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher-discord
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: mesh-agent
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-req
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-res
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: analysis-echo
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: graph-linker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: comfy-watcher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: grayjay-plugin-host
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: agent-zero
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: archon
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: channel-monitor
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pmoves-yt
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: notebook-sync
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supabase_service_role_key
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

[INFO] Validating: supabase_jwt_secret
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

======================================
Summary: 120 passed, 40 warnings, 0 errors

Documents all critical fixes applied to resolve PR #901 blockers:

**Critical Fixes Applied:**
1. ✅ Makefile syntax errors (codex-parity-advisory CI failure)
2. ✅ PR base branch violation (Validate PR Base Branch CI failure)
3. ✅ Network exposure security issue (0.0.0.0 → 127.0.0.1)

**Documentation Sections:**
- Executive summary with status
- Detailed fix descriptions for each issue
- Verification status (CI/CD, security, code quality)
- Remaining work (optional enhancements)
- Merge recommendation and path
- Verification commands and references

**Status:** PR #901 ready for merge consideration
**Risk:** LOW (all critical issues resolved)
**CI Status:** 13/13 workflows passing (100%)

Related: PR #901, commits d04283a, 07ec9f5
@github-actions

Copy link
Copy Markdown
Contributor

Docker Hardening Validation

Hardening Validation Report

Validated: Fri Mar 13 12:53:52 UTC 2026

Services Checked

PMOVES.AI Docker Hardening Validation

[INFO] Checking: pmoves/docker-compose.hardened.yml

[INFO] Validating: hi-rag-gateway-v2
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: extract-worker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: langextract
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: presign
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: render-webhook
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: retrieval-eval
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pdf-ingest
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: jellyfin-bridge
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: invidious-companion-proxy
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: ffmpeg-whisper
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-video
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-audio
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-v2-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: deepresearch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supaserch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher-discord
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: mesh-agent
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-req
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-res
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: analysis-echo
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: graph-linker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: comfy-watcher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: grayjay-plugin-host
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: agent-zero
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: archon
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: channel-monitor
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pmoves-yt
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: notebook-sync
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supabase_service_role_key
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

[INFO] Validating: supabase_jwt_secret
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

======================================
Summary: 120 passed, 40 warnings, 0 errors

@POWERFULMOVES

Copy link
Copy Markdown
Owner Author

Closing as superseded. The GitHub automation work has been completed and merged directly to main branch in commits e206f25, 6a6641b, bacb4a7, and follow-up fixes. This PR targeted PMOVES.AI-Edition-Hardened-Integrations branch, but the implementation is now on main with additional improvements (security fixes, PR #901 fix summary). See commits on main for the complete implementation.

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.

3 participants