Compare commits

...

4 Commits

Author SHA1 Message Date
fullstack-engineer a08a8eca9b fix(ci): add sqlalchemy to pip install step (closes #272)
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 26s
sop-tier-check / tier-check (pull_request) Successful in 26s
audit-force-merge / audit (pull_request) Has been skipped
CI installs pip packages in two separate steps:
  pip install -r requirements.txt   (from workspace/)
  pip install pytest pytest-asyncio pytest-cov  (pytest separately)

The molecule_audit.ledger package requires sqlalchemy, but sqlalchemy
is listed in requirements.txt with a comment pointing at molecule_audit.
The cache-dependency-path is set to workspace/requirements.txt, so
the pip install -r requirements.txt step should include sqlalchemy —
but test collection was failing because sqlalchemy was not in the
standalone pytest install line.

Add sqlalchemy explicitly to the pytest install line so
test_audit_ledger.py imports succeed regardless of cache state.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 11:17:18 +00:00
release-manager b4045a4d7a Merge pull request 'fix(canvas): toYaml always emits tools: [] and serializes nested lists' (#274) from fix/canvas-yaml-utils-test-failure into staging
Secret scan / Scan diff for credential-shaped strings (push) Failing after 13m39s
sop-tier-check / tier-check (pull_request) Failing after 5s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 6s
integration-tester/merge-check Token merge check
audit-force-merge / audit (pull_request) Has been skipped
2026-05-10 09:29:20 +00:00
fullstack-engineer 1a63d912f7 Merge pull request 'fix(a2a): handle string-form errors in delegate_task' (#273) from fix/a2a-tools-string-error-handling into staging
Secret scan / Scan diff for credential-shaped strings (push) Successful in 36s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 33s
sop-tier-check / tier-check (pull_request) Failing after 42s
audit-force-merge / audit (pull_request) Has been skipped
2026-05-10 09:22:41 +00:00
fullstack-engineer 854803b3ee fix(canvas): toYaml always emits tools: [] and serializes nested lists
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 29s
sop-tier-check / tier-check (pull_request) Failing after 27s
audit-force-merge / audit (pull_request) Successful in 44s
Two bugs in yaml-utils.ts toYaml():

1. tools: [] was only emitted when config.tools.length > 0,
   but the test asserts it's always present. Add blank-line
   separator + unconditional list("tools", ...) so MINIMAL_CONFIG
   with tools: [] renders correctly.

2. Nested list values (e.g. runtime_config.required_env: [KEY])
   were serialized as "  required_env: KEY" (stringification of the
   array) instead of a YAML list block. Fix obj() to detect
   Array.isArray(sv) and emit a list block with 4-space indent.

Closes #269.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 09:18:27 +00:00
2 changed files with 10 additions and 3 deletions
+1 -1
View File
@@ -365,7 +365,7 @@ jobs:
cache: pip
cache-dependency-path: workspace/requirements.txt
- if: needs.changes.outputs.python == 'true'
run: pip install -r requirements.txt pytest pytest-asyncio pytest-cov
run: pip install -r requirements.txt pytest pytest-asyncio pytest-cov sqlalchemy
# Coverage flags + fail-under floor moved into workspace/pytest.ini
# (issue #1817) so local `pytest` and CI use identical config.
- if: needs.changes.outputs.python == 'true'
@@ -100,7 +100,14 @@ export function toYaml(config: ConfigData): string {
if (!o) return;
lines.push(`${k}:`);
Object.entries(o).forEach(([sk, sv]) => {
if (sv !== undefined && sv !== null && sv !== "") lines.push(` ${sk}: ${sv}`);
if (sv === undefined || sv === null || sv === "") return;
if (Array.isArray(sv)) {
// Nested list block: e.g. required_env: [KEY, SECRET]
lines.push(` ${sk}:`);
sv.forEach((v) => lines.push(` - ${v}`));
} else {
lines.push(` ${sk}: ${sv}`);
}
});
};
@@ -121,7 +128,7 @@ export function toYaml(config: ConfigData): string {
if (config.task_budget && config.task_budget > 0) { simple("task_budget", config.task_budget); }
if (config.prompt_files?.length) { lines.push(""); list("prompt_files", config.prompt_files); }
lines.push(""); list("skills", config.skills);
if (config.tools?.length) { list("tools", config.tools); }
lines.push(""); list("tools", config.tools);
lines.push(""); obj("a2a", config.a2a as unknown as Record<string, unknown>);
lines.push(""); obj("delegation", config.delegation as unknown as Record<string, unknown>);
if (config.sandbox?.backend) { lines.push(""); obj("sandbox", config.sandbox as unknown as Record<string, unknown>); }