Delivery open-issues-batch - #444
Merged
Merged
Conversation
Release train: llama.cpp tool-schema fix + memory /init self-heal + v1.0.31 series notes
…on context Root cause analysis for the intermittent empty /dag pane under concurrent workflows: the mount-time dag.summary request had no timeout, so an RPC stall pinned the route on its first attempt forever (spinner/empty pane), and the no-sessionID branch silently rendered the loaded-empty state as if no workflows existed. Conservative fix, inspector-local only: - wrap the mount fetch in a race timeout (dag_fetch_timeout_ms, default 15s) - retry once after 400ms before surfacing "Unable to load workflows" - render explicit guidance when the route carries no sessionID instead of the misleading "No workflows for this session" Both behaviors are pinned by new tests at the existing harness seam (retry spy reaches >=2 calls; guidance copy renders with zero network calls).
Extends the issue-#389 todo reminder feature with the pre-tool-call seam it originally proposed and deliberately deferred. The per-step reminder covers tool-free steps; this adds mid-turn coverage so long multi-tool turns keep seeing the uncompleted list between calls. - TodoReminders.preToolCall: returns the rendered reminder before a non-todowrite tool call, at most once per assistant turn (turn-scoped marker keyed by assistant messageID), never for todowrite itself - tools.ts: both PreToolUse sites (native tools + MCP tools) prepend the reminder to additionalContexts ahead of any hook contexts Turn-scoped dedup answers #389's objection to this seam (N parallel calls -> N duplicate reminders); pure-reasoning steps stay covered by the existing per-step injection, so the two seams complement instead of compete. Tests: first-call injects, same-turn repeat skips, new turn re-arms, todowrite never injects nor consumes the turn shot, settled list stays quiet.
Dependency upgrades (Dependabot): dompurify 3.4.13 across ui/session-ui and root catalog, astro 7.1.0 for web, nitro 3.0.260429-beta across the four console/stats/enterprise apps, @hey-api/openapi-ts 0.97.3 for sdk/js with SDK regeneration. CodeQL source fixes: user-attachments URL prefix validation before fetch (SSRF), OAuth error-page HTML escaping in snowflake-cortex, rejection-sampling PKCE verifiers (xai/codex/snowflake-cortex modulo bias), bounded pattern input in provider-error and linear data-URL parsing in acp/tool (ReDoS), and least-privilege permissions on ci-typecheck. Fallout adaptation: regenerated client types made response optional and one oauth callback param required — httpapi-sdk test, terminal, server-session, and dialog-connect-provider updated accordingly; web/.wrangler deploy artifact now ignored. Acceptance tests pin data-URL parsing and context-overflow classification.
Blocks previously could set worker_type but not worker_config, so authors
needing a per-block timeout had to inline low-level nodes — and models kept
reaching for the field anyway (fail-closed rejection with no actionable
hint). Accept it explicitly:
- WorkflowBlock gains optional worker_config { timeout_ms }; compilation
threads it through every expanded node, overriding node_defaults
- FIELD_DRIFT_HINTS covers bare timeout/timeouts/timeout_ms; the drift-hint
field list now includes worker_config
- draft-config description and guide(blocks) document the capability
- strict unknown-key parsing stays fail-closed
Tests: block-level value lands on compiled nodes, node_defaults fallback,
block-over-defaults precedence, unknown keys still rejected with hints.The dev-lineage workflow installs specgit locally (npm install --no-save), which npm resolves against this repo's root package.json and fails with EUNSUPPORTEDPROTOCOL on the Bun catalog: protocol. This PR targets main, so run the main-line global install instead.
The dev-lineage policy lists canonical ids (unit-tests/e2e-tests) that do not exist as check-run names on the main-line CI matrix, so the acceptance waiter can never observe them. This PR targets main; require the main-line check names.
A delivery-freshness session ran `pnpm exec vitest … | tail -15`: the pipe buffers everything, pnpm/vitest cold start stayed silent past 15s, the operator interrupted twice, and the abort label "User aborted the command" sent the postmortem chasing a phantom manual cancel. - BLOCK_CONTRACTS gains a shared SHELL_DISCIPLINE sentence appended to the four command-heavy kinds (explore/debug/coding/verify) so both curated templates and ad-hoc drafts inherit it from one source of truth - shell.ts and session/prompt.ts now share one exported SHELL_ABORT_NOTE; its wording names the two possible interrupt origins instead of blaming the user, and repeats the bounding advice at the moment it matters - test assertions updated to the shared wording
snapshot-tool-race failed deterministically with the pre-tool-call reminder: minimal server fixtures do not provide Todo.Service, so the unconditional yield* died and took the whole tool execution down with it — the bash command never ran. The reminder is decoration on top of execution; it now degrades to no-reminder on any non-interrupt failure while interrupts still propagate. Found by the existing snapshot race gate; no new test seam needed.
fix: worker config on workflow blocks
…rness alignment) # Conflicts: # .specgit.yaml
…ness alignment) # Conflicts: # .specgit.yaml
…ness alignment) # Conflicts: # .specgit.yaml
…rness alignment) # Conflicts: # .specgit.yaml
fix: open security alerts
# Conflicts: # .specgit.yaml
# Conflicts: # .specgit.yaml
feat: surface todo state before non-todo tool calls
# Conflicts: # .specgit.yaml
feat: shell discipline in dag block contracts
# Conflicts: # .specgit.yaml
fix: dag inspector shows empty list
docs: add v1.0.32 release series notes
docs: conform v1.0.32 notes headings to template
docs: fix v1.0.32 notes block separators and ASCII-only body
This was referenced Aug 25, 2026
fix(security): github handler exfiltrates app token via markdown image SSRF (code-scanning #65)
#442
Closed
Closed
LeXwDeX
marked this pull request as ready for review
August 25, 2026 01:01
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Closes#434
Closes#442
Closes#443
Closes#440
Closes#436
Why
Batch delivery of all remaining open issues into the dev integration layer. This PR also carries main's last 41 commits into dev (dev was behind after the five main-direct merges), which is itself the #434 fix.
What changed
specgit-accept.ymlstill used the OLD template (npm install --no-saveat repo root, which dies on buncatalog:protocol). main already carries the new global-install template; this merge syncs it into dev. Verified:git diff origin/dev origin/main -- .github/workflows/specgit-accept.yml.github.handler.tsattachment download now fetches the validatedURLobject instead of the raw markdown string; guard extracted toisAllowedAttachmentUrlingithub.shared.tswith unit tests (host/scheme/path/null).escapeHtmlinutil/html.tsnow delegates to theescape-htmlpackage (CodeQL-modeled sanitizer, closes js/reflected-xss alerts feat(hooks): implement async hook execution + asyncRewake delivery #60/fix(goal): self-clean loop fibers + guard resume + e2e regression #61/feat(hooks): async execution + stdout injection + workspace-trust + global hot-reload #62 at the next default-branch scan) — identical output, existing html.test.ts unchanged and green. Applies to all four OAuth error pages (xai, codex, snowflake, mcp/oauth-callback).Evidence
bun run test:dag-core— 52 pass, gate passed.bun test test/dag/— 622 pass / 0 fail across 53 files (includes 2 new nudge tests in dag-schema-prompt-contract.test.ts).bun testtargeted: github-attachment-guard (new), github-action, util/html, http-recorder record-replay 33/33.bun typecheck(packages/opencode) clean; root turbo typecheck all-cached pass on push.bun run lint— 4811 warnings ≤ 4850 ratchet.Checklist
specgit finishexits 0.