- the
scanoss/pre-commit-hookspre-commit hook - local
scanoss-pyscans and their.scanoss/results.jsonoutput - triage in Code Compare, written into
scanoss.json - the
scanoss/actions-scanGitHub Action and its three policy checks - Dependency-Track as the place your policies, violations, and exceptions live
What replaces what
Earnie also gives the same policies to coding agents over MCP. The legacy chain has no equivalent. See Earnie MCP.
The five phases
Each phase ends with one exit criterion. Don’t start the next phase until you meet it.Phase 1: Connect and scan
Set up your organisation, then connect your Git provider and import the repositories you want to govern. Earnie connects to GitHub, including GitHub Enterprise Server, through the Earnie GitHub App. It connects to GitLab, on gitlab.com or self-managed, with an access token. Import all repositories on Settings → Integrations imports a whole organisation or group in one action. See Workspace setup and Connecting a repository. Exit criterion: every project in scope has one completed full-coverage scan of its default branch, and every connection on Settings → Integrations reads Healthy.Expect a backlog on the first full scan. If you ran the GitHub Action in
delta mode only, nothing has ever assessed your whole repository. The first
full scan reports findings the legacy chain never showed you. That’s not a
regression. Plan time to triage it.
Phase 2: Bring over your identifications
Earnie reads each repository’s committedscanoss.json on every scan. You don’t need to import it.
Earnie records each settled finding in its audit trail and names the
scanoss.json file as the source of the decision. See Component overrides.
Watch the difference between declaring and accepting. In Code Compare, Include declared a component, and that satisfied the undeclared-component check. In Earnie, Confirm match records that the match is real, and the finding still counts towards your policies. A copyleft policy still catches a confirmed GPL component. Only Mark original removes a finding from the gate, and it means “this is our own code”, not “we accept this component”. To accept a real component that a policy flags, use a Policy Approval, covered in phase 3.
Triage what remains in the Review Workspace. In Components mode, Bulk decide settles every open file of a component at once.
Exit criterion: no project shows findings your team considers already decided, and your reviewers agree that what’s left open is real work.
Phase 3: Rebuild your policies
Rebuild your Dependency-Track policies as Earnie policies, using the equivalence table below. There’s no automatic Dependency-Track importer, because the fields, operators, and expression languages all differ. Start from Earnie’s built-in templates where you can. They cover the rules most teams gate on, and they’re quicker to review than a hand-written rule:
Where your organisation has cryptography or AI provenance enabled, more templates are available. See Cryptography and AI provenance.
A policy belongs to your organisation, and you attach it to the projects it should gate. A per-repository rule becomes a per-project attachment. You can’t override a policy for one project. To vary the rule itself, clone it. See Where a policy applies.
Exit criterion: for each project, Earnie’s gate agrees with the Dependency-Track verdict on the same code, or your policy owner has written down and accepted every difference. To compare, use the read-only policy commands. They change nothing and never re-evaluate:
Phase 4: Switch the gate
In one pull request per repository:- Add Earnie as a required status check.
- Remove the three
Policy Check: *required checks. - Delete the GitHub Action workflow and its Dependency-Track upload step.
On a pull request, the findings the pull request introduced decide the check. The summary comment lists findings the default branch already carried, but they don’t hold the pull request.
A neutral check means “not comparable”, not “pass”. It appears when Earnie has no completed scan of the default branch to compare against (No baseline to compare against; result is not conclusive), or when the default branch has moved since the pull request was scanned (Base branch moved; result is not conclusive). Push a commit, or re-run the scan, to get a real answer. See When the branch you’re merging into moves.
An approval updates the pull request without a push. When an Admin grants a Policy Approval, Earnie updates that scan’s check and comments straight away. Earnie doesn’t re-scan anything, so the check turns green only if the approval cleared every violation holding the gate. Revoking an approval works the same way in reverse.
On GitLab, Earnie can enforce a block only where your group’s plan allows it. See Merge blocking depends on your GitLab plan.
Exit criterion: in each repository, one pull request has merged with Earnie as the only required policy check, no workflow still runs
scanoss/actions-scan, and you have checked any pull-request filters against the repositories where Earnie is required.
Phase 5: Move developer tooling
Install the CLI wherever developers or pipelines need it:earnie auth login. See Earnie CLI.
Replace the pre-commit hook. If your repositories use the pre-commit framework, replace the scanoss/pre-commit-hooks entry in .pre-commit-config.yaml:
pre-commit install --install-hooks and pre-commit run earnie once, so the framework downloads and verifies the pinned CLI before the first commit. Without the framework, run earnie hook install in each checkout instead.
Either way, the hook runs earnie scan staged --format hook. It checks what you’ve staged in Git, not your working files, and creates a Self-check. A Self-check never adds findings or changes a project’s posture.
By default, the hook reports a technical failure but lets the commit through. Technical failures include a network or authentication error and hitting the 60-second time limit. An Operator or Admin can make a technical failure stop the commit instead, at Project → Scan Configuration → Pre-commit technical failures. See When the check can’t run.
Optionally, connect coding agents.
earnie mcp setup connects Claude Code, Cursor, VS Code, or Codex to Earnie, so agents follow your policies while they write code. See Connecting an AI client.
Finally, uninstall Code Compare.
Exit criterion: no repository’s developer instructions still mention scanoss/pre-commit-hooks, Code Compare, or scanoss-py, and a test commit in each repository produces a Self-check in Earnie.
Dependency-Track to Earnie policies
This table covers the fifteen condition subjects of Dependency-Track’s classic policy model. It isn’t a complete account of every way a Dependency-Track instance can express a policy. In particular, Dependency-Track 5.0 adds expression-based policies, which no row below covers. Read each one and rewrite it. Earnie policies also use CEL, but the two object models differ, so you can rarely copy an expression across unchanged. List the policies in your own Dependency-Track instance first, and note its version. Use this table to translate what you find, not to decide what exists.
Earnie also has fields that Dependency-Track lacks, which you may want to use in the rebuild: Dual Licensed, Patent Clauses, License Data Source, Component Status, Match Percentage, the finding’s State and Domain, and the whole cryptography and AI provenance field groups where enabled.
earnie policy show <policy-slug> prints the exact expression a policy runs.
Violation states and exceptions
Start from what your pipeline does today. The legacy GitHub Action failed on any Dependency-Track violation, whatever its state.INFO, WARN, and FAIL all turned the check red, so in that pipeline every violation blocks.
If your CI read Dependency-Track’s API or project badge directly instead, it could tell the states apart and gate on FAIL alone. Check which setup you’re replacing before you map anything.
No rule translates one into the other. Choosing an Earnie action decides how your gate behaves, so make the choice with your policy owner:
Whichever you choose, write down the mapping and the reason for it. Your build behaviour changes either way, and you’ll need the reason when the first unexpected green check appears.
A Policy Approval records a justification category from CISA’s VEX categories, a written justification, the approver, an optional expiry, and any later revocation. Requesting an approval never changes the verdict. Only an Admin’s decision does. Each approval covers one finding. See Request an approval.
Every scan also records the exact revision of each policy that judged it, so you can still see why a check failed months later.
What changes for your team
- One check, not three. Branch protection names Earnie instead of the three
Policy Check: *entries. - Decisions carry a name, a time, and a reason. A
scanoss.jsonentry recorded none of those. Earnie records all three for every triage decision and Policy Approval, in the finding’s audit trail. See Audit log.earnie scan audit <scan-id>prints a scan’s own trail: its submission, its gate, approvals that moved it, and its publications to the pull request. - You fix findings in Earnie, not in files. Instead of pasting a
scanoss.jsonsnippet and pushing, you decide the finding or request an approval in Earnie, and the pull request updates without a push. A fix to the code itself still needs a push before Earnie can scan it. - No local results file. Earnie doesn’t write
.scanoss/results.json. The hook prints a short summary and a link, and the results are in Earnie. Remove.scanoss/from the repository and from.gitignore. - No upload to Dependency-Track. If other tools also feed Dependency-Track and you want to keep it, upload Earnie’s SBOM yourself. Run
earnie export --bom-format cyclonedx --output sbom.jsonin a pipeline step, then upload the file with your own step. Dependency-Track’s project versions have no equivalent. One Earnie project is one codebase for its whole life. - Code Compare is retired as a scanner. The CLI sends source to your Earnie environment, and scanning and policy evaluation run there. By design, there’s no offline mode and no local policy evaluation.
- Inline comments are limited. Earnie comments only on lines the pull request added, from Medium severity up, and at most ten per review by default. Findings it can’t place on a line go in the summary comment. See Inline comments on the changed lines.
- Publishing is separate from the verdict. If GitHub or GitLab rejects Earnie’s write, the scan’s verdict still stands and the scan page offers Retry publication. Retrying never re-runs the scan.
- Feedback appears on the pull request and in Earnie. Earnie doesn’t send policy-violation notifications by email or chat. If you relied on Dependency-Track’s notifications, plan a replacement.
Before you start
Check these against your setup before phase 1:- CWE policies can’t be rebuilt yet. See the table.
- Policy migration is manual. There’s no Dependency-Track policy importer.
- Approvals are per finding. A component matched in many files needs an approval for each finding a policy flags.
- No sub-path or dependency-scope setting. In a monorepo, narrow a project’s scope with skip patterns.
bom.ignoreisn’t applied. Repositories that rely on it will see those matches as findings to decide.