pqcheck 0.16.19 → 0.16.20

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
@@ -8,7 +8,7 @@
8
8
  [![npm downloads](https://img.shields.io/npm/dm/pqcheck.svg?style=flat-square&color=06b6d4)](https://www.npmjs.com/package/pqcheck)
9
9
  [![license](https://img.shields.io/npm/l/pqcheck.svg?style=flat-square&color=06b6d4)](./LICENSE)
10
10
 
11
- > **Latest: v0.16.19** — `pqcheck setup` now COMPOSES with an existing Claude Code `statusLine.command` (e.g., PinnedAI's) via a new `--prepend=<cmd>` flag on `cipherwake-statusline`. Both tools' badges render in the single statusLine slot. Previously, Cipherwake politely skipped if any prior statusLine existed which meant you'd only ever see one tool's badge. Now: composed wrap with 5s timeout + graceful degradation on prepend failure + idempotent re-runs. [Full changelog →](./CHANGELOG.md)
11
+ > **Latest: v0.16.20** — `pqcheck deploy-check --ai` now adds an absolute posture grade (A+ F, strict SSL-Labs rubric over CSP / HSTS / X-Frame-Options / X-Content-Type-Options / Referrer-Policy / Permissions-Policy + `x-powered-by` leak) alongside the existing drift-only `ship_decision`. Grade D/F sets `posture_decision=block` so AI coders gate posture failures even on a clean drift. Adds `scope_note` (drift pass functional verification) and surfaces ready-to-paste fix snippets (Next.js / vercel.json / Express). Watched-domain monitoring also gains `posture_regression` + `cert_expiring` alerts. [Full changelog →](./CHANGELOG.md)
12
12
 
13
13
  ## Two ways to use it
14
14
 
package/bin/pqcheck.js CHANGED
@@ -495,6 +495,22 @@ async function runOneScan({ domain, format, quiet, threshold, webhookUrl, multi,
495
495
  }
496
496
  }
497
497
 
498
+ // R86 — surface absolute posture grade + remediation alongside drift verdict.
499
+ // The grade= field carries DBR grade; posture_grade= is the new absolute
500
+ // posture (A+/A/B/C/D/F based on header presence/strength).
501
+ // posture_decision separates the absolute-state routing signal from the
502
+ // drift-based ship_decision so a weak-but-unchanged site gets a review
503
+ // nudge distinct from drift.
504
+ const posture = report.posture || null;
505
+ const postureFields = posture ? {
506
+ posture_grade: posture.grade,
507
+ posture_score: posture.score,
508
+ posture_decision: posture.decision,
509
+ posture_missing: (posture.missing || []).join(",") || "none",
510
+ posture_leaks: (posture.info_leaks || []).join("; ") || "none",
511
+ posture_findings_count: (posture.findings || []).length,
512
+ posture_fixes_count: (posture.fixes || []).length,
513
+ } : {};
498
514
  console.log(formatAiFooterBlock({
499
515
  status: shipDecision,
500
516
  domain,
@@ -509,6 +525,13 @@ async function runOneScan({ domain, format, quiet, threshold, webhookUrl, multi,
509
525
  findings_critical: findings.filter((f) => severityRank(f.severity) === 4).length,
510
526
  scanned_at: new Date().toISOString(),
511
527
  advisory_only: "true",
528
+ // R85 (2026-06-03) — scope honesty disclaimer. pass = trust surface
529
+ // stable, NOT app functionality. Agents that follow the protocol must
530
+ // see this so they don't announce a deploy whose signup is broken
531
+ // (the exact bug the user reported on socialideagen 2026-06-02).
532
+ scope: "trust_surface_drift",
533
+ scope_note: "ship_decision=pass means public trust surface stable. Does NOT verify app functionality. Pair with functional checks (e.g. Playwright e2e) for full deploy safety.",
534
+ ...postureFields,
512
535
  }));
513
536
  console.log("");
514
537
 
@@ -3400,6 +3423,20 @@ async function runTrustDiffCommand(args) {
3400
3423
  console.log(color("dim", " Run with --verbose to see all verified signals."));
3401
3424
  }
3402
3425
 
3426
+ // R86 — posture grade + remediation alongside drift. trust-diff API returns
3427
+ // result.current_report which contains the full scan; if so, read posture
3428
+ // from it. Otherwise gracefully omit (older API responses without posture).
3429
+ const currentReport = result.current_report || result.report || null;
3430
+ const posture = currentReport?.posture || null;
3431
+ const postureFields = posture ? {
3432
+ posture_grade: posture.grade,
3433
+ posture_score: posture.score,
3434
+ posture_decision: posture.decision,
3435
+ posture_missing: (posture.missing || []).join(",") || "none",
3436
+ posture_leaks: (posture.info_leaks || []).join("; ") || "none",
3437
+ posture_findings_count: (posture.findings || []).length,
3438
+ posture_fixes_count: (posture.fixes || []).length,
3439
+ } : {};
3403
3440
  console.log(formatAiFooterBlock({
3404
3441
  status: shipDecision,
3405
3442
  domain,
@@ -3417,6 +3454,13 @@ async function runTrustDiffCommand(args) {
3417
3454
  quota_limit: result.quota?.monthly_limit ?? "",
3418
3455
  scanned_at: new Date().toISOString(),
3419
3456
  advisory_only: "true",
3457
+ // R85 — scope honesty disclaimer (per build brief 2026-06-03).
3458
+ // ship_decision=pass means trust surface stable, NOT app functions.
3459
+ // Agents must see this so they don't announce a deploy whose signup
3460
+ // is broken (the exact bug socialideagen had on 2026-06-02).
3461
+ scope: "trust_surface_drift",
3462
+ scope_note: "ship_decision=pass means public trust surface stable. Does NOT verify app functionality. Pair with functional checks for full deploy safety.",
3463
+ ...postureFields,
3420
3464
  }));
3421
3465
  console.log("");
3422
3466
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pqcheck",
3
- "version": "0.16.19",
3
+ "version": "0.16.20",
4
4
  "description": "Deploy gate for AI-coded web apps. `pqcheck deploy-check --ai` returns ship_decision=pass|review|block for Claude Code / Cursor / Copilot / Aider to gate deploys before they ship. Anonymous, no signup, free for first use.",
5
5
  "keywords": [
6
6
  "ai-coder",