{"record":{"id":"f2d49162dd00dafa","repo":"Hmbown/CodeWhale","slug":"move-every-workspace-dependency-before-its-dependent-in","errorCode":null,"errorMessage":"Move every workspace dependency before its dependent in scripts/release/crates.sh.","messagePattern":"Move every workspace dependency before its dependent in scripts/release/crates\\.sh\\.","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"scripts/release/validate-crate-publish-order.py","lineNumber":166,"sourceCode":"            dependency,\n            dependent,\n            kind,\n        )\n        for dependency, dependent, kind in publish_edges\n        if positions[dependency] >= positions[dependent]\n    )\n    if violations:\n        lines = [\"crate publication order is not topological:\"]\n        for dependency, dependent, kind in violations:\n            lines.append(\n                f\"  {dependent} (position {positions[dependent] + 1}) depends on \"\n                f\"{dependency} (position {positions[dependency] + 1}) [{kind}]\"\n            )\n        lines.append(\n            \"Move every workspace dependency before its dependent in \"\n            \"scripts/release/crates.sh.\"\n        )\n        raise ValidationError(\"\\n\".join(lines))\n\n    return versions[0], has_workspace_dependencies\n\n\ndef main() -> int:\n    args = parse_args()\n    try:\n        packages = workspace_packages(load_metadata(args.metadata_file))\n        version, dependency_flags = validate_order(packages, args.crates)\n    except ValidationError as error:\n        print(error, file=sys.stderr)\n        return 1\n\n    print(f\"version\\t{version}\\t\")\n    for name in sorted(dependency_flags):\n        print(f\"crate\\t{name}\\t{1 if dependency_flags[name] else 0}\")\n    return 0\n","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/433685b2024e7bc4c99e1e2e326bcad39b4d9d65/scripts/release/validate-crate-publish-order.py#L148-L184","documentation":"After collecting publish edges (dependency → dependent), the validator checks that in scripts/release/crates.sh every workspace dependency appears at an earlier position than each crate that depends on it, since crates.io publish order must follow the DAG. If any edge is out of order it raises an aggregated error listing each violation plus this instruction line.","triggerScenarios":"Appending a new crate at the end of crates.sh when it is actually a dependency of an earlier crate; reordering crates.sh manually and placing a base crate after its consumer; a new dependency introduced between two already-listed crates.","commonSituations":"Release script maintenance where a new internal crate is added at the bottom of the list; alphabetical re-sorting of crates.sh ignoring dependency order.","solutions":["Read each violation line: it names the edge and the current positions.","Move the dependency earlier in the CRATES array in scripts/release/crates.sh so it precedes all dependents.","Re-run the validator until no violations remain.","For complex graphs, topologically sort the codewhale-* crates and regenerate the list."],"exampleFix":"// before (crates.sh)\nCRATES=(codewhale-tui codewhale-config)\n// after\nCRATES=(codewhale-config codewhale-tui)","handlingStrategy":"validation","validationCode":"pos = {name: i for i, name in enumerate(crates_sh_list)}\nfor dep, dependent, _ in publish_edges:\n    assert pos[dep] < pos[dependent], f'{dep} must precede {dependent}'","typeGuard":null,"tryCatchPattern":"try:\n    validate_order(...)\nexcept ValidationError as e:\n    print('order violations:\\n' + str(e))  # each line names the misplaced edge","preventionTips":["Insert new crates at their topological position, not the end of the list","Regenerate crates.sh via topological sort of cargo metadata","Never alphabetically re-sort the publish list"],"tags":["release","publish-order","topological-sort","cargo"],"backgroundTag":"invalid-state-transition","analyzedSha":"433685b2024e7bc4c99e1e2e326bcad39b4d9d65","analyzedAt":"2026-09-15T12:24:24.634Z","contentChangedAt":"2026-09-15T12:24:24.634Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}