Skip to content

NO-JIRA: devcontainer fixes and improvements#3511

Open
smg247 wants to merge 5 commits intoopenshift:mainfrom
smg247:dev-container-fixes
Open

NO-JIRA: devcontainer fixes and improvements#3511
smg247 wants to merge 5 commits intoopenshift:mainfrom
smg247:dev-container-fixes

Conversation

@smg247
Copy link
Copy Markdown
Member

@smg247 smg247 commented May 7, 2026

lint now works
dual db mode with seeded and prodlike dbs for different workflows
ability to restore prodlike db from production backup dump
convert MCP tool functions to async (asyncio) to fix server connection loss
Mount host ~/.claude into container
install Claude Code in post-create
Isolate e2e redis db to avoid collisions

Summary by CodeRabbit

  • New Features

    • Dual dev data modes: seed (default) and prod-like (BigQuery-backed); added prod-like restore and e2e run support.
  • Documentation

    • Expanded setup, migration, restore, and credential guidance; prompts and MCP docs now reflect mode-aware defaults, explicit migrate/restore workflows, and that regression-cache targets prod-like by default.
  • Chores

    • Devcontainer and init scripts updated for prod-like DB and BigQuery credentials; lint invocation simplified to use make lint.
  • Tests

    • Added tests for data-mode and DSN selection behavior.

smg247 and others added 2 commits May 7, 2026 15:24
 lint now works
 dual db mode with seeded and prodlike dbs for different workflows
 ability to restore prodlike db from production backup dump
 convert MCP tool functions to async (asyncio) to fix server connection loss
 Mount host ~/.claude into container; install Claude Code in post-create
 Isolate e2e redis db to avoid collisions
The previous commit removed the container fallback, breaking lint on
bare hosts without golangci-lint installed. Now auto-detects: uses local
golangci-lint when available, otherwise runs via Podman container.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@openshift-merge-bot
Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: automatic mode

@openshift-ci openshift-ci Bot requested review from dgoodwin and stbenjam May 7, 2026 19:31
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 7, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: smg247

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label May 7, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 7, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 43129bdf-dbf6-44e8-b0af-2419bf1ddff5

📥 Commits

Reviewing files that changed from the base of the PR and between fbc5ba9 and bbd1ecd.

📒 Files selected for processing (2)
  • .devcontainer/Dockerfile
  • .devcontainer/devcontainer.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • .devcontainer/Dockerfile

Walkthrough

Adds dual dev database modes (seed vs prod-like) selectable via SIPPY_DATA_MODE, migrates MCP server tools/helpers to async with mode-aware DSN helpers, and introduces MCP tools restore_prodlike_db and run_e2e. Updates devcontainer, init/post-create scripts, prompts, docs, tests, linting, and related tooling to support the two-database workflow.

Changes

Dual Database Modes and Async MCP Server

Layer / File(s) Summary
Environment / Data Shape
.devcontainer/.env.example, .devcontainer/devcontainer.json, .devcontainer/README.md
Introduce SIPPY_DATA_MODE (default seed), BigQuery/Vertex-related envs and credential paths, and documented seed vs prod-like DB modes and defaults.
Container Image / Tooling
.devcontainer/Dockerfile
Install/enable PostgreSQL 17 client via PGDG, run dnf clean all, and adjust installed tooling (Astral uv install change, removed Claude installer arg).
Init & Bootstrapping
.devcontainer/init-services.sh, .devcontainer/post-create.sh
Create prodlike DB if missing, ensure host credential dirs exist, install Claude Code, provision MCP Python venv, and run separate seed/prod-like migrations using SIPPY_SEED_DATABASE_DSN/SIPPY_PRODLIKE_DATABASE_DSN.
Core Server / Control Flow (async)
mcp/server.py
Load .devcontainer/.env, add _data_mode() and _dsn_for_mode() helpers, convert many MCP tools/helpers to async, validate DSN/Redis inputs, run subprocesses via asyncio with timeouts and log tailing, set regression_cache default to prod-like, and add restore_prodlike_db and run_e2e tools.
Scripts & Local Tooling
scripts/e2e.sh, hack/go-lint.sh
Change e2e Redis default to logical DB 1; simplify lint invocation to make lint/prefer local golangci-lint with container fallback and unified invocation.
Prompts & Documentation (APM / MCP)
.apm/instructions/*, .apm/prompts/*, mcp/README.md, mcp/AGENTS.md, mcp/CLAUDE.md
Document two-database modes, mode-derived defaults, explicit migrate/restore steps, new sippy-dev-restore-prodlike prompt, updated MCP tool list, and guidance to run make apm / make verify-apm.
Tests / Verification
mcp/test_server.py
Add tests TestDataMode and TestDsnForMode validating _data_mode() behavior and _dsn_for_mode() DSN selection/precedence; retain existing config tests.
Dependencies & Lockfile
mcp/requirements.txt, apm.lock.yaml
Add python-dotenv to MCP requirements and regenerate apm.lock.yaml to include new deployed prompt/command artifacts and updated hashes.
Misc Config
.snyk
Exclude mcp/server.py from Snyk Code scanning.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant MCP as MCP Server
    participant Config as Env/Helpers
    participant Service as Backend (sippy)
    participant DB as PostgreSQL
    Note over User,MCP: Seed mode (default)
    User->>MCP: sippy_serve()
    MCP->>Config: _data_mode() -> "seed"
    Config-->>MCP: select seed DSN (SIPPY_SEED_DATABASE_DSN or default)
    MCP->>Service: spawn backend (data_provider=postgres)
    Service->>DB: connect to postgres (seed DB)
    DB-->>Service: seed data available
    Service-->>MCP: ready
    MCP-->>User: backend ready
    Note over User,MCP: Prod-like mode
    User->>MCP: sippy_serve()
    MCP->>Config: _data_mode() -> "prod-like"
    Config-->>MCP: select prodlike DSN (SIPPY_PRODLIKE_DATABASE_DSN or default)
    MCP->>Service: spawn backend (data_provider=bigquery, views_file=config/views.yaml)
    Service->>DB: connect to prodlike fallback
    DB-->>Service: prodlike data available
    Service-->>MCP: ready
    MCP-->>User: backend ready
Loading
sequenceDiagram
    actor User
    participant MCP as MCP Server
    participant Script as restore_prodlike_db.sh
    participant DB as PostgreSQL
    participant Logs as Log File
    User->>MCP: restore_prodlike_db(backup_file)
    MCP->>MCP: validate repo-relative path and permissions
    MCP->>Script: spawn restore subprocess
    Script->>Script: detect dump format
    alt custom/dir format
        Script->>DB: pg_restore -d prodlike ...
    else sql dump
        Script->>DB: psql -d prodlike -f ...
    end
    DB-->>Script: restore output
    Script->>Logs: write logs
    MCP->>Logs: tail logs and report status
    MCP-->>User: restore success/failure with log excerpt
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

🚥 Pre-merge checks | ✅ 16 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.93% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (16 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: devcontainer fixes and improvements, which accurately reflects the substantial updates across devcontainer configuration, database modes, MCP tools, and documentation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Go Error Handling ✅ Passed The Go Error Handling check is not applicable. This PR contains no modifications to Go source files (.go). Changes are limited to documentation, shell scripts, Python code, and configuration files.
Sql Injection Prevention ✅ Passed No SQL injection vulnerabilities. Code uses hardcoded names, binary args, and asyncio subprocess with separate args—not shell concatenation or string-based SQL construction.
Excessive Css In React Should Use Styles ✅ Passed PR does not modify any React/JSX component files. Check targets React styling only; all changes are to devcontainer, Python MCP code, scripts, and documentation.
Test Coverage For New Features ✅ Passed Pure functions (_data_mode, _dsn_for_mode) are tested. New tool functions lack tests but require external dependencies (DB, BigQuery), qualifying for the "hard to test" exception per guidelines.
Single Responsibility And Clear Naming ✅ Passed Clear function names with single purposes. No generic patterns. Appropriate variable and file naming.
Stable And Deterministic Test Names ✅ Passed Repository does not use Ginkgo testing framework; it uses standard Go testing and Python pytest. New test file (mcp/test_server.py) has stable, deterministic test names. Check not applicable.
Test Structure And Quality ✅ Passed This PR contains no Ginkgo tests. The only test file modified (mcp/test_server.py) uses pytest (Python framework), not Ginkgo. The check is not applicable to this PR.
Microshift Test Compatibility ✅ Passed No new Ginkgo e2e tests added in this PR. Changes are to devcontainer, APM docs, and MCP server. Existing tests use standard Go testing, not Ginkgo. Check not applicable.
Single Node Openshift (Sno) Test Compatibility ✅ Passed This PR does not add any new Ginkgo e2e tests. Repository uses testify framework, not Ginkgo. Changes to scripts/e2e.sh are infrastructure-only.
Topology-Aware Scheduling Compatibility ✅ Passed PR modifies only development environment setup, documentation, and dev tools. Contains zero Kubernetes manifests, operator code, or scheduling constraints. Check is not applicable.
Ote Binary Stdout Contract ✅ Passed PR does not modify any OTE binaries, test discovery code, or test execution infrastructure. Changes are limited to devcontainer setup and MCP utilities.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed This PR does not add any new Ginkgo e2e tests. Changes are documentation, configuration, and script updates only. No Go test files with Ginkgo patterns were added.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
mcp/server.py (2)

377-432: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fail fast when prod-like mode cannot resolve BigQuery credentials.

In prod-like mode this defaults data_provider to bigquery, but the _resolve_bigquery_creds() error is discarded. That lets sippy_serve return “started and ready” even when the required credentials are missing or invalid, and the misconfiguration only shows up later on the first BigQuery-backed request.

Suggested fix
-    creds_path, _ = _resolve_bigquery_creds(bigquery_credentials_file)
-    if creds_path:
+    creds_path = None
+    if data_provider == "bigquery" or bigquery_credentials_file is not None:
+        creds_path, err = _resolve_bigquery_creds(bigquery_credentials_file)
+        if err:
+            return err
+    if creds_path:
         args.extend(["--google-service-account-credential-file", str(creds_path)])
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mcp/server.py` around lines 377 - 432, When running in prod-like mode the
code must fail fast if BigQuery credentials are missing: capture both return
values from _resolve_bigquery_creds (creds_path, err) instead of discarding err,
and if data_mode == "prod-like" (or data_provider == "bigquery") and creds_path
is None return or raise a clear error including err; only extend args with the
google-service-account-credential-file when creds_path is present. This change
should be applied around the existing call to _resolve_bigquery_creds in
sippy_serve so the service does not report started when BigQuery creds are
unresolved.

455-466: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Make sippy_stop async before calling _stop_pids.

_stop_pids() is now async, so calls at lines 461 and 465 create unawaited coroutine objects. The tool will report success without actually sending any signals to stop the processes.

Suggested fix
 `@mcp.tool`()
-def sippy_stop() -> str:
+async def sippy_stop() -> str:
     """Stop running sippy_serve and sippy_ng_start processes."""
     results = []
     serve_pids = _pids_sippy_serve()
     if serve_pids:
-        _stop_pids(serve_pids)
+        await _stop_pids(serve_pids)
         results.append(f"Stopped sippy_serve (pid(s) {', '.join(str(p) for p in serve_pids)})")
     ng_pids = _pids_sippy_ng_dev()
     if ng_pids:
-        _stop_pids(ng_pids)
+        await _stop_pids(ng_pids)
         results.append(f"Stopped sippy_ng (pid(s) {', '.join(str(p) for p in ng_pids)})")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mcp/server.py` around lines 455 - 466, The sippy_stop function currently
calls the now-async _stop_pids without awaiting it; make sippy_stop an async
function (change def sippy_stop() -> str: to async def sippy_stop() -> str:) and
await each _stop_pids(...) call where serve_pids and ng_pids are handled,
ensuring you await _stop_pids(serve_pids) and await _stop_pids(ng_pids); keep
the rest of the logic (building results list and return) the same and keep the
`@mcp.tool`() decorator in place if it supports async functions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.apm/instructions/dev-commands.instructions.md:
- Around line 8-17: The single-database example still points SIPPY_DATABASE_DSN
at the seed DB which misleads prod-like workflows; update the docs so the
example is mode-specific or remove the ambiguous single-command and point
readers to the explicit commands using SIPPY_SEED_DATABASE_DSN and
SIPPY_PRODLIKE_DATABASE_DSN (or mention SIPPY_DATA_MODE=prodlike) when running
go run ./cmd/sippy migrate --database-dsn, ensuring the example clearly shows
how to migrate the seed vs prod-like databases.

In @.devcontainer/devcontainer.json:
- Around line 11-12: The devcontainer mounts for ~/.config/gcloud and ~/.claude
are unconditional and can fail on first-run; update
.devcontainer/devcontainer.json so the host directories are created before the
bind mounts or gate the mounts: add or update the initializeCommand to run a
host-side mkdir -p for ${localEnv:HOME}/.config/gcloud and
${localEnv:HOME}/.claude (so they exist before the container is created), or
alternatively change the mount entries to a gated/optional pattern supported by
your devcontainer runtime; touch the initializeCommand and the mount lines (the
entries shown in the diff) so they reference these ensured directories.

In @.devcontainer/post-create.sh:
- Around line 35-39: The current post-create.sh logic creates a symlink at
"$claude_projects/-workspace" only when it doesn't exist, causing it to remain
pointing to a previous repo; update the block that handles
HOST_WORKSPACE_FOLDER/host_project_dir/claude_projects to detect when
"$claude_projects/-workspace" is a symlink (use -L) and its target (readlink)
differs from "$claude_projects/$host_project_dir", and in that case remove the
existing symlink and recreate it to point at
"$claude_projects/$host_project_dir"; keep the existing checks for directory
existence and ensure the new code uses ln -s to recreate the symlink atomically
after removal.

In `@mcp/server.py`:
- Around line 13-17: The code that determines SIPPY_DATA_MODE should respect an
already-exported environment variable instead of unconditionally re-loading the
.env file; update the _data_mode() logic to first check
os.environ.get("SIPPY_DATA_MODE") and return that if present, and only
read/parse _DEVCONTAINER_ENV (or call load_dotenv) as a fallback when the env
var is absent; ensure any load_dotenv call uses override=False so it never
overwrites an explicit SIPPY_DATA_MODE.

---

Outside diff comments:
In `@mcp/server.py`:
- Around line 377-432: When running in prod-like mode the code must fail fast if
BigQuery credentials are missing: capture both return values from
_resolve_bigquery_creds (creds_path, err) instead of discarding err, and if
data_mode == "prod-like" (or data_provider == "bigquery") and creds_path is None
return or raise a clear error including err; only extend args with the
google-service-account-credential-file when creds_path is present. This change
should be applied around the existing call to _resolve_bigquery_creds in
sippy_serve so the service does not report started when BigQuery creds are
unresolved.
- Around line 455-466: The sippy_stop function currently calls the now-async
_stop_pids without awaiting it; make sippy_stop an async function (change def
sippy_stop() -> str: to async def sippy_stop() -> str:) and await each
_stop_pids(...) call where serve_pids and ng_pids are handled, ensuring you
await _stop_pids(serve_pids) and await _stop_pids(ng_pids); keep the rest of the
logic (building results list and return) the same and keep the `@mcp.tool`()
decorator in place if it supports async functions.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 78335c80-d689-404c-b18e-07feee698aea

📥 Commits

Reviewing files that changed from the base of the PR and between 701ddd6 and f8aa801.

⛔ Files ignored due to path filters (29)
  • .claude/commands/sippy-dev-app.md is excluded by !.claude/**
  • .claude/commands/sippy-dev-migrate.md is excluded by !.claude/**
  • .claude/commands/sippy-dev-regression-cache.md is excluded by !.claude/**
  • .claude/commands/sippy-dev-restore-prodlike.md is excluded by !.claude/**
  • .claude/commands/sippy-dev-serve.md is excluded by !.claude/**
  • .claude/commands/sippy-dev-setup.md is excluded by !.claude/**
  • .claude/commands/sippy-dev-tests.md is excluded by !.claude/**
  • .claude/rules/dev-commands.md is excluded by !.claude/**
  • .claude/rules/general.md is excluded by !.claude/**
  • .claude/rules/mcp.md is excluded by !.claude/**
  • .cursor/rules/dev-commands.mdc is excluded by !.cursor/**
  • .cursor/rules/general.mdc is excluded by !.cursor/**
  • .cursor/rules/mcp.mdc is excluded by !.cursor/**
  • .gemini/commands/sippy-dev-app.toml is excluded by !.gemini/**
  • .gemini/commands/sippy-dev-migrate.toml is excluded by !.gemini/**
  • .gemini/commands/sippy-dev-regression-cache.toml is excluded by !.gemini/**
  • .gemini/commands/sippy-dev-restore-prodlike.toml is excluded by !.gemini/**
  • .gemini/commands/sippy-dev-serve.toml is excluded by !.gemini/**
  • .gemini/commands/sippy-dev-setup.toml is excluded by !.gemini/**
  • .gemini/commands/sippy-dev-tests.toml is excluded by !.gemini/**
  • .opencode/commands/sippy-dev-app.md is excluded by !.opencode/**
  • .opencode/commands/sippy-dev-migrate.md is excluded by !.opencode/**
  • .opencode/commands/sippy-dev-regression-cache.md is excluded by !.opencode/**
  • .opencode/commands/sippy-dev-restore-prodlike.md is excluded by !.opencode/**
  • .opencode/commands/sippy-dev-serve.md is excluded by !.opencode/**
  • .opencode/commands/sippy-dev-setup.md is excluded by !.opencode/**
  • .opencode/commands/sippy-dev-tests.md is excluded by !.opencode/**
  • AGENTS.md is excluded by !AGENTS.md
  • CLAUDE.md is excluded by !CLAUDE.md
📒 Files selected for processing (25)
  • .apm/instructions/dev-commands.instructions.md
  • .apm/instructions/general.instructions.md
  • .apm/instructions/mcp.instructions.md
  • .apm/prompts/sippy-dev-app.prompt.md
  • .apm/prompts/sippy-dev-migrate.prompt.md
  • .apm/prompts/sippy-dev-regression-cache.prompt.md
  • .apm/prompts/sippy-dev-restore-prodlike.prompt.md
  • .apm/prompts/sippy-dev-serve.prompt.md
  • .apm/prompts/sippy-dev-setup.prompt.md
  • .apm/prompts/sippy-dev-tests.prompt.md
  • .devcontainer/.env.example
  • .devcontainer/Dockerfile
  • .devcontainer/README.md
  • .devcontainer/devcontainer.json
  • .devcontainer/init-services.sh
  • .devcontainer/post-create.sh
  • apm.lock.yaml
  • hack/go-lint.sh
  • mcp/AGENTS.md
  • mcp/CLAUDE.md
  • mcp/README.md
  • mcp/requirements.txt
  • mcp/server.py
  • mcp/test_server.py
  • scripts/e2e.sh

Comment thread .apm/instructions/dev-commands.instructions.md
Comment thread .devcontainer/devcontainer.json
Comment thread .devcontainer/post-create.sh
Comment thread mcp/server.py
…iner

- Validate database_dsn and redis_url inputs against scheme regexes
  before passing to subprocess (command injection finding)
- Fail fast in sippy_serve when data_provider=bigquery but no BigQuery
  credentials are available
- Make sippy_stop async and await _stop_pids so processes are actually
  terminated
- Ensure ~/.config/gcloud and ~/.claude exist before bind-mount
- Remove ambiguous SIPPY_DATABASE_DSN migration example from docs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
.apm/instructions/dev-commands.instructions.md (1)

12-15: 💤 Low value

Add language specifier to fenced code block.

The code block lacks a language specifier, which helps with syntax highlighting and tooling.

Suggested fix
-```
+```shell
 go run ./cmd/sippy migrate --database-dsn "$SIPPY_SEED_DATABASE_DSN"
 go run ./cmd/sippy migrate --database-dsn "$SIPPY_PRODLIKE_DATABASE_DSN"
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.apm/instructions/dev-commands.instructions.md around lines 12 - 15, Add a
language specifier to the fenced code block containing the two go run
./cmd/sippy migrate commands so tooling can syntax-highlight it; update the
block start from toshell (or ```bash) so the lines go run ./cmd/sippy
migrate --database-dsn "$SIPPY_SEED_DATABASE_DSN" and go run ./cmd/sippy migrate
--database-dsn "$SIPPY_PRODLIKE_DATABASE_DSN" are rendered with shell
highlighting.


</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.apm/instructions/dev-commands.instructions.md:

  • Around line 12-15: Add a language specifier to the fenced code block
    containing the two go run ./cmd/sippy migrate commands so tooling can
    syntax-highlight it; update the block start from toshell (or ```bash) so
    the lines go run ./cmd/sippy migrate --database-dsn "$SIPPY_SEED_DATABASE_DSN"
    and go run ./cmd/sippy migrate --database-dsn "$SIPPY_PRODLIKE_DATABASE_DSN" are
    rendered with shell highlighting.

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: Repository YAML (base), Central YAML (inherited)

**Review profile**: CHILL

**Plan**: Enterprise

**Run ID**: `c80c7a83-f36c-459f-8d70-be7292e461fb`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between f8aa801902a2f08a95fd9851ccae93205449d50c and 90b1a9863954f79b13c491e56868d357b4e6cfa1.

</details>

<details>
<summary>⛔ Files ignored due to path filters (4)</summary>

* `.claude/rules/dev-commands.md` is excluded by `!.claude/**`
* `.cursor/rules/dev-commands.mdc` is excluded by `!.cursor/**`
* `AGENTS.md` is excluded by `!AGENTS.md`
* `CLAUDE.md` is excluded by `!CLAUDE.md`

</details>

<details>
<summary>📒 Files selected for processing (5)</summary>

* `.apm/instructions/dev-commands.instructions.md`
* `.devcontainer/init-services.sh`
* `apm.lock.yaml`
* `mcp/server.py`
* `mcp/test_server.py`

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (2)</summary>

* .devcontainer/init-services.sh
* apm.lock.yaml

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

@openshift-merge-bot openshift-merge-bot Bot added the ready-for-human-review Indicates a PR has been reviewed by automated tools and is ready for human review label May 7, 2026
- Restore --timeout 10m to golangci-lint in the local path of
  hack/go-lint.sh (was dropped when simplifying the script)
- Exclude mcp/server.py from Snyk: create_subprocess_exec does not use
  a shell and all inputs are validated before reaching the subprocess

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@smg247 smg247 changed the title devcontainer fixes and improvements NO-JIRA: devcontainer fixes and improvements May 7, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 7, 2026
@openshift-ci-robot
Copy link
Copy Markdown

@smg247: This pull request explicitly references no jira issue.

Details

In response to this:

lint now works
dual db mode with seeded and prodlike dbs for different workflows
ability to restore prodlike db from production backup dump
convert MCP tool functions to async (asyncio) to fix server connection loss
Mount host ~/.claude into container
install Claude Code in post-create
Isolate e2e redis db to avoid collisions

Summary by CodeRabbit

  • New Features

  • Dual dev data modes: seed (default) and prod-like (BigQuery-backed); added prod-like restore and e2e run capabilities.

  • Documentation

  • Expanded setup, migration, restore, and credential guidance; prompts and MCP docs now reflect mode-aware defaults and explicit migrate/restore workflows.

  • Chores

  • Devcontainer and init scripts updated for prod-like DB and BigQuery creds; lint invocation simplified to make lint.

  • Tests

  • Added tests for data-mode and DSN selection behavior.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 7, 2026

@smg247: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. ready-for-human-review Indicates a PR has been reviewed by automated tools and is ready for human review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants