@cejel/cejel 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -41,14 +41,15 @@ product, and you can falsify it in ten seconds:
41
41
  docker run --rm --network=none -v "$PWD:/w" -w /w -v "$PWD/cejel:/cejel:ro" debian:stable-slim /cejel .
42
42
  ```
43
43
 
44
- **npm.**
44
+ **npm (scoped package).**
45
45
 
46
46
  ```bash
47
- npx @cejel/cejel .
47
+ npx --yes --package @cejel/cejel cejel .
48
48
  ```
49
49
 
50
- > **On the name.** npm rejects the unscoped `cejel` package name as too similar to an
51
- > existing package (`level`). The published package is the scoped `@cejel/cejel`.
50
+ The package is published under the `@cejel` scope while the unscoped name is under npm
51
+ registry review. The installed executable remains `cejel`. For a global install, run
52
+ `npm install --global @cejel/cejel`, then invoke `cejel .`.
52
53
 
53
54
  **GitHub Action** — score every PR and publish the badge:
54
55
 
@@ -70,6 +71,49 @@ Released binaries: `cejel-Darwin-arm64`, `cejel-Linux-x86_64`. A Homebrew tap an
70
71
  remaining architectures are in progress; they are not listed here because they do not exist
71
72
  yet.
72
73
 
74
+ ## Leaderboard
75
+
76
+ This repo ships the [Cejel OSS trust leaderboard](./leaderboard/leaderboard.md): the whole
77
+ corpus scored and published in the open — elite OSS projects, Cejel itself, and the private
78
+ studio monorepo Cejel was built inside — with a per-repository evidence report for every
79
+ row under [`leaderboard/reports/`](./leaderboard/reports/). The board is also hosted at
80
+ [cejel.dev](https://cejel.dev). Every score on this board is produced by the same sealed
81
+ public scorer used by `npx cejel .` — check out the source commit printed in the
82
+ report, run the tool, and you will get this number. A required guard does exactly that for
83
+ every corpus row and compares score, verdict, measured coverage, and evidence. No private
84
+ domain collector contributes to any published score, ours included; nobody is exempt.
85
+
86
+ ### Redaction policy
87
+
88
+ A path is published exactly when the reader can check it. Every public repository on the
89
+ board cites full evidence paths and line numbers, everywhere, in every artifact — a
90
+ certificate whose evidence you cannot open is not evidence. The two private-repository
91
+ entries (this monorepo's own transparency entry, and Cejel's own source sub-package inside
92
+ it) never cite a source path, anywhere, in any field or format — but the finding itself, its
93
+ dimension, status, score, and content hash always survive; only the location is withheld,
94
+ marked uniformly as "path withheld — private repository". Redaction removes a location, never
95
+ a fact: a private repository failing its own check still shows up on its certificate, by
96
+ name. The v3 repository scanner marks B1 and B5 not applicable for every repository,
97
+ including ours; it does not accept structured substrate evidence for them. They remain
98
+ defined for other rubric inputs, while the repository ranking excludes them fail-closed.
99
+ Nobody is scored on evidence the public scanner cannot collect.
100
+
101
+ ### Known false positives (fixed before publishing)
102
+
103
+ Calibrating a rubric against real, elite repositories surfaces mistakes; the record is part
104
+ of the trust claim, not something to bury. Two dimensions produced a punitive score for the
105
+ *absence* of a ratable surface rather than a real weakness, and both are fixed:
106
+ Django was flagged critical on dependency hygiene for using version ranges instead of exact
107
+ pins — normal, deliberate practice for a library, not an app; the rubric now scores
108
+ dependency hygiene against archetype-appropriate norms. OSSF Scorecard — Google's own
109
+ supply-chain security auditing tool — was flagged critical on audit-trail completeness for
110
+ publishing release notes via GitHub Releases instead of a committed `CHANGELOG.md`; a
111
+ repository with no ratable audit surface now returns "insufficient data" (excluded from the
112
+ composite) instead of a punitive score. The board also publishes a measured-coverage
113
+ indicator per row: a score reflects only its *measured* dimensions, and a row scored on fewer
114
+ than half of its applicable dimensions is shown as unranked rather than ordered against
115
+ better-evidenced rows.
116
+
73
117
  ## Usage
74
118
 
75
119
  ```bash
@@ -80,11 +124,18 @@ Scores the current directory with sensible defaults: no flags, no signup, fully
80
124
  Prints a concise terminal certificate and writes to `.cejel/`:
81
125
 
82
126
  - `report.json` — the full structured report
127
+ - `attestation.json` — an unsigned in-toto statement binding the report digest, repository
128
+ revision, rubric, and scored-or-abstained outcome; ready for an external signer
83
129
  - `certificate.html` — a self-contained HTML certificate (no external assets)
84
130
  - `badge.json` — a [shields.io endpoint](https://shields.io/badges/endpoint-badge) payload
85
131
  - `badge.svg` — a static, self-contained trust-score badge
86
132
  - `summary.json` — a compact digest (score, verdict, top findings)
87
133
 
134
+ The attestation is deliberately explicit about its assurance level: Cejel creates the
135
+ statement, but it does not pretend to be an independent signer. Until a customer, reviewer,
136
+ or provenance system signs it, `assurance.status` is `unsigned` and `issuer` is
137
+ `self-generated`. An abstained scan carries only the refusal reason, never a numeric score.
138
+
88
139
  ### Flags
89
140
 
90
141
  - `<path>` — repo to score (default: current directory)
@@ -227,7 +278,7 @@ Add it to an MCP client config:
227
278
  "mcpServers": {
228
279
  "cejel": {
229
280
  "command": "npx",
230
- "args": ["-y", "--package=@cejel/cejel", "cejel-mcp"]
281
+ "args": ["-y", "--package=cejel", "cejel-mcp"]
231
282
  }
232
283
  }
233
284
  }
@@ -238,9 +289,9 @@ The server exposes one tool and two resources:
238
289
  - `scan` — input `{ path, format? }`; scores the repository at `path` and returns the trust
239
290
  cert as JSON (`format: "summary"`, the default, is the compact digest; `format: "json"` is
240
291
  the full report, identical to the CLI's `report.json`).
241
- - `cejel-cejel://last-scan/certificate.html` and `cejel-cejel://last-scan/badge.svg` — the
292
+ - `cejel://last-scan/certificate.html` and `cejel://last-scan/badge.svg` — the
242
293
  HTML certificate and SVG badge for the most recent scan (the URI scheme derives from the
243
- npm package name, `@cejel/cejel` → `cejel-cejel`).
294
+ npm package name).
244
295
 
245
296
  Like the CLI, scoring over MCP is fully offline: no network calls, no telemetry, no signup,
246
297
  and the server writes no files.
@@ -248,10 +299,24 @@ and the server writes no files.
248
299
  ## What "offline" means here
249
300
 
250
301
  Scoring a repo — `cejel .` itself, and the Action's scoring step — makes zero network
251
- calls: no telemetry, no signup, no model call. Fetching the `@cejel/cejel` package the
302
+ calls: no telemetry, no signup, no model call. Fetching the `cejel` package the
252
303
  first time (like any npm-distributed CLI, including this Action's own dependency install)
253
304
  does need network; that's a one-time install cost, not part of the scoring guarantee.
254
305
 
306
+ ## Help validate Cejel
307
+
308
+ Cejel does not collect telemetry. External validation is therefore opt-in and inspectable:
309
+
310
+ - [Report a calibration result](https://github.com/BargLabs/cejel/issues/new?template=calibration.yml)
311
+ when a score, finding, evidence pointer, or refusal is wrong. The form asks permission before
312
+ a correction is added to the public error ledger.
313
+ - [Join a pack design-partner pilot](https://github.com/BargLabs/cejel/issues/new?template=pack-interest.yml)
314
+ for the Quant or Healthcare Pack. Both remain pilot surfaces until their domain-specific
315
+ calibration gates pass.
316
+
317
+ Submit only public or redacted evidence. Never put credentials, proprietary strategy code,
318
+ patient data, or protected health information in a GitHub issue.
319
+
255
320
  ## The public leaderboard: what we redact, what we exclude, and where we were wrong
256
321
 
257
322
  We publish a trust board scoring a corpus of well-known open-source repositories alongside
@@ -278,9 +343,11 @@ separately produced structured report. We neither score you on evidence the publ
278
343
  cannot collect nor award ourselves points for evidence you cannot contest.
279
344
 
280
345
  **Where we were wrong.** Calibrating this rubric against real repositories — and running the
281
- board itself like a stranger would — surfaced seven errors in our own tool, all found before
282
- (or, in one case, on) publication day, and all fixed. We list them because a scoring tool
283
- that has never been wrong is a scoring tool that has not been checked:
346
+ board itself like a stranger would — surfaced the errors below in our own tool, every one found
347
+ by us and every one fixed. The list is its own count; we do not keep a tally in this sentence,
348
+ because a number typed by hand beside a list that grows is exactly the kind of unchecked claim
349
+ this tool exists to catch. We publish them because a scoring tool that has never been wrong is a
350
+ scoring tool that has not been checked:
284
351
 
285
352
  - **Django, scored a false critical on dependency hygiene.** We applied application-shaped
286
353
  expectations to a library. Archetype now gates the dimension.
@@ -315,6 +382,23 @@ that has never been wrong is a scoring tool that has not been checked:
315
382
  - **Version 0.1.1 rejected `--help` and `--version` as unknown flags, and read `-h` as a
316
383
  directory path.** Version 0.1.2 handles both aliases before positional-path parsing and
317
384
  derives its printed version from the package manifest.
385
+ - **We reported a timing side-channel in our own test fixtures.** Pointed at its own
386
+ repository, Cejel's secret-handling dimension flagged a "non-constant-time secret
387
+ comparison" — in string literals inside a test file, the deliberately-insecure example code
388
+ that exists to prove the detector fires. It read a *file*, not a comparison, and reported a
389
+ vulnerability in the test written to catch that vulnerability. Two sub-rules of the same
390
+ dimension held two different private notions of what "production code" meant, and the one
391
+ that had none was the louder. Version 0.1.3 gives every rule one shared, derived answer to
392
+ that question, and reports the real line of a real match or nothing at all.
393
+ - **We fixed the COBOL false-verdict, shipped it, and it was still broken.** An earlier release
394
+ corrected a repository written in a language we cannot read being scored anyway. The fixture
395
+ that proved the fix contained COBOL and nothing else. The first real COBOL repository we
396
+ pointed it at — AWS's mainframe credit-card demo — carried nine incidental shell scripts
397
+ among 329 files, and those nine were enough to short-circuit the abstention path entirely:
398
+ a 99%-COBOL codebase was scored on its deploy scripts and drew a confident `0.0`,
399
+ "Unverified". Every real legacy repository has a deploy script, so the fix that passed every
400
+ test was unreachable for essentially all of them. Recognised source must now be *dominant*,
401
+ not merely present. **A fixture cleaner than reality proves nothing.**
318
402
 
319
403
  Every one was a trust failure produced by *us* — false alarms about other people's code,
320
404
  silent omissions, inconsistent presentation, or a home-only scoring path — and we would