Merge main into feature/ADR-191-oop-ml-pipeline#237
Merged
jodavis merged 10 commits intoJun 26, 2026
Merged
Conversation
--- updated-dependencies: - dependency-name: Microsoft.Extensions.Hosting dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
--- updated-dependencies: - dependency-name: Azure.Monitor.OpenTelemetry.Exporter dependency-version: 1.8.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
--- updated-dependencies: - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
) * Add devcontainer definition for reproducible Linux dev environment Provides a Docker-based devcontainer so Claude Code remote sessions and local contributors get a consistent environment with all dependencies pre-installed. - Base image: mcr.microsoft.com/devcontainers/base:ubuntu-24.04 (vscode user with passwordless sudo, git, curl pre-installed) - Baked into image: GitHub CLI, .NET 10 SDK, PowerShell, Node.js LTS, Claude Code CLI, Playwright OS-level Chromium deps, Python ML venv at /opt/ml-env with numpy/pandas/tensorflow/dvc - ~/.claude mounted as named volume (survives container rebuilds; first Claude Code login is interactive, subsequent starts reuse credentials) - GITHUB_TOKEN forwarded from host environment so gh works without interactive login - post-create.sh: dotnet restore → dotnet build → playwright.ps1 install chromium --with-deps (version-matched to Microsoft.Playwright NuGet pin) - ml/requirements.txt added alongside devcontainer so Dockerfile COPY works from the repo-root build context Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019jmGA95hGTRu4aZ4yL45NL * Add CI workflow to test-build the devcontainer Builds the Docker image on every push/PR that touches devcontainer files or ml/requirements.txt, then runs a smoke test inside the built container to verify .NET, gh, Node.js, Python, and the ML venv packages are all present and importable. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019jmGA95hGTRu4aZ4yL45NL * Fix devcontainer build: install python3-venv before creating venv On Debian/Ubuntu, python3-venv is a separate package from python3 and must be explicitly installed before python3 -m venv will work. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019jmGA95hGTRu4aZ4yL45NL * Address Copilot review comments on devcontainer - Dockerfile: replace curl|bash NodeSource install with explicit GPG keyring + pinned node_24.x repo for auditability and reproducibility - devcontainer.json: forward GH_TOKEN alongside GITHUB_TOKEN (gh CLI checks both env vars depending on how the host is configured) - post-create.sh: export ~/.dotnet/tools to PATH in the fallback branch before calling playwright, since global tool installs land there and it is not on PATH by default; fix quality gate script names to include the .sh extension - ml/requirements.txt: pin to versions validated by the CI build (numpy 2.5.0, pandas 3.0.3, tensorflow 2.21.0, dvc 3.67.1) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019jmGA95hGTRu4aZ4yL45NL * Fix ~/.claude volume ownership so Claude Code login can write credentials Docker initialises a named volume from the image's directory at the mount point. If the directory doesn't exist in the image, Docker creates a root-owned entry and the vscode user cannot write to it — causing the 'login succeeds in browser but shows as not logged in' symptom. Creating ~/.claude as the vscode user in the Dockerfile ensures the volume is initialised with UID 1000 ownership on first use. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019jmGA95hGTRu4aZ4yL45NL * Configure container with default permissions settings * Add skills to define agent behavior specific to this project's work tracking, code style, and documentation standards. * CI validation of devcontainer with conditional execution * Fix devcontainer image name case: lowercase repository for Docker registry github.repository expands to jodavis/AdaptiveRemote (uppercase A) which Docker rejects — registry names must be all lowercase. Add a step that pipes the repository name through tr to produce the lowercase image name, then reference it via step output in imageName and cacheFrom. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019jmGA95hGTRu4aZ4yL45NL * Fix CLAUDE_DEFAULTS path in post-create.sh Was pointing at /home/vscode/.claude/settings.json (the volume target, same as CLAUDE_SETTINGS). Should point at /home/vscode/.claude-defaults/ settings.json where the Dockerfile bakes the template. In CI the named volume is always fresh so the source never exists and cp fails. Locally this is masked because returning developers already have settings in the persistent volume and the if-block is skipped. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Mark validate scripts executable (git mode 100755) validate.sh calls validate-build.sh and validate-tests.sh directly (no bash prefix), so they must be executable. Without the execute bit the devcontainer CI run fails with exit code 126 (permission denied) when validate.sh reaches line 20. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Minor updates to skill definitions --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Joe Davis <ElwoodMoves@hotmail.com>
librosa -> resampy -> numba, and numba <0.59.0 does not support Python 3.12.3 (Ubuntu 24.04 system Python). numba 0.59.0 added Python 3.12 support. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
numpy==2.5.0 conflicts with numba (latest numba supports numpy<2.5). Librosa brings in resampy which requires numba>=0.59.0, but numba 0.59.0 requires numpy<1.27, and no numba version supports numpy 2.5.0. Use numpy>=1.22 to let pip find a compatible version that satisfies both tensorflow 2.21.0 and numba/librosa. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…dentials Adds a git-askpass.sh script baked into the image at /usr/local/bin/git-askpass that supplies GITHUB_TOKEN for git credential prompts. GIT_ASKPASS is set in containerEnv so it takes precedence over the VS Code credential helper injected on each container attach, keeping host git credentials out of the container.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
mainintofeature/ADR-191-oop-ml-pipeline, including the new devcontainer definition.gitignore: replaced feature-branch-specific.claude/settings.local.jsonentry with main's more general*.local.*pattern (which covers it) and addsdotnet/cache exclusionml/requirements.txt: merged both sets of dependencies (feature branch: pytest/audio libs; main: numpy/pandas/tensorflow/dvc)Commits from main included
🤖 Generated with Claude Code