@cejel/cejel 0.4.9 → 0.4.11

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/dist/mcp/index.js CHANGED
@@ -5,20 +5,20 @@ import {
5
5
  renderWitanBadgeSvg,
6
6
  renderWitanHtmlReport,
7
7
  runCejelScan
8
- } from "../chunk-TUUNJP27.js";
9
- import "../chunk-IHT7B6L7.js";
8
+ } from "../chunk-UBCIGOIP.js";
9
+ import "../chunk-63XQDYQ5.js";
10
10
  import {
11
11
  ZodFirstPartyTypeKind,
12
12
  ZodOptional,
13
13
  external_exports,
14
14
  objectType
15
- } from "../chunk-GKYTLWQK.js";
15
+ } from "../chunk-FSMZV3Y6.js";
16
16
  import {
17
17
  __commonJS,
18
18
  __export,
19
19
  __toESM,
20
20
  init_esm_shims
21
- } from "../chunk-PTZU6G4E.js";
21
+ } from "../chunk-O3MHSK25.js";
22
22
 
23
23
  // node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js
24
24
  var require_code = __commonJS({
@@ -3,18 +3,18 @@ import { createRequire as __cejelCreateRequire } from 'node:module';
3
3
  const require = __cejelCreateRequire(import.meta.url);
4
4
  import {
5
5
  listCejelLlmPackFiles
6
- } from "../../chunk-IN2LPGGU.js";
6
+ } from "../../chunk-M6YYPJSN.js";
7
7
  import {
8
8
  execGit
9
- } from "../../chunk-IHT7B6L7.js";
9
+ } from "../../chunk-63XQDYQ5.js";
10
10
  import {
11
11
  require_typescript
12
- } from "../../chunk-IQ42TE5H.js";
12
+ } from "../../chunk-RH6FKREX.js";
13
13
  import {
14
14
  __toESM,
15
15
  init_esm_shims,
16
16
  readRepoText
17
- } from "../../chunk-PTZU6G4E.js";
17
+ } from "../../chunk-O3MHSK25.js";
18
18
 
19
19
  // src/packs/d-series/index.ts
20
20
  init_esm_shims();
@@ -3,15 +3,15 @@ import { createRequire as __cejelCreateRequire } from 'node:module';
3
3
  const require = __cejelCreateRequire(import.meta.url);
4
4
  import {
5
5
  external_exports
6
- } from "../../chunk-GKYTLWQK.js";
6
+ } from "../../chunk-FSMZV3Y6.js";
7
7
  import {
8
8
  require_typescript
9
- } from "../../chunk-IQ42TE5H.js";
9
+ } from "../../chunk-RH6FKREX.js";
10
10
  import {
11
11
  __toESM,
12
12
  init_esm_shims,
13
13
  readRepoText
14
- } from "../../chunk-PTZU6G4E.js";
14
+ } from "../../chunk-O3MHSK25.js";
15
15
 
16
16
  // src/packs/decision-contracts/index.ts
17
17
  init_esm_shims();
@@ -0,0 +1,78 @@
1
+ # Calibration record authority in this repository
2
+
3
+ `docs/calibration/**` is treated as an authority path: B10, the cycle-13 freeze and the
4
+ disclosure boundary all rest on records kept there. Until 2026-09-16 nothing in this repository
5
+ could establish that authority. This page says what changed, and what did not.
6
+
7
+ ## What was measured, 2026-09-16
8
+
9
+ Every commit that has ever touched `docs/calibration/` in this repository, with its git signature
10
+ status (`%G?`: `G` good signature from a listed key, `E` signed by a key this repository does not
11
+ list, `N` unsigned):
12
+
13
+ | commit | `%G?` | subject |
14
+ |---|---|---|
15
+ | `209a058` | E | calibration: publish the v22 detection-recall measurement record (#315) |
16
+ | `ebf4a33` | E | docs(calibration): v17 holdout reveal + hash-conventions doc (#222) |
17
+ | `787b218` | N | docs: record orphaned v0.3.0 provenance |
18
+ | `5afebfe` | N | docs: clarify v0.3.0 tag fast-forward |
19
+ | `bce29c1` | N | docs: record v0.3.0 tag correction |
20
+ | `307330e` | N | docs: preserve terminal GO binding |
21
+ | `f085908` | N | docs: disclose npm provenance gap |
22
+ | `2515814` | E | docs(evidence): free-core v50 multiple-comparisons disclosure (#41) |
23
+
24
+ **Five unsigned, three signed by an unlisted key, none verifiable.** The repository shipped no
25
+ allowed-signers file and no check read a signature, so the `--merge`-not-`--squash` discipline
26
+ that protects a calibration signature preserved something no reader could confirm: `209a058`,
27
+ merged carefully to keep its signature, reads exactly as `ebf4a33`, which was squashed.
28
+
29
+ This is not degradation from a working state. cejel has never produced a verifiable calibration
30
+ signature. Stating it plainly matters because "signed" and "unverifiable" look identical to anyone
31
+ who does not run `%G?` by hand, and a record whose authority cannot be checked is a record, not an
32
+ attestation.
33
+
34
+ ## What the gate does
35
+
36
+ `scripts/check-calibration-signatures.mjs`, run on every pull request that touches a guarded path,
37
+ requires each commit touching `docs/calibration/**` or root `FREEZE.md` to carry a signature from a key in
38
+ `docs/security/allowed-signers`. It fails closed: a missing or key-less allowed-signers file is a
39
+ failure rather than a skip, because "nobody may sign" must never read the same as "anybody may".
40
+ `E` fails exactly as `N` does — accepting `E` would have passed the whole history above and
41
+ reported success.
42
+
43
+ A squash merge substitutes GitHub's web-flow key and produces `E`. Merge calibration pull requests
44
+ with `--merge`.
45
+
46
+ ## What the gate does not do
47
+
48
+ It does not reach backwards, and no amount of later signing can make the eight commits above
49
+ verifiable. Records that predate the gate carry the authority of the process that produced them
50
+ and of this disclosure — not of a signature anyone can check. A document citing one of them as an
51
+ attestation is overstating it, and should cite this page alongside.
52
+
53
+ The gate also says nothing about *content*. It establishes that a listed key signed the commit, and
54
+ nothing about whether the measurement in it is sound. Provenance is not correctness.
55
+
56
+ Marker supersession uses the same verifier; see [measurement freeze](../measurement-freeze.md) for the chain, parent-pinned allowlist, and operator transition commands.
57
+
58
+ ## Allowlist bootstrap provenance — reverified 2026-09-16
59
+
60
+ The initial `docs/security/allowed-signers` file was introduced by
61
+ `77fd3d27850fa928bcea70ba5fae622e8bda4465`, the squash merge of #318. With the
62
+ repository's SSH allowlist explicitly configured, local Git reports `%G?=E` and
63
+ key id `B5690EEEBB952194` (GitHub web-flow). This is not an operator SSH signature
64
+ verifiable under that allowlist. `E` describes this verification environment;
65
+ it does not claim that no one can cryptographically verify GitHub's signature.
66
+
67
+ The forward transition check trusts the parent commit's allowlist. That blocks a
68
+ transition from adding its own key in the same commit, but it does not independently
69
+ establish the identity or authorization of the initial enrolled key. Initial key
70
+ admission remains a bootstrap trust decision, separate from the eight historical
71
+ calibration records listed above.
72
+
73
+ The operator may re-establish that decision with an explicitly reviewed enrollment
74
+ acknowledgement, recording how the key was independently authenticated and preserving
75
+ an operator-signed commit without squashing. A later signature proves possession
76
+ of the signing key; it does not by itself establish the signer's identity or
77
+ retroactively turn `77fd3d2` into an operator-signed admission. This proposal only
78
+ discloses the boundary. It neither changes the allowlist nor signs an acknowledgement.
@@ -0,0 +1,18 @@
1
+ # Withdrawn Cejel issuances. One line per withdrawal:
2
+ #
3
+ # <report-sha256> <YYYY-MM-DD> <one sentence saying why>
4
+ #
5
+ # The digest is the sha256 of the exact report.json bytes the withdrawn issuance countersigned —
6
+ # the same value `cejel verify` prints and the same value the issuance carries as its report.json
7
+ # subject. `cejel verify` reports a listed digest as REVOKED and exits nonzero.
8
+ #
9
+ # APPEND-ONLY. A line here is never removed, edited, or reordered: a withdrawal that could be
10
+ # quietly reversed is not a withdrawal. Correcting a mistaken entry means appending a second line
11
+ # that says so, not deleting the first. This is enforced by
12
+ # src/__tests__/issuance-revocations-append-only.test.ts, which pins the exact bytes below.
13
+ #
14
+ # This file is EMPTY of entries, and it ships empty on purpose. The absence of revocations is a
15
+ # statement a reader can check, not an omission they have to infer. It ships in the npm package and
16
+ # in every release tarball, so the check needs no network call.
17
+ #
18
+ # ---- entries below this line ----
@@ -0,0 +1,34 @@
1
+ # The allowed-signers file for Cejel ISSUANCE countersignatures. One line per signer:
2
+ # <principal> <keytype> <base64-key> [comment], the format `ssh-keygen -Y verify -f` reads.
3
+ #
4
+ # This is a DIFFERENT authority from docs/security/allowed-signers, which governs calibration
5
+ # records. Issuance signatures carry the namespace `cejel-issuance`; calibration authority uses its
6
+ # own. A key listed in one file is not thereby listed in the other, and a signature made under one
7
+ # namespace does not verify under the other.
8
+ #
9
+ # Principal: issuance@barglabs.ai
10
+ #
11
+ # This file names no key on purpose. Admitting one is an authority decision and belongs to the
12
+ # operator, not to an agent: the key listed here is what a relying party will thereafter accept as
13
+ # Barg Labs' issuing hand. `cejel verify` fails closed while this file is empty — a signature made
14
+ # by an unlisted key is reported as "signed by an unlisted key", never as valid.
15
+ #
16
+ # An agent must not write a key into this file.
17
+ #
18
+ # SUPPORTED KEY TYPES: `cejel verify` verifies `ssh-ed25519` only. Any other key type — including
19
+ # the FIDO/hardware-backed `sk-ssh-ed25519@openssh.com` — is reported as NOT VERIFIED rather than
20
+ # valid, and must be checked with OpenSSH directly (see docs/issuance.md). Before enrolling a key
21
+ # here, confirm its type: enrolling one cejel cannot verify ships a certificate whose signature
22
+ # most readers cannot check with the tool they were handed.
23
+ #
24
+ # To verify an issuance with OpenSSH alone, no Cejel involved:
25
+ #
26
+ # ssh-keygen -Y verify -f docs/security/issuer-signers -I issuance@barglabs.ai \
27
+ # -n cejel-issuance -s issuance.json.sig < issuance.json
28
+ #
29
+ # Key rotation is recorded here, in place, with dates: a retired key keeps its line with a comment
30
+ # giving the date it stopped being used, so a reader can still check an issuance made while it was
31
+ # current. A line is never silently deleted.
32
+ #
33
+ # This file ships in the npm package and in every release tarball, so a relying party holds the
34
+ # list without a network call.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cejel/cejel",
3
- "version": "0.4.9",
3
+ "version": "0.4.11",
4
4
  "mcpName": "io.github.BargLabs/cejel",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -31,6 +31,7 @@
31
31
  "type": "git",
32
32
  "url": "git+https://github.com/BargLabs/cejel.git"
33
33
  },
34
+ "packageManager": "pnpm@9.0.0",
34
35
  "type": "module",
35
36
  "bin": {
36
37
  "cejel": "dist/index.js",
@@ -43,21 +44,13 @@
43
44
  "files": [
44
45
  "dist",
45
46
  "README.md",
46
- "LICENSE"
47
+ "LICENSE",
48
+ "docs/security/issuer-signers",
49
+ "docs/security/issuer-revocations"
47
50
  ],
48
51
  "engines": {
49
52
  "node": ">=18"
50
53
  },
51
- "devDependencies": {
52
- "@modelcontextprotocol/sdk": "^1.0.0",
53
- "@types/node": "^25.9.1",
54
- "postject": "^1.0.0-alpha.6",
55
- "tsup": "^8.0.0",
56
- "tsx": "^4.0.0",
57
- "typescript": "^5.5.0",
58
- "vitest": "^2.0.0",
59
- "zod": "^3.23.0"
60
- },
61
54
  "scripts": {
62
55
  "build": "tsup",
63
56
  "build:sea-js": "tsup --config tsup.public-sea.config.ts",
@@ -71,9 +64,21 @@
71
64
  "gate:d6": "pnpm run build && node scripts/d6-precision-gate.mjs",
72
65
  "validate:distribution": "node scripts/validate-distribution-metadata.mjs",
73
66
  "pnpm:devPreinstall": "node scripts/assert-dev-environment.mjs --phase=preinstall",
67
+ "prepublishOnly": "pnpm run build",
68
+ "prepack": "pnpm run build",
74
69
  "pretest": "node scripts/assert-dev-environment.mjs --phase=verify",
75
70
  "dev": "tsx src/index.ts",
76
71
  "typecheck": "tsc --noEmit -p tsconfig.json",
77
72
  "test": "vitest run"
73
+ },
74
+ "devDependencies": {
75
+ "@modelcontextprotocol/sdk": "^1.0.0",
76
+ "@types/node": "^25.9.1",
77
+ "postject": "^1.0.0-alpha.6",
78
+ "tsup": "^8.0.0",
79
+ "tsx": "^4.0.0",
80
+ "typescript": "^5.5.0",
81
+ "vitest": "^2.0.0",
82
+ "zod": "^3.23.0"
78
83
  }
79
- }
84
+ }