@neurcode/action 0.3.0-rc.6 → 0.3.0-rc.7

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
@@ -49,7 +49,7 @@ jobs:
49
49
  - uses: actions/checkout@v5
50
50
  with:
51
51
  fetch-depth: 0
52
- - uses: sujit-jaunjal/neurcode-actions@v0.3.0-rc.5
52
+ - uses: sujit-jaunjal/neurcode-actions@v0.3.0-rc.7
53
53
  ```
54
54
 
55
55
  That is enough for the standalone report. Runtime admission provenance activates only when a PR includes `.neurcode-admission/*.json`.
@@ -184,7 +184,7 @@ Self-attested provenance is a claim by the PR author, not cryptographic proof an
184
184
  ## Strict Self-Attested Mode
185
185
 
186
186
  ```yaml
187
- - uses: sujit-jaunjal/neurcode-actions@v0.3.0-rc.5
187
+ - uses: sujit-jaunjal/neurcode-actions@v0.3.0-rc.7
188
188
  with:
189
189
  policy: strict_self_attested
190
190
  no_record_strict: 'false'
@@ -214,7 +214,7 @@ The harness runs controlled OSS-style PR scenarios, scores the report as ACTIONA
214
214
 
215
215
  ## Preserved Installation Path
216
216
 
217
- The `sujit-jaunjal/neurcode-actions@v0.2.4` release remains available and untouched. `v0.3.0-rc.5` is the current rehearsal ref for runtime admission bridge behavior after live Airflow fork rehearsal.
217
+ The `sujit-jaunjal/neurcode-actions@v0.2.4` release remains available and untouched. `v0.3.0-rc.7` is the current rehearsal ref for Enterprise Reliability Closure V1.
218
218
 
219
219
  ## Adoption Bridge Docs
220
220
 
package/dist/index.js CHANGED
@@ -40139,7 +40139,7 @@ exports.parseCliShipRunsJsonPayload = parseCliShipRunsJsonPayload;
40139
40139
  exports.parseCliShipResumeJsonPayload = parseCliShipResumeJsonPayload;
40140
40140
  exports.parseCliShipAttestationVerifyJsonPayload = parseCliShipAttestationVerifyJsonPayload;
40141
40141
  exports.parseCliCompatJsonPayload = parseCliCompatJsonPayload;
40142
- exports.CLI_JSON_CONTRACT_VERSION = '2026-06-18';
40142
+ exports.CLI_JSON_CONTRACT_VERSION = '2026-06-19';
40143
40143
  /** Compare YYYY-MM-DD contract stamps; returns null when either side is unparsable. */
40144
40144
  function compareCalendarContractVersion(left, right) {
40145
40145
  const parse = (value) => {
@@ -40166,7 +40166,7 @@ __exportStar(__nccwpck_require__(5733), exports);
40166
40166
  __exportStar(__nccwpck_require__(9349), exports);
40167
40167
  exports.RUNTIME_COMPATIBILITY_CONTRACT_ID = 'neurcode-runtime-compatibility';
40168
40168
  exports.RUNTIME_COMPATIBILITY_CONTRACT_VERSION = '2026-04-04';
40169
- exports.RUNTIME_COMPATIBILITY_MANIFEST_VERSION = '2026-06-18.1';
40169
+ exports.RUNTIME_COMPATIBILITY_MANIFEST_VERSION = '2026-06-19.1';
40170
40170
  exports.RUNTIME_COMPATIBILITY_MANIFEST_SCHEMA_VERSION = 1;
40171
40171
  /**
40172
40172
  * Runtime Admission contract (Phase A — Provenance Core). Additive: surfaces a
@@ -40201,9 +40201,9 @@ const RUNTIME_COMPATIBILITY_MANIFEST = {
40201
40201
  id: 'current',
40202
40202
  channel: 'current',
40203
40203
  versions: {
40204
- cli: '0.19.0',
40205
- action: '0.3.0-rc.6',
40206
- api: '0.3.0',
40204
+ cli: '0.19.1',
40205
+ action: '0.3.0-rc.7',
40206
+ api: '0.3.1',
40207
40207
  },
40208
40208
  notes: 'Current release train validated in monorepo CI.',
40209
40209
  },
@@ -40731,6 +40731,7 @@ const ADAPTERS = [
40731
40731
  'cursor-mcp',
40732
40732
  'vscode-extension',
40733
40733
  'github-action',
40734
+ 'neurcode-cli',
40734
40735
  ];
40735
40736
  const LANGUAGES = [
40736
40737
  'typescript', 'javascript', 'python', 'go', 'java', 'ruby', 'rust',
@@ -40982,7 +40983,10 @@ function validateExport(value, path, targetPath) {
40982
40983
  enumeration(item.parserDepth, `${path}.parserDepth`, PARSER_DEPTHS);
40983
40984
  }
40984
40985
  function validateRelationship(value, path) {
40985
- const item = record(value, path, ['id', 'type', 'fromId', 'toId', 'confidence', 'deterministic', 'provenance']);
40986
+ const item = record(value, path, [
40987
+ 'id', 'type', 'fromId', 'toId', 'confidence', 'deterministic', 'provenance',
40988
+ 'computationRepeatable', 'semanticCertainty', 'evidenceTier', 'enforcementEligible',
40989
+ ], ['id', 'type', 'fromId', 'toId', 'confidence', 'deterministic', 'provenance']);
40986
40990
  id(item.id, `${path}.id`);
40987
40991
  enumeration(item.type, `${path}.type`, [
40988
40992
  'defines', 'references', 'imports', 'exports', 'calls', 'owns',
@@ -40993,6 +40997,19 @@ function validateRelationship(value, path) {
40993
40997
  id(item.toId, `${path}.toId`);
40994
40998
  enumeration(item.confidence, `${path}.confidence`, ['exact', 'high', 'medium', 'low']);
40995
40999
  boolean(item.deterministic, `${path}.deterministic`);
41000
+ if (item.computationRepeatable !== undefined)
41001
+ boolean(item.computationRepeatable, `${path}.computationRepeatable`);
41002
+ if (item.semanticCertainty !== undefined) {
41003
+ enumeration(item.semanticCertainty, `${path}.semanticCertainty`, ['exact', 'high', 'medium', 'low', 'unknown']);
41004
+ }
41005
+ if (item.evidenceTier !== undefined) {
41006
+ enumeration(item.evidenceTier, `${path}.evidenceTier`, ['deterministic', 'advisory', 'degraded']);
41007
+ }
41008
+ if (item.enforcementEligible !== undefined)
41009
+ boolean(item.enforcementEligible, `${path}.enforcementEligible`);
41010
+ if (item.type === 'structurally_resembles' && item.enforcementEligible === true) {
41011
+ fail(`${path}.enforcementEligible`, 'structural resemblance is advisory and cannot be enforcement eligible');
41012
+ }
40996
41013
  sourceFreeMetadata(item.provenance, `${path}.provenance`, 256);
40997
41014
  }
40998
41015
  function validateReference(value, path, targetPath) {
@@ -41093,7 +41110,9 @@ function deriveTrustedHostPosture(adapterId, timing) {
41093
41110
  ? timing === 'after_write'
41094
41111
  : adapterId === 'claude-code-hooks' || adapterId === 'copilot-hooks'
41095
41112
  ? timing === 'before_write'
41096
- : timing !== 'ci';
41113
+ : adapterId === 'neurcode-cli'
41114
+ ? timing === 'before_write' || timing === 'after_write'
41115
+ : timing !== 'ci';
41097
41116
  if (!timingAllowed) {
41098
41117
  throw new Error(`Invalid trusted host timing: ${adapterId} cannot claim ${timing}`);
41099
41118
  }
@@ -41110,6 +41129,8 @@ function deriveTrustedHostPosture(adapterId, timing) {
41110
41129
  capability = 'cooperative_prewrite';
41111
41130
  else if (adapterId === 'vscode-extension')
41112
41131
  capability = 'post_write';
41132
+ else if (adapterId === 'neurcode-cli')
41133
+ capability = 'not_supported';
41113
41134
  else
41114
41135
  capability = 'not_supported';
41115
41136
  const decisionBinding = capability === 'hard_prewrite'
@@ -41374,6 +41395,47 @@ function isRepoIntelligenceEvidence(value) {
41374
41395
  const privacy = record.privacy;
41375
41396
  if (!graph || !policy || !privacy)
41376
41397
  return false;
41398
+ if (graph.canonicalModel !== undefined && graph.canonicalModel !== 'repository_graph_v2')
41399
+ return false;
41400
+ if (graph.storageSchemaVersion !== undefined && graph.storageSchemaVersion !== null
41401
+ && (typeof graph.storageSchemaVersion !== 'number'
41402
+ || !Number.isInteger(graph.storageSchemaVersion) || graph.storageSchemaVersion < 0))
41403
+ return false;
41404
+ for (const key of ['lastSuccessfulIndexAt', 'lastAttemptedIndexAt']) {
41405
+ if (graph[key] !== undefined && graph[key] !== null && typeof graph[key] !== 'string')
41406
+ return false;
41407
+ }
41408
+ for (const key of ['deterministicEvidenceEligible', 'deterministicEnforcementEligible']) {
41409
+ if (graph[key] !== undefined && typeof graph[key] !== 'boolean')
41410
+ return false;
41411
+ }
41412
+ if (graph.enforcementIneligibilityReasons !== undefined && (!Array.isArray(graph.enforcementIneligibilityReasons)
41413
+ || graph.enforcementIneligibilityReasons.length > 64
41414
+ || !graph.enforcementIneligibilityReasons.every((item) => typeof item === 'string' && item.length > 0 && item.length <= 128)))
41415
+ return false;
41416
+ if (graph.recoveryCommand !== undefined
41417
+ && !['neurcode brain repo-index', 'neurcode brain repo-recover'].includes(String(graph.recoveryCommand)))
41418
+ return false;
41419
+ if (graph.coverage !== undefined && graph.coverage !== null) {
41420
+ if (typeof graph.coverage !== 'object' || Array.isArray(graph.coverage))
41421
+ return false;
41422
+ const coverage = graph.coverage;
41423
+ for (const key of ['filesSeen', 'filesIndexed', 'filesAnalyzed', 'filesSkipped', 'filesUnsupported', 'filesDegraded', 'filesFailed']) {
41424
+ if (typeof coverage[key] !== 'number' || !Number.isInteger(coverage[key]) || Number(coverage[key]) < 0)
41425
+ return false;
41426
+ }
41427
+ }
41428
+ if (graph.runtimeCompatibility !== undefined) {
41429
+ if (!graph.runtimeCompatibility || typeof graph.runtimeCompatibility !== 'object' || Array.isArray(graph.runtimeCompatibility))
41430
+ return false;
41431
+ const compatibility = graph.runtimeCompatibility;
41432
+ if (compatibility.component !== 'cli')
41433
+ return false;
41434
+ for (const key of ['contractId', 'runtimeContractVersion', 'manifestVersion']) {
41435
+ if (typeof compatibility[key] !== 'string' || compatibility[key].length === 0)
41436
+ return false;
41437
+ }
41438
+ }
41377
41439
  if (!Array.isArray(policy.evaluatedRuleIds) || !Array.isArray(policy.notEvaluatedRuleIds) || !Array.isArray(policy.findings))
41378
41440
  return false;
41379
41441
  if (!Array.isArray(record.advisory))
@@ -51166,6 +51228,8 @@ function evaluateAIChangeRecordArtifacts(artifacts, discoveryDiagnostics, dirAbs
51166
51228
  const deterministicFindings = new Map();
51167
51229
  const advisoryFindings = new Map();
51168
51230
  let unsupportedPercentMax = null;
51231
+ let deterministicEnforcementEligible = true;
51232
+ const enforcementIneligibilityReasons = new Set();
51169
51233
  let suppressedAdvisoryCount = 0;
51170
51234
  for (const evidence of repoIntelligenceEvidence) {
51171
51235
  classifications[evidence.classification] = (classifications[evidence.classification] ?? 0) + 1;
@@ -51176,6 +51240,13 @@ function evaluateAIChangeRecordArtifacts(artifacts, discoveryDiagnostics, dirAbs
51176
51240
  if (typeof evidence.graph.unsupportedPercent === 'number') {
51177
51241
  unsupportedPercentMax = Math.max(unsupportedPercentMax ?? 0, evidence.graph.unsupportedPercent);
51178
51242
  }
51243
+ deterministicEnforcementEligible &&= evidence.graph.deterministicEnforcementEligible === true;
51244
+ if (evidence.graph.enforcementIneligibilityReasons) {
51245
+ evidence.graph.enforcementIneligibilityReasons.forEach((reason) => enforcementIneligibilityReasons.add(reason));
51246
+ }
51247
+ else if (evidence.graph.deterministicEnforcementEligible !== true) {
51248
+ enforcementIneligibilityReasons.add('legacy_operability_fields_missing');
51249
+ }
51179
51250
  evidence.policy.evaluatedRuleIds.forEach((ruleId) => evaluatedRuleIds.add(ruleId));
51180
51251
  evidence.policy.notEvaluatedRuleIds.forEach((ruleId) => notEvaluatedRuleIds.add(ruleId));
51181
51252
  for (const finding of evidence.policy.findings) {
@@ -51211,6 +51282,8 @@ function evaluateAIChangeRecordArtifacts(artifacts, discoveryDiagnostics, dirAbs
51211
51282
  timings: Array.from(timings).sort(),
51212
51283
  freshnessStates: Array.from(freshnessStates).sort(),
51213
51284
  unsupportedPercentMax,
51285
+ deterministicEnforcementEligible,
51286
+ enforcementIneligibilityReasons: Array.from(enforcementIneligibilityReasons).sort(),
51214
51287
  evaluatedRuleIds: Array.from(evaluatedRuleIds).sort(),
51215
51288
  notEvaluatedRuleIds: Array.from(notEvaluatedRuleIds).sort(),
51216
51289
  deterministicFindings: Array.from(deterministicFindings.values()).sort((a, b) => a.ruleId.localeCompare(b.ruleId) || a.findingId.localeCompare(b.findingId)),
@@ -52394,6 +52467,8 @@ function renderStepSummary(opts) {
52394
52467
  lines.push(`| Host capability / timing | ${inlineList(repoIntelligence.capabilities, 6, 80)} / ${inlineList(repoIntelligence.timings, 6, 80)} |`);
52395
52468
  lines.push(`| Graph freshness | ${inlineList(repoIntelligence.freshnessStates, 6, 80)} |`);
52396
52469
  lines.push(`| Maximum unsupported coverage | ${repoIntelligence.unsupportedPercentMax === null ? 'unknown' : `${repoIntelligence.unsupportedPercentMax.toFixed(2)}%`} |`);
52470
+ lines.push(`| Deterministic enforcement eligible | ${repoIntelligence.deterministicEnforcementEligible === true ? 'yes' : 'no'} |`);
52471
+ lines.push(`| Enforcement gaps | ${inlineList(repoIntelligence.enforcementIneligibilityReasons ?? ['legacy_operability_fields_missing'], 6, 120)} |`);
52397
52472
  lines.push(`| Deterministic findings | ${repoIntelligence.deterministicFindings.length} |`);
52398
52473
  lines.push(`| Advisory findings | ${repoIntelligence.advisoryFindings.length} active, ${repoIntelligence.suppressedAdvisoryCount} suppressed |`);
52399
52474
  lines.push(`| Not-evaluated rules | ${inlineList(repoIntelligence.notEvaluatedRuleIds, 6, 120)} |`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurcode/action",
3
- "version": "0.3.0-rc.6",
3
+ "version": "0.3.0-rc.7",
4
4
  "description": "Neurcode Runtime Admission Advisory — GitHub Action. Deterministic PR effect inventory and optional self-attested runtime admission provenance. No account required.",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -25,7 +25,7 @@
25
25
  "dependencies": {
26
26
  "@actions/core": "^1.10.1",
27
27
  "@actions/github": "^6.0.0",
28
- "@neurcode-ai/contracts": "^0.2.0",
28
+ "@neurcode-ai/contracts": "^0.2.1",
29
29
  "@neurcode-ai/governance-runtime": "^0.3.0"
30
30
  },
31
31
  "devDependencies": {