Repository navigation
Bump Radzen.Blazor from 5.3.5 to 5.5.5 - #12
Merged
Merged
Conversation
Bumps [Radzen.Blazor](https://github.com/radzenhq/radzen-blazor) from 5.3.5 to 5.5.5. - [Release notes](https://github.com/radzenhq/radzen-blazor/releases) - [Commits](radzenhq/radzen-blazor@v5.3.5...v5.5.5) --- updated-dependencies: - dependency-name: Radzen.Blazor dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
mpaulosky
added a commit
that referenced
this pull request
Oct 9, 2026
…ocally (#236) ## Why This addresses the Claude Review findings on the merged #228, which committed the Sandcastle setup. Three of them are design problems with the old plan, implement, merge loop: - **Done was decided by this run's commits.** A branch went to the merger only when `commits.length > 0` for this run. A re-planned issue whose branch already held finished work made no new commits, so it was never merged. An implementer that ran out of iterations without `<promise>COMPLETE</promise>` still had its commits merged and its issue closed. - **The merger closed issues before anything reached GitHub.** It merged into the host checkout (which stays on `main`, where the hooks refuse commits and pushes) and then ran `gh issue close`, with no PR, checks or review. - **Untrusted text reached agents holding `GH_TOKEN`.** Every comment and issue body on a `Sandcastle` issue went into the planner's prompt, and the implementer fetched the issue with `gh`. On a public repo anyone can comment, so injected instructions could steer agents that had an Issues-write token. ## What changed This ports the host-side design from mpaulosky/Articles#308, without the problems that design's own review found. - **One draft PR per issue, no merger.** `merge-prompt.md` is gone. `lib/build.mts` runs each issue in its own sandbox: implement, merge `origin/main`, run `.sandcastle/check.sh`, review, then push and open a draft PR whose body ends `Fixes #n`. The issue closes when that PR merges through the normal checks. Anything that stops (unfinished, merge conflict, failed check, rejection, failed push) gets a comment on the issue and isn't pushed. - **Done means finished and ahead of main.** The implementer must signal completion. After that the branch is checked, reviewed and published whenever `git rev-list --count origin/main..HEAD` is above 0, so earlier finished work still gets its PR. - **The reviewer returns a verdict.** It ends with `<verdict>{"approved", "summary"}</verdict>` (`lib/verdict.mts`). A missing or malformed verdict counts as a rejection. - **Only the host talks to GitHub.** `lib/github.mts` reads issues with the host's `gh` auth and keeps only issues opened by, and comments from, an `OWNER`, `MEMBER` or `COLLABORATOR`. The agents get the issue through prompt arguments. `.env.example` no longer has `GH_TOKEN`, and `main.mts` refuses to start if `.sandcastle/.env` sets `GH_TOKEN` or `GITHUB_TOKEN`, since Sandcastle passes every key in that file into the sandbox. - **Fixes for what Articles' review found:** - The host runs git with `-c core.hooksPath=/dev/null`. `core.hooksPath` is `.github/hooks`, a path inside the worktree the agents edit, so running its pre-push hook on the host would run their code outside the sandbox. CI runs the full suite, the Docker-backed tests included. - Each branch merges a freshly fetched `origin/main` in the sandbox before the check. On a conflict the merge is aborted and the issue gets a comment. - Open PRs from forks (`isCrossRepository`) neither hold an issue back nor pass for its PR. - Repeated planner picks are dropped (`lib/plan.mts`). - A PR title like `Add search .` becomes `feat: Add search`, with no trailing space. - After the reviewer, the host compares HEAD with the commit that passed the check, not the commits the run reported, so an amend or reset is caught. If HEAD moved, the check runs again. The host pushes that exact commit by its id, without force. - **Branches:** existing local branches are reused alongside origin's. When origin has the branch, the local branch is created from it, or fast-forwarded to it if it's behind. - **Host hardening (from this PR's review):** - Sandcastle mounts the clone's `.git` into each sandbox, writable, so an agent could write commands into `.git/config` for the host's git to run. `main.mts` records `git config --local --list` before any sandbox starts, and the host refuses to run git or `gh` once it has changed (`lib/shell.mts`). `gh` takes `--repo` from the name read at the start, not from the remotes. - Issue comments and PR bodies have the sandbox's secrets removed: the values `.sandcastle/.env` gives it, and anything shaped like a Claude or GitHub token. - "fixes #12"-style references in the reviewer's summary are rewritten as "fixes issue 12", so only the host's `Fixes #n` line closes an issue. - A branch that changes the files deciding what `check.sh` runs or skips (`check.sh`, `needs-docker.sh`, `discover_tests.py`, `package.json`, or a `RequiresDocker` flag) is named in a WARNING at the top of its PR. - The planner gets the in-review issues as open blockers, since nothing reaches main between rounds, and an issue that stopped isn't rebuilt later in the same run. - **`.sandcastle/check.sh` (from #231) is now enforced.** The host runs it in the sandbox through `lib/check.mts`, and a passing check over uncommitted changes still fails. `check.sh`, `CODING_STANDARDS.md` and `CLAUDE.md` no longer call it advisory, and they say CI runs the Docker-backed suites. The implement and review prompts keep #231's Docker guidance. - **`test:sandcastle`** runs `tsc --noEmit -p .sandcastle` before the tests (new `.sandcastle/tsconfig.json`, with `typescript` and `@types/node` as dev dependencies). `engines` requires Node 22.18 or later, which strips the `.mts` types. The tests now import `@ai-hero/sandcastle` and `zod`, so `.github/ci/sandcastle-tests.sh` runs `pnpm install --frozen-lockfile` first. It uses pnpm from the PATH, or corepack's when there isn't one. ### Findings checked but not changed here - **`branches.mts:45`, bug issues on `hotfix/`:** already fixed by #232. - **`test:sandcastle` not run in CI:** #231 runs it from the gate and from CI's Build Solution job, through `.github/ci/sandcastle-tests.sh`. - **Shell blocks from issue titles:** in `@ai-hero/sandcastle` 0.12.0, `substitutePromptArgs` marks the template's own `` !`…` `` blocks with `\x01` before it fills in `{{KEY}}` arguments and strips that marker from argument values. `preprocessPrompt` runs only marked blocks, so a block written in an issue title or body isn't run. A new test in `prompts.test.mts` checks that only host-made values (`BRANCH`, `BASE_BRANCH`, `TASK_ID`) appear inside the prompts' shell blocks. ## Verification - `bash .github/ci/sandcastle-tests.sh ""`: the type check is clean and 89 of 89 tests pass, including #231's. New tests cover publishing earlier finished work, refusing unfinished work, merge conflicts, a reviewer that amends or resets, fork PRs, repeated picks, the trailing space in titles, the git config guard (against a real temp repo), redaction, closing keywords and the check-file warning. - The pre-push gate passed (lints, Release build, every test project). - No live Sandcastle run: one needs labelled issues and opens real PRs. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: T <t@e.com>
mpaulosky
added a commit
that referenced
this pull request
Oct 9, 2026
…#242) ## Why #236 replaced Sandcastle's local merger with one draft PR per issue. PR Auto-Merge merged it after its review cap, and Claude Review's pass over its final head then opened six threads. All six hold up: - **Agent-edited hooks could still run on the host.** #236 turned hooks off only for the host's own git. Sandcastle runs `git worktree add` on the host too. That runs `post-checkout` from the new worktree, which is the branch's copy of `.github/hooks`, and a branch can be one the agents wrote in an earlier run. - **Detected config tampering didn't stop the run.** A `GitConfigChangedError` was logged as one failed issue. `sandbox.close()` still ran Sandcastle's git under the tampered config, and the run could end with "All done." - **Pushed commits were never checked for the sandbox's secrets.** The Claude token or API key is in the sandbox, and an agent could commit it in a log, fixture or snapshot. - **The PR warning missed most ways to skip a test project.** Only a `RequiresDocker` change was flagged. A Docker-backed package, `IsTestProject=false`, a `ProjectReference`, or a deleted test project slipped through. The comparison also used `origin/main`, a ref the agents can move. - **Issue titles could close other issues.** A title like "Fix #12 regression" went unchanged into the PR title (the squash subject) and the body. - **Stopped issues vanished from the planner.** An issue that stopped earlier in a run was in neither of the planner's lists, so the issues it blocks looked unblocked. ## What changed - **`lib/shell.mts`, `main.mts`:** `protectHostGit()` runs first. It adds `core.hooksPath=/dev/null` and `core.fsmonitor=false` through `GIT_CONFIG_COUNT`/`GIT_CONFIG_KEY_n`/`GIT_CONFIG_VALUE_n`, after any entries already there. Every git process on the host inherits these, Sandcastle's included. They don't reach the sandbox: Sandcastle passes it only what `.sandcastle/.env` names. - **`lib/build.mts`, `main.mts`:** if a pipeline hits `GitConfigChangedError`, it leaves its sandbox open and rethrows. `main.mts` rethrows the first such error after the round, so the run exits non-zero with the warning. - **`lib/scan.mts`, `lib/build.mts`, `lib/sandbox-env.mts`:** before the push, the host scans what it would publish, from main's commit to the checked commit. That is every commit message and every added line, from `git log -p --cc -U0`, so merge commits are read too. Context and removed lines are left out, so main's fake test tokens don't stop unrelated branches. The scan looks for the values `.sandcastle/.env` gives the sandbox and for Claude and GitHub token shapes. A match stops the issue as `secret-in-commits`, with a comment that doesn't quote it. - **`lib/check.mts`:** the warning now covers MSBuild lines matching `RequiresDocker|IsTestProject|Testcontainers|Aspire.Hosting.Testing|Playwright|ProjectReference`, and files deleted or renamed away under `tests/`. - **`lib/branches.mts`, `lib/build.mts`:** `fetchMain()` returns main's commit as `git ls-remote origin` reports it. The merge, `commitsAhead`, the warning and the secret scan all compare with that commit id, not with `refs/remotes/origin/main`. - **`lib/publish.mts`:** `withoutClosingKeywords` now also rewrites the issue title, in the PR title and body, and full `github.com/.../issues/n` and `/pull/n` URLs. - **`lib/prompts.mts`, `plan-prompt.md`:** the planner's second list is now the held-back issues (`{{HELD_BACK_JSON}}`), both in review and stopped earlier in the run, and they count as blockers. ## Verification - `pnpm run test:sandcastle`: the type check is clean and 99 of 99 tests pass. The new tests run against real temp repositories: a `git worktree add` with `protectHostGit` doesn't run a `post-checkout` hook, and the same command without it does. `checkFileChanges` flags a Testcontainers reference, `IsTestProject=false`, a deleted test project, a renamed test file and `check.sh`, but not an ordinary `src/` package change. `publishedText` sees a secret added in a merge resolution, but not a fixture token in context. Other new tests cover the secret stop, the untouched sandbox on config tampering, and closing references in titles and URLs. - The pre-push gate passed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: T <t@e.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.
Bumps Radzen.Blazor from 5.3.5 to 5.5.5.
Release notes
Sourced from Radzen.Blazor's releases.
... (truncated)
Commits
9101614Version updated7312b28GoogleMap UpdateMap() fixedbf7d99cFixed Carousel Auto=true does not repeat cyclefb0d588Fixed DataGrid will not show EmptyTemplate when AllowVirtualization=true8e7bd63Version updated8bebd19Fixed "The ParameterView instance can no longer be read because it has expire...2429b2cMissing summary added7698207Fixed DataGrid Object must implement IConvertible with DateOnly filtering for...36f39b5Add callback for Open and Close to RadzenDropDown (#1771)bb675eeFixed Carousel out of range exception when navigating to out of range indexDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)