Commit Graph

5155 Commits

Author SHA1 Message Date
3b4aee1f44 sweep(internal#219 §1): PR#379 2026-05-11 07:24:01 +00:00
da1d067f3a Merge branch 'main' into sweep/internal-219-cat-B-delete-github-only 2026-05-11 07:23:42 +00:00
e92a71d227 sweep(internal#219 §1): PR#378 2026-05-11 07:23:32 +00:00
2c5a82d110 Merge branch 'main' into sweep/internal-219-cat-A-delete-mirrored 2026-05-11 07:23:15 +00:00
eac5766370 sweep(internal#219 §1): PR#387 2026-05-11 07:21:48 +00:00
03b27adeab sweep(internal#219 §1): PR#386 2026-05-11 07:21:12 +00:00
9128ff545e sweep(internal#219 §1): PR#360 2026-05-11 07:20:25 +00:00
a210b5af7b Merge branch 'main' into sweep/internal-219-cat-C3-port-deploy-janitors 2026-05-11 07:20:12 +00:00
a9d164f0b4 Merge branch 'main' into sweep/internal-219-cat-C2-port-e2e 2026-05-11 07:19:37 +00:00
620a3d4b6f Merge branch 'main' into sweep/internal-219-cat-B-delete-github-only 2026-05-11 07:18:20 +00:00
59305ddb45 Merge branch 'main' into sweep/internal-219-cat-A-delete-mirrored 2026-05-11 07:17:54 +00:00
09d4a9f4aa Merge branch 'main' into fix/publish-runtime-cascade-sha-capture 2026-05-11 07:17:25 +00:00
3b1b7f45b3 feat(ci): port molecule-core .github/workflows/ci.yml → .gitea/workflows/ci.yml (RFC #219 §1) (#372) 2026-05-11 07:16:19 +00:00
24fc943890 Merge branch 'main' into feat/internal-219-phase-3-port-ci-yml 2026-05-11 07:15:20 +00:00
20cc77ac80 revert(ci): #391 Install jq step is broken (#402) 2026-05-11 07:14:15 +00:00
bc9cf599da Merge pull request 'fix(handlers): add rows.Err() checks after rows.Next() loops' (#412) from fix/delegations-rows-err-check into main 2026-05-11 06:54:27 +00:00
150bf84b0b ci: re-trigger CI for fresh PR
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 06:42:24 +00:00
8d4a9a184f ci: re-trigger after runner stall
Force a fresh sop-tier-check run to check if runners have recovered
from infra#241 OOM cascade.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 06:24:01 +00:00
aa49dbc728 fix(handlers): add rows.Err() checks after rows.Next() loops
Add deferred error checks following rows.Next() iteration in:
- ListDelegations (delegation.go): log on error, continue serving results
- org import reconcile orphan query (org.go): log + append to reconcileErrs

Fixes the rows.Err() gap identified in the delegated rows.Err() check PR
(#302, closed; replaced by this PR).  Two additional files already had
the check (activity.go, memories.go) — pattern applied consistently here.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 06:15:42 +00:00
f4e42c23b2 Revert "ci: install jq before sop-tier-check script runs"
This reverts commit 1f9042688e.
2026-05-10 23:00:39 -07:00
ab32e47953 Merge pull request 'fix(a2a_tools): add comment + test coverage for string-form error in delegate_task' (#350) from fix/a2a-tools-duplicate-dead-code into main 2026-05-11 05:54:38 +00:00
1f52e43d87 Merge branch 'main' into sweep/internal-219-cat-B-delete-github-only 2026-05-11 05:52:56 +00:00
93b7d9a88a fix(a2a_tools): add comment + test coverage for string-form error handling in delegate_task
Staging branch bea89ce4 introduced duplicate dead code after a `return`
in the delegate_task error-handling block — the first occurrence was the
correct fix (adding isinstance(err, str)), but the second occurrence (now
unreachable) made the block fragile. Main already has the correct code;
this branch adds an explanatory comment and regression tests.

The non-tool delegate_task() in a2a_tools.py uses httpx.AsyncClient
directly (not send_a2a_message) and must handle three A2A proxy error
shapes:
  {"error": "plain string"}         ← the bug fix: isinstance(err, str)
  {"error": {"message": "...", ...}} ← pre-existing path
  {"error": {"nested": "object"}}    ← falls through to str(err)

Adds TestDelegateTaskDirect:
  test_string_form_error_returns_error_message  — regression for AttributeError
  test_dict_form_error_returns_error_message    — pre-existing path still works
  test_success_returns_result_text               — happy path still works

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 05:51:48 +00:00
44b40a442b Merge pull request 'ci: install jq before sop-tier-check script runs' (#391) from infra/jq-install-main into main 2026-05-11 05:47:42 +00:00
298c237a5a Merge branch 'main' into sweep/internal-219-cat-B-delete-github-only 2026-05-11 05:40:27 +00:00
1f9042688e ci: install jq before sop-tier-check script runs
Gitea Actions runners (ubuntu-latest) do not bundle jq.
The sop-tier-check script uses jq for all JSON API parsing.
Install jq before the script runs so sop-tier-check can pass.

Uses direct binary download from GitHub releases (faster, more
reliable than apt-get in containerized environments) with
apt-get fallback and jq --version smoke test.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 05:26:03 +00:00
4542ab0704 Merge pull request '[core-be-agent] fix(security#321): CWE-22 path traversal guards in loadWorkspaceEnv (main-targeted)' (#369) from fix/cwe22-loadWorkspaceEnv-main into main 2026-05-11 05:12:46 +00:00
dev-lead
e434a3c466 ci(C-2): fix YAML parser-rejection in canary-verify.yml
Mechanical porter inserted a duplicate `env:` block in
.gitea/workflows/canary-verify.yml — the file already had an
`env: { IMAGE_NAME, TENANT_IMAGE_NAME, CP_URL }` block so the
second `env: { GITHUB_SERVER_URL: ... }` block triggered Gitea's
parser error "yaml: mapping key 'env' already defined".

Merged GITHUB_SERVER_URL into the existing env block.

Verified via fresh `docker logs molecule-gitea-1 --since 5m` after
push — no new parser-rejection warnings for canary-verify.yml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 21:30:29 -07:00
dev-lead
94ae3bc082 ci(C-3): fix YAML parser-rejection in publish-canvas-image.yml
Mechanical porter inserted a duplicate `env:` block in
.gitea/workflows/publish-canvas-image.yml — the file already had
`env: { IMAGE_NAME: ghcr.io/molecule-ai/canvas }` so the second
`env: { GITHUB_SERVER_URL: ... }` block triggered Gitea's parser
error "yaml: mapping key 'env' already defined".

Merged the two blocks into one. Also clarified the dropped
workflow_dispatch comment that the porter left dangling above
`permissions:`.

Verified via fresh `docker logs molecule-gitea-1 --since 5m` after
push — no new parser-rejection warnings for publish-canvas-image.yml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 21:29:33 -07:00
dev-lead
7351d7766f ci: port 7 deploy/publish/janitors to .gitea/workflows/ (RFC internal#219 §1, Category C-3)
Sweep companion to PR#372 (ci.yml), PR#378 (Cat A), PR#379 (Cat B),
PR#383 (Cat C-1), PR#386 (Cat C-2). Final port batch.

Ports 7 deploy/publish/janitor workflows from .github/workflows/ to
.gitea/workflows/. Each port applies the four-surface audit pattern;
every job has `continue-on-error: true` (RFC §1 contract).

Files ported:

- publish-canvas-image.yml — canvas Docker image build/push.
  IMPORTANT OPEN QUESTION (flagged in file header): this workflow
  pushes to ghcr.io. GHCR was retired during the 2026-05-06 Gitea
  migration in favor of ECR. The pushed image may not be consumable
  post-migration. Review needs to decide: retarget to ECR
  (153263036946.dkr.ecr.us-east-2.amazonaws.com/molecule-ai/canvas)
  or retire entirely and route canvas deploys via operator-host.

- redeploy-tenants-on-main.yml — prod tenant SSM redeploy on new
  workspace-server image. workflow_run trigger retained (same
  Gitea support caveat as canary-verify.yml — flagged in header).
  Simplified the job `if:` condition by dropping the
  `workflow_dispatch` branch.

- redeploy-tenants-on-staging.yml — staging mirror of above. Same
  workflow_run caveat + same `if:` simplification.

- sweep-aws-secrets.yml — hourly AWS Secrets Manager tenant-secret
  janitor. Dropped workflow_dispatch.inputs (dry_run/max_delete_pct/
  grace_hours); cron triggers run with the script defaults instead.
  if-step gates conditional on github.event_name=='workflow_dispatch'
  are dead-code post-port but harmless.

- sweep-cf-orphans.yml — hourly CF DNS janitor. Same shape.

- sweep-cf-tunnels.yml — hourly CF Tunnels janitor. Same shape.

- sweep-stale-e2e-orgs.yml — every-15-min staging tenant cleanup.
  Same shape.

Open questions for review:

1. workflow_run on redeploy-tenants-on-* — same caveat as
   canary-verify.yml (Cat C-2). If Gitea ignores the event, the
   follow-up triage PR replaces with push-with-paths-filter on
   .gitea/workflows/publish-workspace-server-image.yml.

2. publish-canvas-image GHCR target — decide retarget-to-ECR vs
   retire-entirely with reviewer.

3. workflow_dispatch.inputs replacements — the four janitor sweeps
   lost their operator-facing dry_run/cap-override knobs. If a
   manual override is needed today, edit the cron envs in the file
   directly. Follow-up could add a "manual override commit" pattern
   that the cron reads from a checked-in JSON.

DO NOT MERGE without orchestrator-dispatched Five-Axis review +
@hongmingwang chat-go.

Cross-links:
- RFC: molecule-ai/internal#219
- Companions: PR#372, PR#378, PR#379, PR#383, PR#386

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 21:26:21 -07:00
dev-lead
58f80f7e42 ci: port 10 E2E workflows to .gitea/workflows/ (RFC internal#219 §1, Category C-2)
Sweep companion to PR#372 (ci.yml port), PR#378 (Cat A), PR#379 (Cat B),
PR#383 (Cat C-1 gates/lints).

Ports 10 E2E-shaped workflow files from .github/workflows/ to
.gitea/workflows/. Each port applies the four-surface audit pattern.

Per RFC §1 contract: every job has `continue-on-error: true` so
surfaced defects do not block PRs. Follow-up PR flips to false after
triage.

Files ported:

- canary-staging.yml — every-30-min canary smoke against staging.
  Two `actions/github-script@v9` blocks (open-issue-on-failure +
  auto-close-on-success) replaced with curl calls to the Gitea REST
  API (/api/v1/repos/.../issues|comments). Same single-issue +
  comment-on-repeat semantics.

- canary-verify.yml — post-publish image promote-to-:latest. Still
  uses workflow_run trigger; Gitea 1.22.6's support for that event
  is partial — flagged in the file header. If review confirms it
  doesn't fire, follow-up PR replaces with push-with-paths-filter
  on .gitea/workflows/publish-workspace-server-image.yml. Removed
  the `|| github.event_name == 'workflow_dispatch'` branch (this
  port drops workflow_dispatch).

- continuous-synth-e2e.yml — synthetic E2E every 10 min cron.
  Dropped workflow_dispatch.inputs. Real-cron paths intact.

- e2e-api.yml — API smoke. dorny/paths-filter@v4 replaced with
  inline `git diff` per PR#372 pattern; detect-changes job +
  per-step if-gate shape preserved for branch-protection check-name
  parity.

- e2e-staging-canvas.yml — Playwright canvas E2E. dorny/paths-filter
  replaced with inline git diff. upload-artifact@v3.2.2 kept (Gitea
  1.22.x compatible per PR#372 notes; v4+ is not).

- e2e-staging-external.yml — workspace-status enum regression
  coverage. Dropped workflow_dispatch.inputs + cron-trigger inputs.

- e2e-staging-saas.yml — full lifecycle E2E. Dropped
  workflow_dispatch.inputs. Heaviest port; cleaned via mechanical
  porter then manual review.

- e2e-staging-sanity.yml — weekly intentional-failure teardown
  sanity. github-script issue block replaced with Gitea API curl.

- handlers-postgres-integration.yml — Postgres integration tests.
  dorny/paths-filter replaced with inline git diff. Dropped
  merge_group + workflow_dispatch.

- harness-replays.yml — tests/harness boot suite. Standard port.
  Dropped merge_group + workflow_dispatch.

Open questions for review:

1. workflow_run trigger on canary-verify.yml — unconfirmed Gitea
   1.22.6 support. continue-on-error+canary-verify-dead doesn't
   block anything either way; review can validate.

2. github.event.before fallback in detect-changes paths — on Gitea
   the event.before field is populated for push events but its
   exact shape on initial pushes / forced updates differs from
   GitHub. The shallow-fetch + cat-file recovery branch handles
   the missing-base case correctly.

3. MOLECULE_STAGING_* secrets reused — verified at
   /etc/molecule-bootstrap/all-credentials.env that the names are
   defined. Tier-low because failure-mode is "smoke skip" + log
   warning, not silent green.

DO NOT MERGE without orchestrator-dispatched Five-Axis review +
@hongmingwang chat-go.

Cross-links:
- RFC: molecule-ai/internal#219
- Companions: PR#372, PR#378, PR#379, PR#383

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 21:23:30 -07:00
dev-lead
f0745619d2 ci: retire 6 .github/workflows GitHub-only files + add migration runbook (RFC internal#219 §1, Category B)
Sweep companion to PR#372 + PR#378 (Cat A). These six .github/workflows
files depend on GitHub-specific surface that Gitea does not provide:

- auto-tag-runtime.yml — superseded by .gitea/publish-runtime-autobump.yml
  for patch bumps. Release:minor/major label-driven bumps are lost;
  follow-up issue suggested if anyone uses them.

- branch-protection-drift.yml — drift_check.sh + apply.sh target
  Molecule-AI/molecule-core via `gh api` against GitHub's
  branch-protection schema. Gitea's schema differs; rebuilding is
  out of scope. Follow-up issue needed.

- check-merge-group-trigger.yml — file's own header documents this is
  a structural no-op on Gitea (no merge queue, no `merge_group:`
  event type, no gh-readonly-queue refs).

- codeql.yml — file's own header documents CodeQL Action incompatibility
  (github/codeql-action hits api.github.com bundle endpoints not
  implemented by Gitea). Per Hongming decision 2026-05-07 task #156
  CodeQL is non-blocking until Gitea-compatible SAST lands.

- pr-guards.yml — file's own header documents that Gitea has no
  `gh pr merge --auto` primitive; guard is a no-op. Branch protection
  on main doesn't require the pr-guards check name.

- promote-latest.yml — uses imjasonh/setup-crane against ghcr.io,
  which was retired during the 2026-05-06 migration in favor of ECR
  (per canary-verify.yml header notes). Workflow has nothing left to
  retag.

Also adds runbooks/gitea-actions-migration-checklist.md documenting:
- Four-surface audit pattern (feedback_gitea_actions_migration_audit_pattern)
- Category A/B/C/D file lists with rationale
- Verification steps after all sweep PRs land
- Cross-link to follow-up issues (label-driven bumps,
  Gitea-compatible drift detection, ECR-based promote)

Branch protection check: required status checks on main are only
`Secret scan / Scan diff for credential-shaped strings (pull_request)`
and `sop-tier-check / tier-check (pull_request)`. No deleted file's
job name appears in required_status_checks.

DO NOT MERGE without orchestrator-dispatched Five-Axis review +
@hongmingwang chat-go.

Cross-links:
- RFC: molecule-ai/internal#219
- Companion: PR#372 (ci.yml port), PR#378 (Cat A mirrored deletions)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 21:12:29 -07:00
dev-lead
a0da162aeb ci: delete .github/workflows/ copies that are mirrored in .gitea/ (RFC internal#219 §1, Category A)
Sweep companion to PR#372 (ci.yml port). These two .github/workflows/
files have working .gitea/workflows/ twins active on Gitea Actions:

- publish-runtime.yml — .gitea/ version is the canonical PyPI publisher
  (ported 2026-05-10 in issue #206). The .github/ version explicitly
  marks itself DEPRECATED in its own header comment and is kept "for
  reference only". The .gitea/ port drops OIDC trusted publisher,
  workflow_dispatch.inputs, merge_group, and the GitHub-only
  pypa/gh-action-pypi-publish action.

- secret-scan.yml — .gitea/ version is the active branch-protection
  gate (matches "Secret scan / Scan diff for credential-shaped strings
  (pull_request)" required check name). The .github/ version retains a
  workflow_call entry point for reusable cross-repo invocation, but per
  saved memory feedback_gitea_cross_repo_uses_blocked cross-repo `uses:`
  is blocked on Gitea 1.22.6 anyway (DEFAULT_ACTIONS_URL=self), so the
  reusable shape no longer has callers.

Both files are silently dead — verified by reading the molecule-core
Gitea Actions page (only the 6 .gitea/ workflows appear in the workflow
filter sidebar; none of the .github/ files have ever produced a run).

Per RFC §1: this PR is a hygiene cleanup. Removing the dead .github/
copies eliminates the ongoing confusion of two workflow files claiming
the same job name and converges molecule-core toward a single source
of truth under .gitea/. Branch protection on main was checked and does
NOT reference any removed file — only the .gitea/ secret-scan and
sop-tier-check check names are required.

DO NOT MERGE without orchestrator-dispatched Five-Axis review +
@hongmingwang chat-go (per feedback_pr_review_via_other_agents).

Cross-links:
- RFC: molecule-ai/internal#219
- Companion: PR#372 (ci.yml port — Category C-style)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 21:10:35 -07:00
322beb506e Merge pull request #369 from fix/cwe22-loadWorkspaceEnv-main 2026-05-11 03:59:08 +00:00
f82033a3ca [ci force] force fresh runner 2026-05-11 03:52:40 +00:00
d166d77abc ci: port .github/workflows/ci.yml to .gitea/workflows/ci.yml (RFC internal#219 §1)
Phase 3 of RFC internal#219 (CI/CD hard-gate hardening). molecule-core's
branch protection on main currently requires only Secret scan +
sop-tier-check/tier-check — there is no required gate that asserts the
actual Go code builds. The .github/workflows/ci.yml has six jobs that
would catch build/test/lint/coverage regressions, but Gitea Actions
only reads .gitea/workflows/. So today every Go regression on
molecule-core merges through (recurrence of
feedback_phantom_required_check_after_gitea_migration).

This PR ports the workflow to .gitea/workflows/ci.yml. Per RFC §1, the
port lands with `continue-on-error: true` on every job so we surface
broken jobs without blocking PRs while the team triages anything that
falls out of "first contact with reality". A follow-up PR (Phase 4)
will flip continue-on-error to false, add the `ci/all-required`
aggregator sentinel (mirroring molecule-controlplane#89's pattern),
and PATCH branch protection to require it.

Four-surface migration audit performed
(feedback_gitea_actions_migration_audit_pattern):

1. YAML: dropped merge_group trigger (no Gitea merge queue); no
   workflow_dispatch.inputs to worry about
   (feedback_gitea_workflow_dispatch_inputs_unsupported); no
   environment: blocks; runs-on: ubuntu-latest preserved. Set
   workflow-level env.GITHUB_SERVER_URL as belt-and-suspenders
   against runner-default regression
   (feedback_act_runner_github_server_url +
   feedback_act_runner_needs_config_file_env).

2. Cache + artifact: actions/upload-artifact pinned at v3.2.2
   (original already had this — Gitea act_runner v0.6 doesn't speak
   the v4 artifact protocol). setup-python cache: pip preserved.

3. Token: workflow uses no custom dispatch tokens; auto-injected
   GITHUB_TOKEN (Gitea-scoped runner token) handles checkout against
   this same repo.

4. Docs: no github.com docs/scripts references to swap. The
   canvas-deploy-reminder step references ghcr.io/.../canvas — that's
   external documentation prose, not a build dependency, and is a
   separate ghcr→ECR sweep if in scope.

actions/* (checkout, setup-go, setup-node, setup-python,
upload-artifact) are verified mirrored on this Gitea instance
(git.moleculesai.app/actions/*); app.ini has
DEFAULT_ACTIONS_URL = self so the @SHA refs resolve locally.

Scope guard (per RFC):
- This PR ports ONLY ci.yml. The other 34 workflows in
  .github/workflows/ get swept in a follow-up per the
  runbooks/gitea-actions-migration-checklist.md.
- This PR does NOT add the all-required aggregator sentinel (Phase 4).
- This PR does NOT modify branch protection (Phase 4).
- This PR does NOT delete .github/workflows/ci.yml (RFC §1 leaves it
  in place initially).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 20:48:38 -07:00
fd40700c43 [ci skip false-positive] force re-run CI (runner stuck at infra#241) 2026-05-11 03:48:31 +00:00
706df19b43 [core-be-agent] fix(security#321): CWE-22 path traversal guards in loadWorkspaceEnv
Two vulnerable call sites confirmed on origin/main:

1. org_helpers.go:loadWorkspaceEnv (line 101): filesDir from untrusted org YAML
   joined directly with orgBaseDir without traversal guard. A malicious filesDir
   like "../../../etc" escapes the org root and reads arbitrary files.

2. org_import.go:createWorkspaceTree (line 494): same pattern directly in the
   env-loading block — not covered by staging-targeted PR #345.

Fix (both locations): call resolveInsideRoot(orgBaseDir, filesDir) before
filepath.Join. On traversal detection, org_helpers.go returns an empty map
(caller contract); org_import.go silently skips the workspace .env override
(matches existing template-resolution pattern in the same function).

Tests: org_helpers_test.go — 3 cases covering traversal rejection,
workspace-override happy path, and empty filesDir edge case.

Closes: molecule-core#362, molecule-core#321

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 03:34:55 +00:00
84ffa2da6c fix(ci): cascade wait-step SHA capture leaked pip stdout (4th defect)
Run 5196 (2026-05-11 02:46Z, first-ever successful publish) succeeded
the publish job but failed the cascade job at the wait-for-PyPI-
propagation step:

  ::error::PyPI propagated 0.1.130 but wheel content SHA256 mismatch.
  ::error::Expected: 536b123816f3c7fb54690b80be482b28cabd1874690e9e93d8586af3864c7fba
  ::error::Got:      Collecting molecule-ai-workspace-runtime==0.1.130
  ::error::Fastly may be serving stale content. Refusing to fan out cascade.

The 'Got:' is pip's own stdout, not a SHA. Root cause:

  HASH=$(python -m pip download ... 2>/dev/null && sha256sum ... | awk ...)

The shell pipeline captures BOTH commands' stdout into $HASH. `2>/dev/null`
only silences stderr, not stdout. pip download writes 'Collecting ...' to
stdout by default, so it leaks into HASH ahead of sha256sum's output.

Fix: split into two steps, redirect pip stdout to /dev/null explicitly,
capture only sha256sum's output into HASH.

Impact: cascade-to-8-template-repos failed, but PyPI publish itself
succeeded. Users (workspace-template-* maintainers) can pin manually
via 'docker build --build-arg RUNTIME_VERSION=X.Y.Z' until cascade is
healed. hongming-pc is doing exactly this for the plugins_registry rollout.

4th and likely last workflow defect after #353, #355, #357.

Refs: #351, #353, #355, #357, #348 Q3
2026-05-10 19:51:18 -07:00
108b9a54d9 Merge pull request '[core-be-agent] fix(#354): wire delegation-results consumer into a2a executor' (#358) from fix/354-a2a-delegation-auto-resume into main 2026-05-11 02:50:41 +00:00
173a642f9e ci: re-trigger after tier downgrade
Co-Authored-By: infra-sre
2026-05-11 02:49:32 +00:00
177c4ef18c ci: re-trigger after runner recovery
Co-Authored-By: infra-sre
2026-05-11 02:49:32 +00:00
99f3cf7c8f [core-be-agent] fix(#354): wire delegation-results consumer into a2a executor
Close the A2A delegation auto-resume gap.

Root cause: heartbeat.py's _check_delegations already writes completed
delegation rows to DELEGATION_RESULTS_FILE and sends a self-message to
wake the agent. executor_helpers.read_delegation_results() was defined to
atomically consume that file, but a2a_executor._core_execute() never
called it — so delegation results were written but the agent never saw
them.

Fix: call read_delegation_results() at the top of _core_execute() and
prepend the results to the user input context so the agent can act on
them without an explicit check_task_status call. The Temporal durable
workflow path is also covered because it calls _core_execute() directly.

Test: two new cases — delegation results injected when file exists;
user input passed through unchanged when file is empty.

Closes molecule-core#354.
2026-05-11 02:49:32 +00:00
aed164ed6f Merge pull request 'fix(workspace): push-mode Queued returns delivery_mode="push" (not silent default "poll")' (#356) from runtime/fix-a2a-push-delivery-mode-v2 into main 2026-05-11 02:49:11 +00:00
d616381f81 ci: re-trigger after label change
Co-Authored-By: infra-sre
2026-05-11 02:47:21 +00:00
42b867d764 ci: re-trigger after runner recovery
Co-Authored-By: infra-sre
2026-05-11 02:47:21 +00:00
3eb3609b0c test(workspace): add queue_id-absence and push-vs-poll distinction tests
Incorporates valuable extra coverage from fullstack-engineer's PR #336:
- test_push_queued_missing_queue_id_still_parsed: queue_id is optional,
  absence must not break parsing
- test_push_queued_is_distinct_from_poll_queued: both envelope shapes
  parse correctly and independently, with correct delivery_mode values

Also adds push_queued_no_queue_id fixture and regression gate entry.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 02:47:21 +00:00
0a9b66a3ed fix(workspace): push-mode Queued returns delivery_mode="push" (not silent default "poll")
Bug: a2a_response.py:197 returned Queued(method=method) without passing
delivery_mode, silently defaulting to "poll" for push-mode busy-queue
responses. Callers branching on v.delivery_mode would mis-identify push-mode
responses as poll-mode, causing wrong dispatch logic.

Fix: pass delivery_mode="push" explicitly in the push-mode branch.

Tests: add push_queued_full/notify/no_method fixtures and 4 test cases
asserting delivery_mode="push" for all three envelope shapes. Also add
adversarial {"queued": "yes"} and {"queued": False} → Malformed guards.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 02:47:21 +00:00
8046410eee Merge pull request 'fix(ci): add _sanitize_a2a to TOP_LEVEL_MODULES allowlist (third defect from #351 chain)' (#357) from fix/publish-runtime-add-_sanitize_a2a-to-allowlist into main 2026-05-11 02:43:41 +00:00
a1ba496926 ci: re-trigger after runner recovery
Co-Authored-By: infra-sre
2026-05-11 02:41:46 +00:00