fix(tier): Service alignment to tier env architecture - #477
fix(tier): Service alignment to tier env architecture#477POWERFULMOVES wants to merge 23 commits into
Conversation
…365) * feat(cli): rebrand Crush CLI to PMOVES CLI Update user-facing branding from "Crush CLI" to "PMOVES CLI" while maintaining backward compatibility with existing Crush infrastructure. Changes: - Update crush_app help text: "Crush CLI integration" → "PMOVES CLI integration" - Update crush_configurator.py docstring to emphasize PMOVES deployment - Update command help texts for setup/status/preview commands - Update user-facing documentation in .claude/commands/crush/ Rationale: The "Crush" name originated as an internal codename but the production CLI should reflect the PMOVES brand for consistency with the broader PMOVES.AI ecosystem. The underlying "crush" command name and file paths are preserved for backward compatibility. Modified Files: - pmoves/tools/mini_cli.py - pmoves/tools/crush_configurator.py - .claude/commands/crush/setup.md - .claude/commands/crush/status.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(cli): add PMOVES Agent SDK commands to mini CLI Implement agent-sdk sub-commands for creating and managing PMOVES Agent instances with full ecosystem access via interactive CLI wizard. Features Implemented: - `pmoves agent-sdk create` - Interactive wizard for agent creation - 5 agent roles: researcher, code-reviewer, media-processor, knowledge-manager, general - Role-based tool and subagent configuration - Automatic NATS, TensorZero, and Hi-RAG connection - Unique agent ID generation with timestamps - Beautiful formatted output with configuration summary - `pmoves agent-sdk run` - Execute tasks with existing agents - Task execution with streaming output - Model override support - Session resumption capability - `pmoves agent-sdk list` - List agent instances - Status filtering - Configurable limit (placeholder for SessionManager integration) - `pmoves agent-sdk status` - Check agent status - NATS heartbeat monitoring - Active agent information (placeholder for SessionManager) Technical Details: - Integrated with PMOVES-BoTZ Agent SDK - Async/await pattern for agent lifecycle management - Interactive role selection with graceful Ctrl+C handling - Comprehensive error handling for missing dependencies - Auto-discovery of PMOVES-BoTZ submodule Usage Examples: ```bash # Interactive agent creation pmoves agent-sdk create # Pre-select role pmoves agent-sdk create --role researcher # Execute task pmoves agent-sdk run pmoves-researcher-1735123456 "Analyze architecture" # List agents pmoves agent-sdk list --status active --limit 50 ``` Related Documentation: - .claude/commands/agent-sdk/create.md - .claude/commands/agent-sdk/run.md - .claude/commands/agent-sdk/resume.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * docs(agent-sdk): update CLI documentation for run and resume commands Update user-facing documentation for agent-sdk CLI commands to reflect the new PMOVES CLI integration pattern. Changes: - `.claude/commands/agent-sdk/run.md` - Updated from skill-based to CLI command documentation - Added usage examples with `pmoves agent-sdk run` - Documented arguments and options - Added troubleshooting section - `.claude/commands/agent-sdk/resume.md` - Updated from skill-based to CLI command documentation - Added session management workflow - Documented session states and storage backends - Added troubleshooting section Documentation Pattern: All agent-sdk command documentation now follows a consistent pattern: - Usage section with use cases - Implementation section with CLI examples - Arguments and options tables - What It Does checklist - Related commands section - Notes and troubleshooting This aligns with the create.md documentation updated in the previous implementation phase. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(agent-sdk): address all PR #365 review comments Fix all 14 issues from comprehensive PR review across error handling, documentation, and code quality improvements. Critical Fixes (4): - Make NATS connection mandatory with ConnectionError on failure - Add two-layer error handling to task execution - Replace generic Exception catches with specific error types - Exit with code 1 on all failure paths Documentation (5): - Correct NATS event subjects (remove non-existent events) - Add prerequisites sections to all agent-sdk docs - Fix example code placeholders with runnable examples - Update model IDs (remove date suffixes) - Document storage backends and timeouts Improvements (5): - Add Google-style docstrings to key functions (≥80% coverage) - Enhance Crush configurator docstrings - Improve list/status placeholders with NATS monitoring guidance - Fix context manager usage pattern - Add comprehensive timeout documentation All syntax checks pass. Docstring coverage ≥80%. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Codex Agent <codex-agent@example.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Merge PR #393 - Geometric framework upgrade - Merged main's github-runner-ctl service configuration - Removed duplicate @DataClass decorator in controller.py - Fixed env.tier-agent environment variables 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…rs (#321) Comprehensive GEOMETRY BUS integration across PMOVES.AI services with CHIT shape attribution support. - CGP publishing to `tokenism.cgp.ready.v1` in DeepResearch and SupaSerch - CHIT voice attribution events in Flute Gateway - CHIT event subscriptions in Publisher Discord - Prometheus metrics and /metrics endpoint for DeepResearch - Proper error handling separation (build vs publish errors) - TensorZero mode with Ollama model support 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…ization (#343) * feat(geometry-bus): add submodules and CHIT mathematical documentation Registers previously half-initialized submodules and adds new ones: - PMOVES-Pinokio-Ultimate-TTS-Studio: TTS Pinokio package - PMOVES-tensorzero: Full TensorZero codebase - Pmoves-hyperdimensions: Three.js parametric surface visualizer Adds PMOVESCHIT mathematical foundation documentation: - Hyperbolic geometry (Poincaré Disk Model) - Riemann zeta dynamics for spectral filtering - Holographic principle for dimensional encoding - Human_side prosodic sidecar for voice agents This establishes the mathematical framework for CGP v2 (CHIT Geometry Packets) used in cross-modal GEOMETRY BUS communication. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(geometry-bus): add CHIT and hyperdimensions TAC commands Adds 7 new TAC commands for GEOMETRY BUS interaction: CHIT Commands: - /chit:encode - Encode data as CGP v2 packet - /chit:decode - Decode and validate CGP v2 packets - /chit:visualize - Render packet geometry via hyperdimensions - /chit:bus - Publish/subscribe to GEOMETRY BUS Hyperdimensions Commands: - /hyperdim:render - Render parametric surfaces (Poincaré, zeta, etc.) - /hyperdim:animate - Create animated visualizations - /hyperdim:export - Export to GLTF, STL, PNG formats Updates geometry-nats-subjects.md with: - CHIT packet lifecycle events (encoded/decoded) - Visualization request/ready events - EvoSwarm population and solution events - tokenism.transform.v1 for transformations - TAC command integration table 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: align PMOVESCHIT, Flute, and persona documentation with implementation Phase 1: Document Consolidation - Add deprecation notices to duplicate Flute Architecture docs Phase 2: PMOVESCHIT Core Updates - Create IMPLEMENTATION_STATUS.md tracking TypeScript/Python modules - Add implementation cross-references to PMOVESCHIT.md - Add status banners to decoder specification docs Phase 3: Flute Voice Documentation - Create FLUTE_PROSODIC_ARCHITECTURE.md (boundary types, TTFS optimization) - Create voice-personas.md (Supabase schema, provider configs) Phase 4: CATACLYSM & Personas - Create PERSONAS.md with math-enhanced 325+ persona framework - Add implementation links to CATACLYSM_STUDIOS_INC.md Phase 5: Cross-Reference Index - Create documentation-index.md navigation matrix 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Codex Agent <codex-agent@example.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Add /workflow/consciousness_demo and /workflow/consciousness_categories endpoints to generate CGP (Constellation Geometry Protocol) packets from the Kuhn Landscape consciousness taxonomy (325 theories). Features: - Load and parse kuhn_full_taxonomy.json (Robert Lawrence Kuhn, 2024) - Filter theories by category (materialism, dualism, panpsychism, etc.) - Generate CGP packets with constellations and points - Return theory metadata with proponents and descriptions Endpoints: - POST /workflow/consciousness_demo - Generate CGP from theories - GET /workflow/consciousness_categories - List available categories Includes 12 unit tests validating: - Taxonomy loading and parsing - Theory extraction and filtering - CGP packet structure - Spectrum generation per category 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Resolved merge conflicts: - pmoves/docker-compose.yml: Keep tier-based env file anchors (security feature) - pmoves/services/deepresearch/worker.py: Take hardened version with _get_or_create_counter fix - pmoves/services/notebook-sync/sync.py: Convert @app.on_event to lifespan context manager - pmoves/services/hi-rag-gateway-v2/app.py: Convert @app.on_event to lifespan context manager 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Applies dynamic port pattern to all services and updates services catalog
with comprehensive tier/port/core status classification.
Changes:
- Apply ${SERVICE_PORT:-default} pattern to 46 service port mappings
- Update services catalog with 62 services including tier assignments
- Add port variable names, core status, and DOCKED_MODE indicators
- Verify voice service configurations (flute-gateway, ultimate-tts-studio)
Dynamic Port Pattern:
- Before: ports: ["8080:8080"]
- After: ports: ["${AGENT_ZERO_PORT:-8080}:8080"]
Services Catalog:
- 5-tier network model documentation
- Port variable references for all services
- Core vs optional classification
- DOCKED_MODE support indicators
Voice Services Verified:
- flute-gateway: ${FLUTE_GATEWAY_PORT:-8055}:8055, :8056
- ultimate-tts-studio: ${ULTIMATE_TTS_STUDIO_PORT:-7861}:7861
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Docker Compose does not support nested variable expansion like
${VAR1:-${VAR2:-default}}. When VAR2 is empty, this creates
invalid port strings like "-8099".
Fixed 3 services:
- supaserch: ${SUPASERCH_PORT:-${SUPASERCH_HOST_PORT}:-8099}
→ ${SUPASERCH_PORT:-8099}
- tokenism-simulator: ${TOKENISM_SIMULATOR_PORT:-${TOKENISM_HOST_PORT}:-8103}
→ ${TOKENISM_SIMULATOR_PORT:-8103}
- tokenism-ui: ${TOKENISM_UI_PORT:-${TOKENISM_UI_HOST_PORT}:-8504}
→ ${TOKENISM_UI_PORT:-8504}
Use the generated .env.generated file to override these ports
via environment variables if needed.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## Changes
### 1. Remove hardcoded credentials from env.tier-data (CRITICAL)
- POSTGRES_PASSWORD: Replace hardcoded value with ${POSTGRES_PASSWORD:-changeme}
- NEO4J_AUTH: Replace hardcoded value with ${NEO4J_PASSWORD:-changeme}
- Users must now set these via environment variables
### 2. Fix overly permissive RLS policies (CRITICAL)
- Replace USING (true) with namespace-based tenant isolation
- Tables affected: anchors, constellations, shape_points, shape_index, detections, segments, emotions
- Policies now use: current_setting('app.current_tenant', true)
- Fallback to 'pmoves' namespace for default tenant
### 3. Secure ClickHouse healthcheck URLs (CRITICAL)
- Remove hardcoded credentials from healthcheck URLs
- Use ${CLICKHOUSE_USER} and ${CLICKHOUSE_PASSWORD} environment variables
- Also fixed TENSORZERO_CLICKHOUSE_URL with same approach
## Security Impact
These changes address CRITICAL vulnerabilities found in code review:
- Hardcoded production credentials removed from version control
- Database row-level security now implements proper tenant isolation
- Process list no longer exposes ClickHouse credentials
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…ructure This ensures the security fixes from PMOVES.AI-Edition-Hardened are present when merging PR #473. Fixes: 1. env.tier-data - Remove hardcoded credentials - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme} - NEO4J_AUTH: neo4j/${NEO4J_PASSWORD:-changeme} 2. pmoves/supabase/initdb/06_media_analysis.sql - Restore with tenant isolation - Replaced USING (true) with namespace-based tenant isolation - Policies check app.current_tenant setting 3. pmoves/supabase/initdb/09_geometry_rls.sql - Restore with tenant isolation - Replaced USING (true) with namespace-based tenant isolation - Read policies check app.current_tenant setting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
read_shape_points_tenant -> read_shape_index_tenant
…d' into PMOVES.AI-Edition-Hardened # Conflicts: # features/gateway/docker-compose.yml
… Consciousness docs from main branch This commit restores critical documentation and implementation files that were missing from the PMOVES.AI-Edition-Hardened branch. ## Evoswarm Implementation (9 files) - CRITICAL - .claude/context/evoswarm.md - Evoswarm context documentation - pmoves/docs/context/py_and_collabs/evoswarm_evolutionary_test_time_optimization_for_llm_agents.py - pmoves/docs/context/py_and_collabs/EvoSwarm_Evolutionary_Test_Time_Optimization_for_LLM_Agents.ipynb - pmoves/docs/architecture/evoswarm-agentgym-rl-integration.md - pmoves/docs/architecture/evoswarm-agentgym-rl-quickstart.md - pmoves/docs/notes/chit_evoswarm_gan_plan.md - pmoves/contracts/schemas/geometry/swarm.meta.v1.schema.json - pmoves/supabase/migrations/2025-10-18_geometry_swarm.sql (FIXED: tenant-isolated RLS) - pmoves/db/v5_13_geometry_swarm.sql ## CHIT Documentation (5 files) - pmoves/docs/PMOVESCHIT/Human_side.md - pmoves/docs/PMOVESCHIT/Integrating Math into PMOVES.AI.md - pmoves/docs/PMOVESCHIT/Mathematical_UI_Design_Specification.md - pmoves/docs/PMOVESCHIT/Mathematical_UI_Implementation_Plan.md - pmoves/docs/PMOVESCHIT/PMOVES-CONCHexecution_guideb.md ## Constellation-Harvest-Regularization (3 files) - pmoves/docs/PMOVESCHIT/Constellation-Harvest-Regularization/README.md - pmoves/docs/PMOVESCHIT/Constellation-Harvest-Regularization/app.py (18KB) - pmoves/docs/PMOVESCHIT/Constellation-Harvest-Regularization/Understanding Range-Partition-Entropy (RPE).docx ## Flute Architecture (2 files) - .claude/context/flute-gateway.md - pmoves/monitoring/grafana/dashboards/flute-gateway.json ## Geometry Bus (5 files) - pmoves/services/common/geometry_params.py - pmoves/services/gateway/scripts/mini_geometry_decode.py - pmoves/services/gateway/scripts/chit_client.py - pmoves/services/gateway/scripts/chit_sign.py - pmoves/supabase/migrations/2025-09-08_geometry_bus.sql - pmoves/supabase/migrations/2025-10-18_geometry_swarm_compat.sql - pmoves/supabase/migrations/2025-10-20_geometry_cgp_views.sql ## Consciousness/Persona (4 files) - pmoves/docs/PERSONAS.md - pmoves/datasets/personas/ (directory with persona files) - pmoves/services/gateway/gateway/api/consciousness.py - pmoves/services/gateway/tests/test_consciousness_demo.py ## Security Fixes Applied - Fixed RLS policies in 2025-10-18_geometry_swarm.sql to use tenant isolation - Excluded insecure 2025-09-08_geometry_bus_rls.sql (hardened version exists) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit addresses critical issues preventing service bringup on the
hardened branch before submodule restructure.
**CHIT Secrets Management (secrets_manifest_v2.yaml):**
- Add 14 missing keys to manifest v2 for llm tier:
- OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
- TENSORZERO_GATEWAY_URL, TENSORZERO_CLICKHOUSE_*
- TENSORZERO_PG_* (database config)
- VENICE_API_KEY, Z_AI_API_KEY, MOONSHOT_API_KEY
- CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN
- OLLAMA_URL (client compatibility)
- Manifest now has 33 llm tier entries (was 19)
**Make Targets (Makefile):**
- Add `chit-apply-manifest` target for applying v2 manifest to tier env files
- Uses pmoves.chit.apply_manifest_v2() from CHIT module
**Docker Compose Fixes:**
- Add pmoves_data network to tensorzero-gateway (ClickHouse connectivity)
- Fix INVIDIOUS env interpolation: change ${VAR:?required} to ${VAR:-default}
- invidious service: INVIDIOUS_HMAC_KEY, INVIDIOUS_COMPANION_KEY
- invidious-companion service: SERVER_SECRET_KEY
- Services now load keys from env.tier-media without manual exports
**Documentation (from main branch):**
- Copy 5 critical documentation files to hardened branch:
- tier-architecture.md: 6-tier env + 5-tier network model
- services-catalog.md: Complete service listing with dynamic ports
- nats-subjects.md: Comprehensive NATS subject catalog
- geometry-nats-subjects.md: GEOMETRY BUS subjects
- docs/PORT_REGISTRY.md: Port allocation registry
**Fixes Issues:**
- TensorZero Gateway can now reach ClickHouse via pmoves_data network
- INVIDIOUS services start without manual variable exports
- CHIT manifest v2 workflow is complete and functional
- All tier env files auto-populate via `make chit-apply-manifest`
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add <<: *env-tier-* anchors to qdrant, postgrest-health, bgutil-pot-provider
- Fix hardcoded ports to use ${SERVICE_PORT:-default} pattern:
- botz-gateway: ${BOTZ_GATEWAY_PORT:-8054}
- evo-controller: ${EVO_CONTROLLER_PORT:-8113}
- ultimate-tts-studio: ${ULTIMATE_TTS_PORT:-7861}
- flute-gateway: ${FLUTE_GATEWAY_PORT:-8055}, ${FLUTE_WS_PORT:-8056}
- github-runner-ctl: ${GITHUB_RUNNER_CTL_PORT:-8104}
- Add port registry variables to env.tier-agent and env.tier-media
- Move PGRST_DB_URI to env.tier-api (fixes compose-time var expansion)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add sync_common_credentials() to enforce credential consistency across tiers - Add multi-tier targeting for Jellyfin secrets (agent + media tiers) - Add worker tier static configuration entries (type: static) - Update apply_manifest_v2() to call sync_common_credentials() - Update env.tier-*.example files with correct structure and port variables 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the 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. Comment |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Critical security and reliability fixes: 1. sync_common_credentials() - Add error handling & prevent credential override - Added force=False parameter to only ADD missing credentials - Never REPLACES existing values unless force=True - Added comprehensive error handling (PermissionError, OSError, UnicodeDecodeError) - Returns Dict[str, List[str]] with detailed changes made - Added logging for all operations - Updated docstring to list all 10 credentials (was only 6) - Added security warning about development defaults 2. decode_secret_map() - Fix bare except clause - Changed 'except Exception' to 'except (ValueError, TypeError)' - Added warning log on decode failure - Preserves raw value as fallback 3. apply_manifest_v2() - Add YAML error handling - Added try/except for FileNotFoundError, YAMLError, OSError - Validates manifest structure before processing - Proper error messages with context 4. RLS policies - Require authentication - Changed USING (true) to USING (auth.uid() IS NOT NULL) - Added comment about future tenant/namespace scoping 5. secrets_manifest_v2.yaml - Remove duplicate keys - Removed duplicate tier_layout, github_sync, docker_secrets 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The env.tier-* files should be gitignored and not tracked in git. They contain runtime credentials that differ per environment. Users should copy env.tier-*.example files to create their local configs. This commit removes the tracked env.tier files from git while keeping the sanitized local copies for development use. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Scout report: LOW RISK - No conflicts expected Changes: CI/CD build fixes, Comfy-watcher fixes, notebook-sync style fixes # Conflicts: # .claude/commands/chit/bus.md # .claude/commands/hyperdim/animate.md # .gitmodules # pmoves/docker-compose.yml # pmoves/docs/PMOVESCHIT/CATACLYSM_STUDIOS_INC.md # pmoves/docs/PMOVESCHIT/PMOVESCHIT.md # pmoves/docs/PMOVESCHIT/Pmoves-Aragon-adabara-md # pmoves/env.tier-agent # pmoves/services/notebook-sync/sync.py # pmoves/services/publisher-discord/main.py # pmoves/services/supaserch/app.py # pmoves/tensorzero/config/tensorzero.toml
Scout report: MEDIUM RISK - Known conflicts expected - Hi-RAG WebSocket extra_headers removal (uvloop fix) - NATS auth config changes - Archon submodule update # Conflicts: # pmoves/tools/mini_cli.py
Scout report: HIGH RISK - Major YAML restructuring expected - Preserve YAML anchor structure (<<: *env-tier-*) - Standardize port variable names - Supabase URL consistency # Conflicts: # pmoves/docker-compose.yml
- fix(publisher-discord): Use urlparse for proper hostname validation instead of substring check (py/incomplete-url-substring-sanitization) - docs(geometry_decoder): Add comment explaining SHA256 is for key ID generation, not password hashing (py/weak-sensitive-data-hashing - false positive) - fix(github): Add permissions: contents: read to validate jobs (actions/missing-workflow-permissions) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
Replaced by PR #478 from clean branch PMOVES.AI-Edition-Hardened-v2. The previous branch had lost critical production services (flute-gateway, consciousness-service) during merge conflict resolution. |
- fix(publisher-discord): Use urlparse for proper hostname validation instead of substring check (py/incomplete-url-substring-sanitization) - docs(geometry_decoder): Add comment explaining SHA256 is for key ID generation, not password hashing (py/weak-sensitive-data-hashing - false positive) - fix(github): Add permissions: contents: read to validate jobs (actions/missing-workflow-permissions) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Summary
Align services to tier env architecture with dynamic port registry and credential synchronization.
Changes
<<: *env-tier-*to qdrant, postgrest-health, bgutil-pot-provider${SERVICE_PORT:-default}patternsync_common_credentials()for automatic credential consistencyTesting
Breaking Changes
None. Default port values remain the same.
🤖 Generated with Claude Code