Skip to content
Code Recycle

Component · for humans & their agents

Submission Gates

verified · first-partyactively maintained$0 during beta (was $149)

Access to a repository is not ownership of it, and a marketplace that conflates them sells someone else's work under a stranger's payout account.

by saltyhash · Code Recycle admin

Get it free — beta

Every claim on this page is refundable if it is untrue — refund policy.

Building it yourself: ~6.7h of agent time across about 8 attempts. Your credits are already paid for, so that feels free — but they are rivalrous: those are hours not spent on the part only you can build. And this one fails quietly when it is wrong, so the attempt that looks finished may not be. $149.

133 tests. Pure functions plus a scanner, zero runtime dependencies, ESM. You supply the git

The design rule everything here follows

A failure to look must never be indistinguishable from having looked and found nothing.

That single sentence is what the gates are for. Every one of them has a state where the check could not run — a shallow clone, a failed history walk, an unresolvable dependency, an unreachable repo — and in every case the naive implementation records the same thing it would record for a clean result: no findings.

That is worse than not scanning at all, because it produces a scan row that says the submission was reviewed.

The five gates

### 1. A shallow clone is not history

CI checkouts default to depth 1. Scan a shallow clone for leaked secrets and you have scanned one commit while reporting that you scanned the repository. This **refuses to claim history was scanned** on a truncated checkout, and a failed history walk is recorded as a failure rather than as a clean history.

### 2. Count what you actually walked

The real commit count is recorded, and zero when history was not scanned — which fails closed downstream instead of reading as a tiny, clean repo. A secret that is gone from the working tree but still in the log is marked history-only, because it is still extractable and still needs rotating.

### 3. Declared is not detected

The licence a submitter claims and the licence actually found in the repo are reported separately, so a disagreement between them is catchable rather than silently resolved. An unrecognised licence body is undefined — never guessed permissive. No LICENSE file and no declared licence blocks the submission.

### 4. Unresolved is not permissive

Dependencies that cannot be resolved stay in the list without a licence, rather than being dropped. A resolution failure yields all-unknown rather than an empty list — the difference between "this has no copyleft dependencies" and "we could not tell," which look identical once the unresolved entries are silently discarded.

One copyleft dependency under a permissive top-level licence is caught, which is the common real case: the repo says MIT and something three levels down does not.

### 5. Every IO failure degrades to null

When the repo cannot be fetched, the scanner returns null and **no scan row is written at all** — rather than an empty result that reads as a pass.

Two more layers: consent, and the pipeline

consent — an agent prepares a submission, a human publishes it. Approval binds to a content hash, so a draft that changes between the moment a human read it and the moment they clicked is no longer approved. A price change after approval voids the approval, because the number was the thing they were agreeing to.

pipeline — three doors (web form, editor tool, phone link), one gate. The reasoning is worth stating: hosts disagree about approval, and several editors let a user auto-approve every tool call, so a local "allow" is evidence that a tool ran, not that a human read a price. The binding check therefore sits on the server, where no client setting can turn it off. A door may narrow what the pipeline offers; it can never widen it.

These two are namespaced, and that is a finding

consent and pipeline both export approve, reject and publish — the same verbs at different levels. Flattening them into one barrel silently shadows one with the other, and the caller gets whichever resolved last: a bug with no error message.

That was discovered during packaging, by a test that expected an approval and got a pending review. They are exported as namespaces:

  import { consent, pipeline } from "@amos-products/submission-gates";

The primitives (gates, scanner, dependency licences) stay flat.

Why the scanner is separate from the gates

The gates consume evidence; the scanner is the only thing permitted to produce it. That boundary exists because an adversarial review of an earlier version found two ways to publish on assertions rather than findings. Evidence is server-produced and commit-bound; a submitter cannot hand you a verdict.

What this does NOT do

No malware or vulnerability detection — run your existing security scan alongside; these are the questions it does not ask.

No git, network or filesystem access of its own: you supply the calls. No payout, identity verification or KYC. No licence compatibility analysis — it tells you what is present, not whether the combination is lawful for your use.

Verified

133 tests across the gates, scanner, dependency licences, consent and pipeline: shallow-clone refusal, failed history walks, commit counting, history-only secret hits, declared-versus-detected licence disagreement, unrecognised licence bodies, missing LICENSE, unresolvable dependencies, transitive copyleft under a permissive root, IO failure returning null, approval bound to a content hash, a price change voiding approval, and no path that auto-publishes.

Not covered: no test runs against a real git remote or a real registry. The ownership check verifies a token you place; it cannot prove authorship, and nothing here detects code copied from elsewhere.

01Capabilities

Does

  • + Rights-aware data handling
  • + Security triage
  • + Compliance audit

Doesn’t

  • No exclusions declared

02Requirements & stack

Depends on

No declared dependencies

Credentials needed

None declared

Stack

03Community

No endorsements yet

No verified confirmations yet — be the first.

Confirmations come from verified purchasers, installers, vetted reviewers, or an installation outcome your org reported through the agent tools. They grade quality — security is verified separately, and community votes can never override the security gate.

Open an issue

Sign in to confirm — weight comes from verified usage, not vote count.

Nobody has reported anything yet — a success counts as a report too.

04Trust Passport

Full passport →
–/100

0/0 automated components pass. An automated score is never a security guarantee.

✓ Verified · first-partyreviewed Sep 20, 2026 · re-verification due Dec 19, 2026
  • publisher identity Publisher status verified; 1 verification(s) on file
  • malicious pattern scan No known malicious-behavior patterns across 16 source file(s) plus listing text
  • capability contract All 0 observed capability reference(s) match the declared manifest
  • agent safety scan No injection patterns in agent-readable content
  • provenance No release signature or provenance attestation
  • behavioral sandbox Not performed in this environment — requires the production isolated runner (docs/sandbox-requirements.md). No untrusted code is ever executed on the application host.

Every listing must pass this review before it can be sold, and it is re-run on every release. Verification describes what we checked — it is not a guarantee that the software is safe.

VersionChannelReleasedNotes
0.1.0stableAug 11, 2026Initial extraction.