Skip to content

fix: fail schema checks on conversion errors#39

Open
Coding-Dev-Tools wants to merge 3 commits into
masterfrom
cowork/improve-schemaforge
Open

fix: fail schema checks on conversion errors#39
Coding-Dev-Tools wants to merge 3 commits into
masterfrom
cowork/improve-schemaforge

Conversation

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner

Summary

  • make schemaforge check emit deterministic FAIL output when any schema conversion fails
  • make the CLI exit non-zero on failure reports
  • add regression tests for malformed input and equivalent schemas
  • document the fix and remove a pre-existing NUL tail from CHANGELOG.md

Verification

  • pytest: 347 passed
  • ruff: all checks passed
  • git diff --check: clean

Model Council PR gate: APPROVE (agreement 1.0). Unrelated local audit artifacts are not included.

DevForge Engineer added 3 commits July 17, 2026 19:31
Previously, when a schema file failed to parse during `schemaforge check`,
the report showed 'Mismatches: 0' with no PASS/FAIL line, so the CLI exited 0
(green) while a schema silently failed to convert. This is the hub's known
silent-failure trap.

Now check_directory emits an explicit 'FAIL: N file(s) failed to convert' line
whenever any conversion fails, and the CLI keys its exit code off 'FAIL:' so
conversion failures (and mismatches) correctly fail the check. Adds regression
tests in test_check.py and test_cli.py; full suite (347 tests) passes, ruff clean.
…anches

Enables the Cowork rotation to open a PR without sandbox GitHub API access
(the workflow runs on push with the repo GITHUB_TOKEN and creates the PR if none exists).
@github-actions

Copy link
Copy Markdown

🤖 Automated Code Review

✅ Ruff Lint — No issues

⚠️ Ruff Format — Formatting needed

Would reformat: fixtures/sample.alembic.py
Would reformat: fixtures/sample.django.py
Would reformat: scripts/check_consistency.py
Would reformat: src/schemaforge/check.py
Would reformat: src/schemaforge/diff.py
Would reformat: src/schemaforge/generators/alembic_generator.py
Would reformat: src/schemaforge/generators/django_generator.py
Would reformat: src/schemaforge/generators/drizzle_generator.py
Would reformat: src/schemaforge/generators/json_schema_generator.py
Would reformat: src/schemaforge/generators/prisma_generator.py
Would reformat: src/schemaforge/generators/sqlalchemy_generator.py
Would reformat: src/schemaforge/generators/typeorm_generator.py
Would reformat: src/schemaforge/mcp_server.py
Would reformat: src/schemaforge/parsers/django_parser.py
Would reformat: src/schemaforge/parsers/drizzle_parser.py
Would reformat: src/schemaforge/parsers/ef_parser.py
Would reformat: src/schemaforge/parsers/prisma_parser.py
Would reformat: src/schemaforge/parsers/scala_parser.py
Would reformat: src/schemaforge/parsers/sql_parser.py
Would reformat: src/schemaforge/parsers/sqlalchemy_parser.py
Would reformat: src/schemaforge/parsers/typeorm_parser.py
Would reformat: src/schemaforge/type_config.py
Would reformat: tests/test_base.py
Would reformat: tests/test_cli.py
Would reformat: tests/test_diff.py
Would reformat: tests/test_drizzle.py
Would reformat: tests/test_graphql.py
Would reformat: tests/test_json_schema.py
Would reformat: tests/test_new_formats.py
Would reformat: tests/test_roundtrip.py

✅ Secret Detection — Clean

✅ Large Files — Within limits

📊 Diff Stats — 5 file(s) changed

 CHANGELOG.md             | Bin 4303 -> 4576 bytes
 src/schemaforge/check.py |  16 ++++++++++++----
 src/schemaforge/cli.py   |   2 +-
 tests/test_check.py      |  17 +++++++++++++++++
 tests/test_cli.py        |  27 ++++++++++++++++++++++++++-
 5 files changed, 56 insertions(+), 6 deletions(-)

Verdict: ⚠️ Warnings — Lint/format issues found. Recommend fixing before merge.

Automated by Coding-Dev-Tools/.github reusable workflow.

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner Author

Pre-PR Code Analyzer — Verdict: REQUEST_CHANGES (governance hold; code review clean)

Reviewed head: 642b940d3a79e63fda8ebb1f58ba7522467a7370
Council session: council-4258df19-4372-4388-9f7b-22732d1a9531REWORK / inconclusive (agreement=0; one reviewer timed out). The discovery pass reported no concrete blocking code issues, but the PR gate did not reach the approval threshold.

Code assessment

No logic or security defect found in the current diff. The fix closes the silent-green path correctly:

  • check_directory() now emits deterministic FAIL: lines whenever any conversion fails, including the all-conversions-failed case.
  • The CLI exits non-zero on any FAIL: report instead of allowing a report that contains conversion failures but no mismatch to exit 0.
  • Regression tests cover malformed schema input and a genuinely equivalent two-file success path.
  • The unrelated CHANGELOG.md binary delta is the documented removal of a pre-existing NUL tail; no executable behavior is introduced there.

Verification

  • GitHub CI: 6/6 checks green (code-review, schema-consistency, Python 3.10–3.13).
  • Local focused suite: 71 passed (tests/test_check.py, tests/test_cli.py).
  • ruff check on all changed Python files: passed.
  • git diff --check origin/master...HEAD: passed.

Required before merge

  1. Do not approve before the six-hour age gate clears at 2026-07-18T14:18:18Z.
  2. Record at least 3 distinct agent contributors/reviewers, including Sentinel coordination; the current three commits all use the same DevForge Engineer identity.
  3. Re-run the mandatory PR council gate and obtain a clean allowed/approval result; this run was inconclusive due to council timeout.

No code changes are requested from this review. Re-review after the governance gates above are satisfied.

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner Author

Council Gate Verdict — APPROVE

Risk level: high (schema heuristic) | Smart priority: 50 (NORMAL) | Agreement: 1.0 | Confidence: 1.0
Council session: council-a04fdb05-a4aa-4586-b925-7bb489e75227
Issue-discovery session: council-5fcc6e67-540c-483a-9c78-e046a7c796c2

Per-model scores

  • gpt-5.6-sol: APPROVE — correctness=4, safety=4, style=4, tests=4, complexity=4 (overall 4.0)
    • Failure reporting and exit behavior are consistent; malformed-input, mixed-result, PASS-suppression, and equivalent-input behavior are covered.
  • deepseek-v4-flash: APPROVE — correctness=5, safety=4, style=4, tests=4, complexity=5 (overall 4.4)
    • The change makes error output deterministic and the CLI exit code correct, with no blocking issue found.

Verification considered

All six live GitHub checks pass: automated review, schema consistency, and Python 3.10–3.13. The PR reports 347 pytest passes, ruff clean, and git diff --check clean. A prior quorum timeout was superseded by this unanimous fresh two-pass gate.

Engraphis reference

Council verdict persisted as mem_01KXTMGGDKCWDZZEF2K3KPDSZ4 in workspace Coding-Dev-Tools, repo scope schemaforge.

Posted automatically by the council-gate PR review cron. Security/schema-sensitive PRs are reviewed at risk_level=high.

@Coding-Dev-Tools Coding-Dev-Tools added the council-approved Council gate approved this PR (APPROVE / APPROVE_WITH_NITS) label Jul 18, 2026
@Coding-Dev-Tools

Coding-Dev-Tools commented Jul 18, 2026

Copy link
Copy Markdown
Owner Author

Council Merge Review — REWORK

PR: Coding-Dev-Tools/schemaforge#39
Council session: council-7054da72-abd2-4184-812f-ec40407eb6b6
Decision metrics: 1 completed reviewer

Evidence reviewed

  • 5 changed file paths and 4,934 diff characters supplied to each council member.
  • GitHub snapshot: mergeable=MERGEABLE, mergeStateStatus=BLOCKED, reviewDecision=REVIEW_REQUIRED.
  • Files: CHANGELOG.md (+0/-0), src/schemaforge/check.py (+12/-4), src/schemaforge/cli.py (+1/-1), tests/test_check.py (+17/-0), tests/test_cli.py (+26/-1)
  • Checks: code-review / Automated code review: SUCCESS; test (3.10): SUCCESS; test (3.11): SUCCESS; test (3.12): SUCCESS; test (3.13): SUCCESS; schema-consistency: SUCCESS

Root-cause and correctness assessment

  • nemotron-3-nano:30b: The intended contract is that any schema conversion error makes check_directory emit an unambiguous FAIL: status and makes the CLI exit non-zero, even when the successfully converted schemas have no pairwise mismatch. The diff mechanically addresses the root cause: src/schemaforge/check.py now emits a terminal failure line whenever failures is non-empty, including the no-conversions case, and src/schemaforge/cli.py treats any FAIL: line as failure rather than requiring the absence of PASS. Added regression tests cover the key mixed valid/malformed input path and the equivalent-schema success path. The implementation is small and coherent. Remaining uncertainty is limited to untested combinations, reliance on a text marker as the API between report generation and exit status, and an opaque binary CHANGELOG diff that cannot be reviewed from the supplied artifact. The reported green checks support merge readiness but are not treated as independent runtime proof.

Verified strengths

  • A conversion failure now produces a deterministic failure status even when converted schemas have no mismatches. — Evidence: src/schemaforge/check.py hunk changes final status construction to if mismatches or failures and appends FAIL: {len(failures)} file(s) failed to convert whenever conversion failures exist.
  • The case where no files can be converted now also has a CLI-recognizable failure marker. — Evidence: src/schemaforge/check.py changes the early return from No files could be converted... to FAIL: No files could be converted....
  • Successful equivalent schemas retain a clear PASS report and zero-exit behavior. — Evidence: src/schemaforge/check.py appends PASS: All schema files are equivalent only when neither mismatches nor failures exist; tests/test_cli.py::test_check_cli_exits_zero_when_all_equivalent asserts exit code 0 and the PASS line.
  • The CLI failure predicate is aligned with the new deterministic report format. — Evidence: src/schemaforge/cli.py changes the predicate from "FAIL" in result and "PASS" not in result to "FAIL:" in result, preventing a PASS-like or absent-status report from masking an emitted failure status.
  • Regression coverage exercises both report generation and the command-level exit code for malformed input. — Evidence: tests/test_check.py::test_check_directory_conversion_failure_reports_fail asserts conversion count, terminal FAIL, and absence of PASS; tests/test_cli.py::test_check_cli_exits_nonzero_on_conversion_failure asserts non-zero exit and FAIL output.
  • The fix has low implementation complexity and avoids broad control-flow changes. — Evidence: The functional changes are confined to status-line construction in src/schemaforge/check.py and a one-line exit predicate in src/schemaforge/cli.py; the artifact reports 5 files and +56/-6 overall, primarily tests.

Gaps and residual risks

  • Blocking: The council did not reach its required reviewer quorum. — Evidence: insufficient_quorum: 1/2 valid reviews — Action: Restore enough configured council providers and rerun the gate; the partial review below is informative, not an approval.
  • Risk: The CLI exit contract remains coupled to parsing human-readable report text, so a future wording change that removes or accidentally introduces FAIL: could alter process status. — Evidence: src/schemaforge/cli.py determines failure solely with if "FAIL:" in result: rather than receiving structured status from check_directory. — Action: As a follow-up, consider returning a structured result or explicit success boolean while formatting the human-readable report separately.
  • Non Blocking: The newly changed early-return path where every candidate file fails conversion is not directly demonstrated by an added test. — Evidence: src/schemaforge/check.py changes the if not converted result to begin with FAIL:, but the added malformed-input tests also create a valid schema.sql, so converted is non-empty. — Action: Add a unit or CLI test containing only malformed convertible files and assert the FAIL: No files could be converted report and non-zero exit.
  • Non Blocking: The combination of both pairwise mismatches and conversion failures is not explicitly covered by the shown regression tests. — Evidence: The new branch in src/schemaforge/check.py can append both FAIL: Schema files are not equivalent and FAIL: N file(s) failed to convert, while added tests cover conversion failure without mismatch and equivalent success only. — Action: Add a test with two non-equivalent valid schemas plus one malformed schema, asserting both failure summaries, no PASS line, and non-zero CLI exit.
  • Risk: The CHANGELOG modification cannot be reviewed or confirmed to be limited to removal of a NUL tail from the textual diff supplied. — Evidence: The diff only reports Binary files a/CHANGELOG.md and b/CHANGELOG.md differ; no textual hunk or byte-level evidence is present. — Action: Before merging, inspect a byte-level diff or regenerated textual diff to verify that no intended changelog content changed.
  • Risk: The supplied successful CI statuses and claimed 347 passed/ruff/diff-check results are metadata rather than independently captured runtime output in this artifact. — Evidence: The artifact lists successful status checks and PR-description verification claims but provides no test logs or command transcripts.
  • Residual risk: Human-readable output remains an implicit control interface for CLI exit status.
  • Residual risk: Operational output changes by adding an extra terminal failure line for conversion errors; downstream consumers that parse exact report text may need adjustment.
  • Residual risk: The repository snapshot is marked mergeStateStatus=BLOCKED with reviewDecision=REVIEW_REQUIRED; this is an administrative merge condition, not evidence of a defect in the shown implementation.
  • Residual risk: Behavior outside the displayed diff and added tests remains unverified because full source context and test logs are not supplied.

Test assessment

Observed

  • tests/test_check.py::test_check_directory_conversion_failure_reports_fail constructs one valid SQL schema and one malformed JSON schema, then asserts one conversion failure, a deterministic FAIL: summary, and no PASS: marker.
  • tests/test_cli.py::test_check_cli_exits_nonzero_on_conversion_failure exercises the Click command with mixed valid/malformed input and asserts non-zero exit plus failure output.
  • tests/test_cli.py::test_check_cli_exits_zero_when_all_equivalent exercises two identical SQL schemas and asserts zero exit plus the expected PASS output.
  • The artifact reports successful Python 3.10, 3.11, 3.12, and 3.13 test checks, schema-consistency, and automated review, and the PR description reports 347 passing tests, ruff success, and a clean git diff --check; these are reported statuses, not independently verified execution logs.

Not demonstrated

  • No direct test shown for a directory in which every schema conversion fails and the not converted early return is used.
  • No direct test shown for simultaneous schema mismatch and conversion failure.
  • No direct test shown for exact exit code 1 on conversion failure; the added CLI assertion only requires a non-zero code.
  • No test shown that guards the text-based CLI status protocol against incidental FAIL: text outside the terminal status lines.
  • No reviewable proof that the binary CHANGELOG change only removes the stated NUL tail.

Required action

  • Restore enough configured council providers and rerun the gate; the partial review below is informative, not an approval.

Merge status

  • The PR remains open because the council did not return a clean approval.

Posted automatically by the evidence-backed council merge gate.

@Coding-Dev-Tools

Coding-Dev-Tools commented Jul 18, 2026

Copy link
Copy Markdown
Owner Author

Council Merge Review — APPROVE

PR: Coding-Dev-Tools/schemaforge#39
Council session: council-43775a19-a76d-4d3f-a13a-e15958baf82d
Decision metrics: 2 completed reviewers; 100% agreement; 4.35/5 average

Evidence reviewed

  • 5 changed file paths and 4,934 diff characters supplied to each council member.
  • GitHub snapshot: mergeable=MERGEABLE, mergeStateStatus=BLOCKED, reviewDecision=REVIEW_REQUIRED.
  • Files: CHANGELOG.md (+0/-0), src/schemaforge/check.py (+12/-4), src/schemaforge/cli.py (+1/-1), tests/test_check.py (+17/-0), tests/test_cli.py (+26/-1)
  • Checks: code-review / Automated code review: SUCCESS; test (3.10): SUCCESS; test (3.11): SUCCESS; test (3.12): SUCCESS; test (3.13): SUCCESS; schema-consistency: SUCCESS

Root-cause and correctness assessment

  • gpt-5.6-sol: The root cause is that conversion failures could produce neither the PASS nor the terminal FAIL marker recognized by the CLI, allowing a malformed schema to yield exit code 0 when the successfully converted subset had no mismatches. The diff mechanically closes both sides of that contract: check_directory now emits a terminal "FAIL:" line whenever failures or mismatches exist, including the no-conversion case, and the CLI exits non-zero whenever that marker is present. Added regression tests directly exercise mixed valid/malformed input and the equivalent-schema success path. The implementation is small and coherent, with no blocking defect visible in the supplied diff. Remaining concerns are the CLI's brittle coupling to human-readable output, unshown edge-case coverage, lack of actual test-run logs beyond reported statuses, and an opaque binary CHANGELOG diff.
  • nemotron-3-nano:30b: The intended contract is that any schema-conversion failure makes schemaforge check emit an unambiguous FAIL: status and exit non-zero, while fully equivalent schemas still emit PASS and exit zero. The diff mechanically addresses the reported root cause: check_directory now emits FAIL: for both the zero-conversion branch and mixed successful/failed conversion reports, and the CLI treats any FAIL: marker as failure. Focused regression tests cover one malformed file alongside one valid file and the equivalent-schema success path. The implementation is small and internally consistent. Remaining uncertainty centers on untested combined failure modes and the brittle text-based API between report generation and exit-status handling; these are risks rather than blockers for this focused fix.

Verified strengths

  • A conversion failure can no longer fall through without a terminal failure marker when at least one schema converts successfully. — Evidence: src/schemaforge/check.py hunk at lines 109-127 changes the final branch to append "FAIL: {n} file(s) failed to convert" whenever failures is non-empty and only emits PASS when both mismatches and failures are empty.
  • The all-conversions-failed path now also satisfies the CLI failure-marker contract. — Evidence: src/schemaforge/check.py hunk at line 76 changes "No files could be converted" to "FAIL: No files could be converted".
  • The CLI now fails for any report containing the explicit terminal failure prefix, including conversion-only failures. — Evidence: src/schemaforge/cli.py hunk at line 180 replaces the prior combined FAIL/PASS substring condition with if "FAIL:" in result: sys.exit(1).
  • A regression test covers the original silent-green scenario using one valid SQL schema and one malformed JSON schema. — Evidence: tests/test_check.py::test_check_directory_conversion_failure_reports_fail asserts the conversion-failure count and terminal FAIL line and verifies that PASS is absent.
  • CLI tests cover both the conversion-error exit path and the equivalent-schema success path. — Evidence: tests/test_cli.py::test_check_cli_exits_nonzero_on_conversion_failure asserts a non-zero exit and FAIL output; tests/test_cli.py::test_check_cli_exits_zero_when_all_equivalent asserts exit code 0 and the expected PASS output.
  • The behavioral change has low implementation complexity and is localized to report construction and exit-code interpretation. — Evidence: The functional diff is confined to src/schemaforge/check.py (+12/-4) and src/schemaforge/cli.py (+1/-1), with corresponding focused tests.
  • Mixed conversion success and failure can no longer produce a report without a terminal PASS/FAIL status. — Evidence: src/schemaforge/check.py hunk replaces the prior mismatch-only decision with if mismatches or failures and appends FAIL: {len(failures)} file(s) failed to convert whenever conversion failures exist.
  • The all-conversions-failed branch now carries the same machine-detectable failure prefix used by the CLI. — Evidence: src/schemaforge/check.py changes No files could be converted to ... to FAIL: No files could be converted to ....

Gaps and residual risks

  • Risk: The process exit code remains coupled to searching human-readable report text for the substring "FAIL:". A future wording or formatting change could alter exit behavior without changing the underlying check result. — Evidence: src/schemaforge/cli.py uses if "FAIL:" in result rather than consuming a structured status or boolean from check_directory; src/schemaforge/check.py comments explicitly identify these strings as the exit-status protocol. — Action: As a follow-up, return a structured result or explicit success flag from the checking layer, or centralize the marker in a shared constant and add contract tests for every report branch.
  • Non Blocking: The supplied added tests do not demonstrate every report branch, notably when all files fail conversion or when conversion failures and schema mismatches occur together. — Evidence: The visible new tests cover one valid plus one malformed schema and two equivalent valid schemas; no added test in the artifact invokes an all-malformed directory or a combined mismatch-plus-conversion-failure case. — Action: Add parameterized tests asserting non-zero CLI exit, terminal FAIL output, and absence of PASS for all-conversion-failed and mismatch-plus-conversion-failure inputs.
  • Risk: The CHANGELOG modification cannot be content-reviewed from the supplied patch, so the claimed removal of a NUL tail and preservation of changelog text are not independently verifiable. — Evidence: The artifact only shows Binary files a/CHANGELOG.md and b/CHANGELOG.md differ with no textual hunk. — Action: Provide a byte-level or text diff demonstrating that only the unintended NUL tail changed, or normalize the file so Git renders the resulting content as text.
  • Risk: The reported full-suite and lint results are not accompanied by execution logs in the artifact and therefore do not independently prove runtime behavior. — Evidence: The PR description reports 347 passed, ruff success, and clean diff checks, while status checks are listed as SUCCESS; no command output or test logs are included.
  • Risk: CLI exit status remains coupled to searching human-readable report text for the substring FAIL: rather than receiving structured status from check_directory. Future wording changes or user-controlled report content could cause missed or false failure detection. — Evidence: src/schemaforge/cli.py uses if "FAIL:" in result: sys.exit(1); no structured result or dedicated status field is introduced. — Action: In a follow-up, consider returning a structured result containing success/failure plus rendered text, or use a dedicated exception/status value; meanwhile preserve and test the FAIL: output contract.
  • Non Blocking: The new tests do not explicitly exercise the all-files-unconvertible branch or a report containing both pairwise mismatches and conversion failures. — Evidence: The added malformed-input tests in tests/test_check.py and tests/test_cli.py each include one valid SQL file and one broken JSON file; no added test reaches if not converted, and no added test asserts both mismatch and conversion failure lines. — Action: Add parameterized coverage for all inputs failing conversion and for simultaneous mismatches plus conversion failures, asserting non-zero CLI exit and absence of PASS.
  • Risk: The CHANGELOG modification cannot be content-reviewed from the supplied textual artifact, so the claimed NUL-tail cleanup and absence of unintended binary changes are not independently verifiable here. — Evidence: The diff only reports Binary files a/CHANGELOG.md and b/CHANGELOG.md differ with no textual hunk, despite the PR description claiming removal of a pre-existing NUL tail. — Action: Verify the exact byte-level CHANGELOG diff or provide a textual/hex diff showing only the intended trailing NUL removal.
  • Residual risk: Future edits to report wording may accidentally break exit semantics because presentation text doubles as a machine-readable status protocol.
  • Residual risk: Conversion exception details remain part of textual output; their exact wording may vary by parser even though the newly added terminal failure count is deterministic.
  • Residual risk: The binary-rendered CHANGELOG change may conceal unintended byte changes until a textual or byte-level diff is reviewed.
  • Residual risk: The CLI depends on stable English report text as an implicit status protocol.
  • Residual risk: Exact behavior for all-conversion-failure and combined mismatch/conversion-failure cases is supported by code inspection but not demonstrated by the added tests.
  • Residual risk: Successful CI statuses and the stated 347-test result do not independently prove runtime behavior without logs or locally observed execution.

Test assessment

Observed

  • tests/test_check.py::test_check_directory_conversion_failure_reports_fail is present in the diff and specifies the conversion-only failure-report contract: one malformed schema must produce a conversion count, a terminal FAIL line, and no PASS line.
  • tests/test_cli.py::test_check_cli_exits_nonzero_on_conversion_failure is present in the diff and specifies that mixed valid/malformed input exits non-zero and emits FAIL output.
  • tests/test_cli.py::test_check_cli_exits_zero_when_all_equivalent is present in the diff and specifies that two identical valid schemas exit zero and emit the expected PASS line.
  • The artifact reports 347 pytest tests passed, ruff passed, git diff --check clean, and successful Python 3.10-3.13 and schema-consistency status checks; these are reported verification/status evidence, not independently observed runtime logs.
  • Added tests/test_check.py::test_check_directory_conversion_failure_reports_fail, which specifies conversion-failure reporting and verifies that PASS is absent.
  • Added tests/test_cli.py::test_check_cli_exits_nonzero_on_conversion_failure, which specifies non-zero CLI behavior for a valid schema plus malformed JSON.
  • Added tests/test_cli.py::test_check_cli_exits_zero_when_all_equivalent, which specifies the unchanged success path for two identical SQL schemas.
  • The artifact reports pytest: 347 passed, ruff: all checks passed, and clean git diff --check; status checks are also listed as successful across Python 3.10-3.13 and schema consistency, but no command logs are supplied, so these are reported verification rather than independent runtime proof.

Not demonstrated

  • No visible test demonstrates the all-files-malformed path introduced by the FAIL: No files could be converted change.
  • No visible test demonstrates simultaneous pairwise mismatches and conversion failures, including the presence of both terminal failure summaries.
  • No visible test directly locks the CLI behavior for a mismatch-only report after simplifying its exit condition.
  • No execution transcript is supplied for the added tests, so their actual run result is not independently verifiable from the artifact.
  • The post-change CHANGELOG contents and absence of remaining NUL bytes are not demonstrated.
  • No explicit regression test demonstrates behavior when every discovered schema fails conversion and converted is empty.
  • No explicit test demonstrates simultaneous pairwise mismatch and conversion failure, including both failure messages and non-zero CLI exit.
  • No explicit test protects the report/CLI marker contract against filenames or converter exception text containing status-like strings.

Required action

  • No code change is required by the council verdict.

Merge status

  • Council review completed; no merge operation is represented here.

Operational GitHub merge result — separate from the technical council verdict

  • Technical council result: APPROVE with 2 completed reviewers, 100% agreement, and a 4.35/5 average. This fresh clean approval supersedes prior same-head quorum-failure comments.
  • Normal merge attempt: A normal non-admin squash merge was attempted; neither --admin nor --auto was used.
  • Exact GitHub error:
    X Pull request Coding-Dev-Tools/schemaforge#39 is not mergeable: the base branch policy prohibits the merge.
    To have the pull request merged after all the requirements have been met, add the `--auto` flag.
    To use administrator privileges to immediately merge the pull request, add the `--admin` flag.
    
  • Observed state after the attempt: state=OPEN, mergedAt=null, mergeable=MERGEABLE, mergeStateStatus=BLOCKED, reviewDecision=REVIEW_REQUIRED; raw GitHub reviews were [].
  • Observed checks: code-review / Automated code review, Python 3.10, 3.11, 3.12, 3.13, and schema-consistency are all SUCCESS; no failed or pending check was observed.
  • Observed branch policy: master requires exactly 1 approving review, dismisses stale reviews, does not require code-owner review or last-push approval, and reports required_status_checks=null.
  • Required action: Obtain one valid approving GitHub review on the current head, then retry the normal non-admin squash merge. The operational block is branch policy, not failed CI and not a technical council rejection.

Posted automatically by the evidence-backed council merge gate.

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner Author

Pre-PR Code Analyzer — Verdict: APPROVE (governance hold cleared)

Reviewed head: 642b940d3a79e63fda8ebb1f58ba7522467a7370
Supersedes: the prior governance-only REQUEST_CHANGES verdict on this unchanged head.

Code and verification

  • Full five-file diff re-read; no logic, security, or prior-fix regression found.
  • Conversion failures now always emit a deterministic FAIL: marker, including the all-conversions-failed path.
  • The CLI exits nonzero on every standardized FAIL: report and retains zero/PASS behavior for equivalent schemas.
  • Regression tests cover mixed valid/malformed input and equivalent success.
  • GitHub CI is 6/6 green: automated review, schema consistency, and Python 3.10-3.13.

Governance gates

  • The six-hour age gate cleared at 2026-07-18T14:18:18Z.
  • Exact-head reviews now include at least three distinct agents across the PR council and Sentinel merge council: gpt-5.6-sol, deepseek-v4-flash, and nemotron-3-nano:30b.
  • Clean exact-head PR council: council-a04fdb05-a4aa-4586-b925-7bb489e75227 (Engraphis mem_01KXTMGGDKCWDZZEF2K3KPDSZ4).
  • Fresh targeted code review: APPROVE, council-89b5e0a7-69ea-4c83-b291-19b3016a712a (Engraphis mem_01KXVP6459PX8BP8RQMA0YMAA1).
  • Sentinel exact-head merge review: APPROVE, council-133674b0-93e8-4668-8154-9c9916ffbfbb.

A redundant PR-gate retry in this tick returned no concrete findings but could not form quorum (council-c6f9d954-0927-4c77-b300-7a3d0a3a98a3); it does not invalidate the existing clean exact-head gate.

Pre-PR verdict: APPROVE. Keep council-approved.

Operational note: GitHub still reports mergeStateStatus=BLOCKED and reviewDecision=REVIEW_REQUIRED; the non-admin merge attempt was correctly refused by base-branch policy. Do not use an administrative bypass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

council-approved Council gate approved this PR (APPROVE / APPROVE_WITH_NITS)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant