fix(mosaic): harden Gitea pr merge fallback #521
Closed
jason.woltje
wants to merge 0 commits from
fix/t_301e4e3b-pr-merge-gitea-empty-uid into main
pull from: fix/t_301e4e3b-pr-merge-gitea-empty-uid
merge into: :main
:next
:refactor
:feat/1311-credential-seat-store
:fix/1257-adopt-draft-transition
:docs/prd-rev1-ratification
:r4-helper-port
:docs/containerization-plan
:feat/m4-4b-enrollment-command
:feat/m4-4a-enrollment-schema
:feat/m4-4-0-enrollment-design
:feat/m4-3a-p1-stop-mission-task-status-writes
:docs/m4-3a0-p0-map-currency
:docs/c2-amendment1-company-crud
:config/minimal-subset
:feat/m4-1b-ii-hierarchy-commands
:mosaic-cli-p1-wrappers
:mosaic-cli-p1-dispatch
:docs/ruling-4b-company-visibility
:feat/m4-1b-hierarchy-gateway
:feat/m4-1a-hierarchy-schema
:feat/p6-e2e-ci-gate
:feat/p5-spa-cutover
:fix/1451-appservice-dockerfile-scripts
:contract/onboarding-wizard
:contract/custody-schema
:contract/api-artifacts
:fix/appservice-dockerfile-scripts
:docs/t78-cli-capability-migration
:contract/rollup-projection
:contract/hierarchy-schema
:fix/invariant-r-version-probe-retry
:contract/mode-conversion
:contract/tool-gateway-mapping
:contract/rbac-grants
:contract/identity-lifecycle
:chore/s1-docs-hygiene
:docs/ri-050-release-evidence
:feat/webui-p4-2-settings-admin
:fix/bootstrap-race
:fix/teams-enumeration-scope
:fix/1407-next-image-parity
:docs/prd-north-star-rewrite
:rescue/ms-gate-001-gatekeeper
:fix/1394-recover-token-headless
:fix/1390-uninstall-headless
:fix/1403-n1n2-followup
:fix/1391-validationpipe-boot-check
:archive/salvage-20260825/wp5b-consumer-compat
:wp5b-consumer-compat-2
:archive/salvage-20260825/t63-fix-2648
:archive/salvage-20260825/t63-fix-1389
:archive/salvage-20260825/i1380ff-fix
:i1380-guard
:fix/send-message-exact-target-pin
:t51p2wp0b
:archive/ms24-fork
:fix/ci-queue-wait-no-ci-merge-path
:fix/credentials-gitea-seat-slots
:feat/onboarding-scripts-framework
:pr-1367
:fix/1357-issue-view-comments
:fix/1356-tea-login-fail-closed
:fix/1362-harness-aware-delivery-confirm
:fix/gitea-guessed-login-credential
:docs/w4-document-contract
:fix/d29-lease-revoke-noop
:peggy/agent-send-unverified-label
:fix/pr-merge-fork-ci-status
:riv001-clean
:docs/1216-trunk-parameterization
:fix/1256-fleet-pane-path-node
:fix/1017-enumeration-guard-population
:fix/1182-fail-closed-launch
:fix/1327-setuppath-idempotency
:merge/main-into-next
:ci/push-ci-comment-model
:ci/pin-ci-base-image
:fix/ci-queue-wait-no-status
:fred/code-review-pinned-tool-rules
:fred/guides-seat-identity-fleet-comms
:fred/credential-fail-closed-seat-slots
:fix/fleet-greenfield-blockers
:feat/ri-050-qr-evaluator
:archive/salvage-20260825/zane/doctor-greenfield-hint
:archive/salvage-20260825/fix/ri-050-registry-secrets
:archive/salvage-20260825/docs/ri-050-release-evidence
:docs/ri-050-forge-docs-fastfollow
:fix/ri-050-registry-secrets
:test/ri-050-publish-gate-negative
:archive/salvage-20260825/fix/ri-050-verify-pglite-path
:fix/ri-050-verify-pglite-path
:docs/ri-050-qr-probe-inventory
:archive/salvage-20260825/zane/doctor-brain-home
:feat/ri-050-web-stale-safety
:archive/salvage-20260825/pr-1298
:archive/salvage-20260825/zane/mosaic-home-support
:docs/ri-050-mission-bootstrap
:fix/ri-050-forge-fail-closed
:feat/ri-050-publish-gate
:fleet/continuation-record-2026-08-17
:feat/ri-050-prd-authority
:fix/ri-050-macp-fail-closed
:fix/1280-identity-first-resolution
:feat/w-f4-store
:fix/1264-fleet-unattended-first-start
:fix/1269-ci-chain-unblock
:fix/1256-fleet-runtime-preflight
:fix/1257-e7-draft-transition
:fix/1240-fleet-transport-check
:fix/1017-wire-start-agent-session
:e2e-compose
:fix/1241-launch-failure-visible
:fix/1237-fleet-v2-dispatch
:fix/1236-installer-dir-modes
:fix/installer-path-and-node
:feat/wf-fleet-mvp
:fix/installer-provisions-node
:fix/lease-test-env-isolation
:release/0.0.50-integration
:feat/wf5-main-merge
:feat/wf5-securestorage
:feat/1216-trunk-resolver
:docs/1214-branch-process
:docs/ia-merge-current
:fix/869-lease-probe-timeout
:main
:feat/workspace-hygiene-tool-enforcement
:feat/1080-pr-edit
:fix/1179-required-security-di
:feat/p3-slice0-task5-chat-runtime-router-shaggy
:feat/p3-slice0-task5-chat-runtime-router
:feat/wf1-composition
:feat/p3-slice0-task4-web-catalog-selection
:feat/lease-promotion-and-harness-isolation
:ci/provision-pi-runtime
:feat/p3-slice0-task3-catalog-selection
:feat/p3-slice0-task2-harness-registry
:adopt/965-mos-ste-writing-standard
:fix/991-comment-url-scheme-normalise
:feat/wf2-bundle-migration
:feat/wf4-plugin-acquisition
:feat/wf5-refresh-safety
:fix/1145-coord-di-compiled-boot
:feat/p3-slice0-task1-harness-contracts
:docs/webui-phase-p-structure
:feat/1150-pi-goal-extension
:feat/webui-p3-chat
:fix/1146-ci-queue-purpose
:fix/1138-conditional-federation
:feat/webui-p2-data-auth
:fix/gateway-runner-image
:feat/webui-p1-vite-skeleton
:fix/break-c-hooks-and-web-image
:docs/webui-fleet-claude-bridge-plan
:fix/wizard-gateway-failure
:fix/next-node-gate
:fix/mosaic-init-rce
:greenfield/fomo-lin
:fix/1099-pipefail-wake
:fix/1099-pipefail-tests
:fix/1099-pipefail-sweep
:fix/framework-shell-portability
:fix/1043-pane-git-identity
:fix/1081-issue-close-silent-comment-failure
:fix/1090-enrollment-wallclock-tolerance
:feat/1082-tea-stale-token-diagnostic
:fix/detect-platform-silent-128-outside-repo
:feat/1050-install-state-machine-red-fixture
:fix/pr-merge-message-field
:feat/1051-mosaic-brain-installer
:feat/1045-mosaic-cred
:remediation/state
:fix/1056-upgrade-rollback-control-race
:fix/1019-ci-queue-timeout-harness
:feat/rm-02-gate-registry
:fix/rm-01-reproducible-checkout
:remediation/mission-setup
:fix/hygiene-inert-format-gate
:fix/1019-queue-guard-stdin
:feat/mos-ste-writing-standard
:fix/1017-enumeration-guard
:fix/1007-suite-hermeticity
:feat/push-guard-null-case-verification
:feat/wake-preimage-provenance
:mos-comms-live
:docs/heartbeat-framework-layering-ms-lead
:feat/869-c4-version-coupling
:feat/869-c2-install-ordering-guard
:feat/869-c5-doctor-activation-check
:feat/per-agent-gitea-identity
:fix/875-belongs-case-insensitive-slug
:fix/ci-queue-wait-404-branch-absent
:feat/869-c1-activation-probe
:feat/869-c3-broker-supervisor
:fix/865-tea-cli-comment-invocation
:feat/glpi-skills
:fix/860-deflake-mutator-lease-gate
:fix/850-detect-platform-port-normalization
:fix/856-worktree-deps-preflight
:fix/835-pr-review-approve-reject-comment-flag
:fix/848-truthful-evidence
:fix/812-pr-review-comment
:fix/849-recovery-runtime-fixture-race
:docs/758-ledger-m5-001-sync
:feat/834-tc-server-side-doc
:feat/833-constrained-recovery-command
:feat/827-gate0-probe
:governance/gate0-probe3-amendment
:fix/795-codex-pr-diff
:fix/795-ci-base-jq
:fix/795-ci-base-git
:feat/791-pr3-fleet-regen
:feat/791-pr2-snapshot-restore
:fix/807-glpi-206
:fix/808-agent-send-false-sender
:feat/791-upgrade-config-protection
:feat/790-mosaic-yolo-claudex-pr2
:feat/790-mosaic-yolo-claudex
:feat/758-v1-v2-migrator
:fix/766-exact-fleet-comms
:test/758-reconciler-lifecycle-gates
:docs/771-kbn101-db-role-split
:test/758-example-profile-dispositions
:feat/758-shared-role-resolution
:feat/mos-logical-identity-fencing
:feat/769-kbn100-unified-schema
:docs/753-kbn010-threat-gate
:feat/758-roster-v2-compiler
:feat/756-official-discord-plugin
:fix/mos-option2-qualification-format
:docs/issue-758-m0
:docs/mos-option2-qualification
:mos-comms
:feat/tess-interaction-agent
:fix/tess-docs-format
:draft/mosaic-platform-prd
:fix/installer-provider-gate-and-local-gateway-redis
:release/mosaic-cli-0.0.37
:feat/framework-constitution-alpha
:fix/git-wrapper-repo-detection
:fix/woodpecker-wrapper-legacy-mosaic
:fix/t-a292e96f-gitea-pr-metadata
:fix/gitea-pr-metadata-login-t-a292e96f
:fix/t_a292e96f-pr-metadata-gitea
:fix/t_3a368a52-gitea-usc-login
:fix/bootstrap-hotfix
:fix/populate-known-packages-list
:fix/idempotent-init
:archive/salvage-20260825/fix/ci-prisma-generate
:archive/salvage-20260825/feat/ms-gate-001-gatekeeper-local
:archive/salvage-20260825/feat/ms-gate-001-gatekeeper
:archive/salvage-20260825/feat/ms24-ci-webhook
:archive/salvage-20260825/fix/mission-control-proxy-routes
:archive/salvage-20260825/fix/deploy-missing-env-and-networks
:archive/salvage-20260825/fix/mission-control-query-provider
:archive/salvage-20260825/test/ms23-p2
:archive/salvage-20260825/feat/ms23-p2-audit
:archive/salvage-20260825/feat/ms23-p2-roster
:archive/salvage-20260825/feat/ms23-p1-proxy
:archive/salvage-20260825/feat/ms23-p1-registry
:archive/salvage-20260825/feat/ms23-p1-internal-provider
:archive/salvage-20260825/feat/ms23-p1-interface
:archive/salvage-20260825/chore/ms23-tasks-p0-complete
:archive/salvage-20260825/test/ms23-p0
:archive/salvage-20260825/chore/ms23-tasks-p005-006
:archive/salvage-20260825/feat/ms23-p0-tree
:archive/salvage-20260825/chore/ms23-tasks-p004-005
:archive/salvage-20260825/feat/ms23-p0-controls
:archive/salvage-20260825/chore/ms23-tasks-p0-002-004
:archive/salvage-20260825/feat/ms23-p0-stream
:archive/salvage-20260825/fix/ms23-prisma-rm-symlink
:archive/salvage-20260825/fix/ms23-prisma-kaniko-symlink
:archive/salvage-20260825/fix/ms23-prisma-script-path
:archive/salvage-20260825/fix/ms23-prisma-docker-vs-ci
:archive/salvage-20260825/fix/ms23-prisma-schema-local
:archive/salvage-20260825/fix/ms23-prisma-api-pkg
:archive/salvage-20260825/fix/ms23-prisma-cli
:archive/salvage-20260825/fix/ms23-orchestrator-prisma-generate
:archive/salvage-20260825/feat/ms23-p0-ingestion
:archive/salvage-20260825/feat/ms23-p0-schema
:archive/salvage-20260825/fix/agent-template-auth-module
:archive/salvage-20260825/feat/ms22-p2-discord-router
:archive/salvage-20260825/test/ms22-p2-agent-tests
:archive/salvage-20260825/chore/ms22-p2-docs-update
:archive/salvage-20260825/feat/ms22-p2-agent-routing
:archive/salvage-20260825/chore/ms22-p2-update-docs
:archive/salvage-20260825/feat/ms22-p2-user-agents
:archive/salvage-20260825/feat/ms22-p2-agent-crud
:archive/salvage-20260825/fix/security-audit-multer
:archive/salvage-20260825/ci/portainer-deploy
:archive/salvage-20260825/fix/ms21-missing-user-auth-migration
:archive/salvage-20260825/infra/fix-mosaic-db-init-extensions
:archive/salvage-20260825/infra/migrate-to-openbrain-db
:archive/salvage-20260825/fix/flaky-queue-test
:archive/salvage-20260825/fix/deploy-service-names
:archive/salvage-20260825/fix/deploy-service-update
:archive/salvage-20260825/fix/deploy-user-v2
:archive/salvage-20260825/fix/deploy-user
:archive/salvage-20260825/fix/orchestrator-widget-endpoints
:archive/salvage-20260825/fix/dashboard-widget-mock-data
:archive/salvage-20260825/fix/ci-glibc-image
:archive/salvage-20260825/fix/dockerfile-npmrc
:archive/salvage-20260825/fix/matrix-native-binary
:archive/salvage-20260825/fix/kaniko-cache
:archive/salvage-20260825/fix/base-image-kaniko-v2
:archive/salvage-20260825/fix/base-image-kaniko
:archive/salvage-20260825/feat/custom-base-image
:archive/salvage-20260825/ci/pnpm-cache
:archive/salvage-20260825/fix/interceptor-tests
:archive/salvage-20260825/fix/kanban-tests
:archive/salvage-20260825/feat/wire-chat
:archive/salvage-20260825/feat/usage-widget
:archive/salvage-20260825/feat/usage-widget-review
:archive/salvage-20260825/fix/security-hardening
:archive/salvage-20260825/fix/project-domain-attach
:archive/salvage-20260825/fix/project-domain-v2
:archive/salvage-20260825/feat/kanban-add-task
:archive/salvage-20260825/fix/logs-page-clean
:archive/salvage-20260825/fix/logs-page
:archive/salvage-20260825/fix/workspace-members
:archive/salvage-20260825/fix/ci-lint-632
:archive/salvage-20260825/fix/lint-from-632
:archive/salvage-20260825/fix/file-manager-tags
:archive/salvage-20260825/fix/csrf-debug-log
:archive/salvage-20260825/fix/controller-type-imports
:archive/salvage-20260825/fix/system-admin-env
:archive/salvage-20260825/fix/gateway-cors-trusted-origins
:archive/salvage-20260825/fix/fleet-provider-form-dto-v2
:archive/salvage-20260825/fix/ms22-audit
:archive/salvage-20260825/fix/orchestrator-widgets
:archive/salvage-20260825/fix/fleet-provider-form-dto
:archive/salvage-20260825/fix/orchestrator-widgets-preexisting
:archive/salvage-20260825/fix/csrf-bearer-bypass
:archive/salvage-20260825/fix/ms22-missing-authmodule-imports
:archive/salvage-20260825/fix/container-lifecycle-config-module
:archive/salvage-20260825/fix/swarm-compose-ms22-vars
:archive/salvage-20260825/chore/ms22-p1-complete
:archive/salvage-20260825/feat/ms22-p1k-idle-reaper
:archive/salvage-20260825/feat/ms22-p1j-docker
:archive/salvage-20260825/feat/ms22-p1e-onboarding-api-work
:archive/salvage-20260825/feat/ms22-p1c-config-api
:archive/salvage-20260825/chore/ms22-prd-tracking
:archive/salvage-20260825/feat/ms22-p1b-crypto
:archive/salvage-20260825/docs/ms22-architecture
:archive/salvage-20260825/feat/ms22-openclaw-docker
:archive/salvage-20260825/feat/ms22-openclaw-gateway-module
:archive/salvage-20260825/chore/ms21-complete
:archive/salvage-20260825/chore/ms21-final-tasks-done
:archive/salvage-20260825/fix/ms21-ui-001-qa
:archive/salvage-20260825/feat/ms22-openclaw-docker-backup-20260301
:archive/salvage-20260825/chore/ms22-phase0-complete
:archive/salvage-20260825/feat/ms21-ui-teams-rbac-v3
:archive/salvage-20260825/test/ms22-integration
:archive/salvage-20260825/feat/ms22-ingest-clean
:archive/salvage-20260825/feat/ms21-ui-users-members
:archive/salvage-20260825/feat/ms22-ingest
:archive/salvage-20260825/feat/ms22-task-agent
:archive/salvage-20260825/chore/ms22-tasks-tracking
:archive/salvage-20260825/feat/ms21-ui-teams-rbac
:archive/salvage-20260825/fix/openbao-otel-cve
:archive/salvage-20260825/ci/unified-pipeline
:archive/salvage-20260825/feat/ms22-conversation-archive
:archive/salvage-20260825/feat/ms22-agent-memory
:archive/salvage-20260825/feat/ms22-findings
:archive/salvage-20260825/feat/ms22-knowledge-schema
:archive/salvage-20260825/chore/tasks-final
:archive/salvage-20260825/chore/tasks-update
:archive/salvage-20260825/feat/ms21-session-invalidation
:archive/salvage-20260825/feat/ms21-rbac-settings
:archive/salvage-20260825/feat/ms21-rbac
:archive/salvage-20260825/feat/ms21-ui-user-dialogs
:archive/salvage-20260825/feat/ms21-ui-workspace-members
:archive/salvage-20260825/feat/ms21-ui-teams
:archive/salvage-20260825/chore/ms21-tasks-ui-progress
:archive/salvage-20260825/feat/ms21-ui-workspaces
:archive/salvage-20260825/feat/ms21-ui-users
:archive/salvage-20260825/chore/ms21-tasks-schema-fix
:archive/salvage-20260825/feat/ms21-import-api
:archive/salvage-20260825/test/ms21-migration-tests
:archive/salvage-20260825/feat/ms21-teams-page
:archive/salvage-20260825/feat/ms21-users-page
:archive/salvage-20260825/chore/ms21-task-update-p1-p3
:archive/salvage-20260825/feat/ms21-admin-module
:archive/salvage-20260825/fix/websocket-reconnect
:archive/salvage-20260825/merge/develop-to-main
No Reviewers
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Assignees
code-be-01 (Mosaic fleet seat code-be-01)
code-be-02 (Mosaic fleet seat code-be-02)
code-dogfood-01 (Mosaic fleet seat code-dogfood-01)
code-infra-01 (Mosaic fleet seat code-infra-01)
darkwing (Mosaic fleet seat darkwing)
dewey (Mosaic fleet seat dewey)
fargo
filbert (Mosaic fleet seat filbert)
fred
gate-merge-01 (Mosaic fleet seat gate-merge-01)
happy
jason.woltje (Jason Woltje)
marcie
merge-gate
mosaic-stack-coder-bot (mosaic-stack coder bot)
mosaic-stack-cto-bot (mosaic-stack cto bot)
mosaic-stack-pm-bot (mosaic-stack pm bot)
ops-01 (Mosaic fleet seat ops-01)
ops-02 (Mosaic fleet seat ops-02)
ops-03 (Mosaic fleet seat ops-03)
ops-ci-01 (Mosaic fleet seat ops-ci-01)
ops-deploy-01 (Mosaic fleet seat ops-deploy-01)
orch-01 (Mosaic fleet seat orch-01)
pepper
resume
rev-code-01
rev-code-02
rev-security-01
rev-security-02
rev-security-03 (Mosaic fleet seat rev-security-03)
rocko (Mosaic fleet seat rocko)
sanity
scooby (Scooby)
scrappy
shaggy
tiny
topher (Mosaic fleet seat topher)
velma
veronica (Mosaic fleet seat veronica)
vision
woodpecker
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#521
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem: pr-merge.sh preferred tea pr merge whenever a host tea login existed. On Gitea, tea identity preflight can succeed while non-interactive tea merge fails with the known empty identity error, permanently blocking a valid squash merge.
Change:
Exact fallback trigger:
Tests/evidence:
Tracking:
DO-178B Review: PR #521 — fix(mosaic): harden Gitea pr merge fallback
Software Level: C (Mosaic delivery wrapper/business-critical tooling)
Reviewer: ultron
Base:
755df9079eHead reviewed: 893dd19efbe6a6434f3ae9e040ef9d4c25034fc6
Scope: packages/mosaic/framework/tools/git/pr-merge.sh, packages/mosaic/framework/tools/git/test-pr-merge-gitea-empty-uid.sh, docs/scratchpads/t_301e4e3b-pr-merge-gitea-empty-uid.md
Objective summary:
1 Requirements Traceability: PASS — PR body links t_245ad9d8/t_301e4e3b and issue #520.
2 Derived Requirements: PASS — API fallback safety behavior documented.
3 Configuration Management: PASS — branch targets main; head pinned above; scoped files only.
4 Functional Correctness: PASS for Gitea fallback — known empty uid path falls back; arbitrary tea failure blocks.
5 Structural Coverage: PASS for focused shell harness; broader coverage not applicable to shell wrapper.
6 Security Analysis: FAIL — eval injection remains in GitHub path of touched wrapper.
7 Data Integrity: PASS — merge action remains guarded by squash/main/queue checks before execution.
8 Robustness: PASS — fallback handles no-login and known tea identity failure; unknown failures fail closed.
9 Code Quality: FAIL — eval-based command construction remains in pr-merge.sh.
10 Framework Compliance: PASS — Mosaic squash/main/queue policies preserved for Gitea path.
11 Regression Protection: PASS for focused checks; full pnpm test failure documented as out-of-scope gateway DB setup.
12 Hands-Off Verification: PASS — diff is limited to declared wrapper/test/scratchpad scope.
Findings:
🔴 [BLOCKER] packages/mosaic/framework/tools/git/pr-merge.sh:193-195 — GitHub merge path still builds a command string with unvalidated PR_NUMBER and executes it via eval.
The review scope explicitly required verifying that shell quoting avoids eval-style injection risks. The Gitea path was fixed to quote arguments, but the same touched wrapper still has:
A mocked GitHub-platform probe with
-n '123; touch <sentinel> #'executed the injected command before reporting success. This is a command injection risk in a privileged delivery wrapper and fails the required shell-quoting check.Remediation:
PR_NUMBERbefore any metadata lookup/merge, e.g.[[ "$PR_NUMBER" =~ ^[0-9]+$ ]] || exit 1.cmd=(gh pr merge "$PR_NUMBER" --squash); [[ "$DELETE_BRANCH" == true ]] && cmd+=(--delete-branch); "${cmd[@]}".-n/--numberare rejected and do not execute on both GitHub and Gitea paths.Verification evidence run by reviewer:
bash -n packages/mosaic/framework/tools/git/pr-merge.shbash -n packages/mosaic/framework/tools/git/test-pr-merge-gitea-empty-uid.shshellcheck -x packages/mosaic/framework/tools/git/pr-merge.sh packages/mosaic/framework/tools/git/test-pr-merge-gitea-empty-uid.sh— PASSbash packages/mosaic/framework/tools/git/test-pr-merge-gitea-empty-uid.sh— PASS/home/hermes/.config/mosaic/tools/codex/codex-code-review.sh -b origin/main -o ...). Independent subagent review completed and agreed the Gitea-specific behavior is acceptable but GitHub eval is a material residual issue.Verdict: REQUEST CHANGES. Do not merge until the eval injection path is removed or PR_NUMBER is strictly validated before command construction. Tuesday should not proceed to CI/queue-guard/merge gate yet.
19fc6d549eto59b611ba8aClosing as superseded by #524 (rollup
821e19d, merged 2026-05-26). Verified during orchestration rebase: both commits (893dd19 harden Gitea fallback, 19fc6d5 reject unsafe PR numbers) are already on main, which is a strict superset (adds basic_auth fallback, HTTP-code tracking, --dry-run). The api_url-unbound bug is FIXED on main (pr-merge.sh declares+assigns api_url before use). NOTE: the bug still reproduces from the installed framework copy on hosts (v0.0.30, 2026-05-06) which predates #524 — the real remaining action is upgrading the deployed framework, not merging this PR. — orchestrator (mos)Pull request closed