@uwmd/core 1.6.0 → 1.8.0

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.
Files changed (98) hide show
  1. package/dist/agents/bancroft.js +4 -1
  2. package/dist/agents/bancroft.js.map +1 -1
  3. package/dist/asset-class.d.ts +98 -0
  4. package/dist/asset-class.d.ts.map +1 -0
  5. package/dist/asset-class.js +226 -0
  6. package/dist/asset-class.js.map +1 -0
  7. package/dist/browser.d.ts +23 -9
  8. package/dist/browser.d.ts.map +1 -1
  9. package/dist/browser.js +25 -5
  10. package/dist/browser.js.map +1 -1
  11. package/dist/calc/errors.d.ts +1 -1
  12. package/dist/calc/errors.d.ts.map +1 -1
  13. package/dist/calc/errors.js.map +1 -1
  14. package/dist/calc/evaluator.js +25 -1
  15. package/dist/calc/evaluator.js.map +1 -1
  16. package/dist/calc/prng.d.ts +59 -0
  17. package/dist/calc/prng.d.ts.map +1 -0
  18. package/dist/calc/prng.js +181 -0
  19. package/dist/calc/prng.js.map +1 -0
  20. package/dist/calc/sensitivity.d.ts +76 -0
  21. package/dist/calc/sensitivity.d.ts.map +1 -0
  22. package/dist/calc/sensitivity.js +160 -0
  23. package/dist/calc/sensitivity.js.map +1 -0
  24. package/dist/calc/stochastic.d.ts +97 -0
  25. package/dist/calc/stochastic.d.ts.map +1 -0
  26. package/dist/calc/stochastic.js +265 -0
  27. package/dist/calc/stochastic.js.map +1 -0
  28. package/dist/cascade.d.ts.map +1 -1
  29. package/dist/cascade.js +8 -4
  30. package/dist/cascade.js.map +1 -1
  31. package/dist/cli-args.d.ts +37 -0
  32. package/dist/cli-args.d.ts.map +1 -0
  33. package/dist/cli-args.js +93 -0
  34. package/dist/cli-args.js.map +1 -0
  35. package/dist/cli.js +119 -72
  36. package/dist/cli.js.map +1 -1
  37. package/dist/editor.js +25 -6
  38. package/dist/editor.js.map +1 -1
  39. package/dist/index.d.ts +24 -10
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +26 -5
  42. package/dist/index.js.map +1 -1
  43. package/dist/init.d.ts.map +1 -1
  44. package/dist/init.js +16 -4
  45. package/dist/init.js.map +1 -1
  46. package/dist/integrity-canonical.d.ts.map +1 -1
  47. package/dist/integrity-canonical.js +10 -2
  48. package/dist/integrity-canonical.js.map +1 -1
  49. package/dist/integrity.d.ts +92 -4
  50. package/dist/integrity.d.ts.map +1 -1
  51. package/dist/integrity.js +195 -9
  52. package/dist/integrity.js.map +1 -1
  53. package/dist/lite-bridge.d.ts.map +1 -1
  54. package/dist/lite-bridge.js +47 -0
  55. package/dist/lite-bridge.js.map +1 -1
  56. package/dist/migrate-source-tags.d.ts +34 -0
  57. package/dist/migrate-source-tags.d.ts.map +1 -0
  58. package/dist/migrate-source-tags.js +179 -0
  59. package/dist/migrate-source-tags.js.map +1 -0
  60. package/dist/module-runtime.d.ts +57 -0
  61. package/dist/module-runtime.d.ts.map +1 -0
  62. package/dist/module-runtime.js +167 -0
  63. package/dist/module-runtime.js.map +1 -0
  64. package/dist/module-signing.d.ts +85 -0
  65. package/dist/module-signing.d.ts.map +1 -0
  66. package/dist/module-signing.js +136 -0
  67. package/dist/module-signing.js.map +1 -0
  68. package/dist/modules.d.ts +42 -0
  69. package/dist/modules.d.ts.map +1 -1
  70. package/dist/modules.js +124 -1
  71. package/dist/modules.js.map +1 -1
  72. package/dist/parser.d.ts.map +1 -1
  73. package/dist/parser.js +27 -1
  74. package/dist/parser.js.map +1 -1
  75. package/dist/protocol.d.ts +234 -21
  76. package/dist/protocol.d.ts.map +1 -1
  77. package/dist/protocol.js +352 -32
  78. package/dist/protocol.js.map +1 -1
  79. package/dist/renderer.d.ts.map +1 -1
  80. package/dist/renderer.js +22 -2
  81. package/dist/renderer.js.map +1 -1
  82. package/dist/report.d.ts.map +1 -1
  83. package/dist/report.js +17 -0
  84. package/dist/report.js.map +1 -1
  85. package/dist/runner.d.ts.map +1 -1
  86. package/dist/runner.js +9 -3
  87. package/dist/runner.js.map +1 -1
  88. package/dist/types.d.ts +118 -5
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +44 -0
  91. package/dist/types.js.map +1 -1
  92. package/dist/validator.d.ts +26 -2
  93. package/dist/validator.d.ts.map +1 -1
  94. package/dist/validator.js +256 -19
  95. package/dist/validator.js.map +1 -1
  96. package/dist/version.d.ts +1 -1
  97. package/dist/version.js +1 -1
  98. package/package.json +6 -2
package/dist/index.js CHANGED
@@ -6,6 +6,8 @@ export { compact, diff } from './compactor.js';
6
6
  export { render, UnsupportedRenderFormatError } from './renderer.js';
7
7
  export { renderReportHtml, REPORT_CSS } from './report.js';
8
8
  export { UW_LITE_REPRESENTATION_ID, UWX_REPRESENTATION_ID, UW_LITE_REPRESENTATION_VERSION, UWX_REPRESENTATION_VERSION, UW_LITE_MEDIA_TYPE, UWX_MEDIA_TYPE, UW_LITE_EXTENSION, UW_LITE_SOURCE_DESCRIPTOR, UWX_SOURCE_DESCRIPTOR, UWX_EXTENSION, UWSourceRepresentationError, detectUWSourceRepresentation, migrateLegacyUWMarkdown, } from './source-representation.js';
9
+ // RFC 0031 source-tag migration (`uwmd migrate --source-tags`)
10
+ export { migrateSourceTags, mapLegacySource } from './migrate-source-tags.js';
9
11
  export { UWLiteError, parseUWLite, canonicalizeUWLiteFinancial, renderCanonicalUWLite, } from './lite.js';
10
12
  export { UW_LITE_BRIDGE_PROFILE, UW_LITE_SOURCE_EXTENSION, UW_LITE_FIELD_MAPPINGS, UWLiteBridgeError, compileUWLite, projectUWEnvelopeToLite, stringifyUWX, } from './lite-bridge.js';
11
13
  export { UW_JSON_REPRESENTATION_VERSION, UW_JSON_MEDIA_TYPE, UWJsonError, toUWJson, stringifyUWEnvelope, stringifyUWJson, stringifyUWJsonWithDigest, parseUWJson, parseUWJsonVerified, fromUWJson, UW_JSON_CODEC, } from './uwjson.js';
@@ -19,15 +21,33 @@ export { CodecRegistry, UWCodecError } from './codec.js';
19
21
  export { writeAgentBlock, writeErrorEntry, buildMeta } from './runner.js';
20
22
  export { applyEdit, applyEditAsync, resolvePolicy } from './editor.js';
21
23
  export { evaluateCalc, parseExpression, evaluate, BUILTINS, CalcError, calcError } from './calc/index.js';
24
+ // RFC 0007 — sensitivity tables. A declaration, not a grammar extension: the
25
+ // §VIII.1 sandbox is unchanged, and the grid never travels through
26
+ // `CalcResult.value`.
27
+ // RFC 0005 — stochastic calculations. Sampling is a declaration plus the §VIII.7
28
+ // override mechanism; the grammar and the builtins are untouched, and the
29
+ // builtins stay pure.
30
+ export { evaluateStochastic, isStochasticDecl, SUMMARY_STATS, MAX_STOCHASTIC_SAMPLES, MIN_STOCHASTIC_SAMPLES, } from './calc/stochastic.js';
31
+ export { Pcg64, PRNG_ALGORITHM, inverseNormalCdf, sampleUniform, sampleNormal, sampleTriangular, } from './calc/prng.js';
32
+ export { evaluateSensitivity, isSensitivityDecl, assertSensitivityOk, MAX_SENSITIVITY_CELLS, MAX_SENSITIVITY_AXIS, } from './calc/sensitivity.js';
22
33
  // The §VIII.5 quantization boundary. Exported because a host that reports its
23
34
  // own derived numbers alongside pack results must quantize them the same way, or
24
35
  // its receipt digest will not reproduce.
25
36
  export { quantizeDecimal, resolveRoundTo, DEFAULT_ROUND_TO, DEFAULT_ROUND_TO_BY_UNIT, MAX_ROUND_TO, } from './calc/index.js';
26
37
  export { MULTIFAMILY_PACK, OFFICE_PACK, RETAIL_PACK, INDUSTRIAL_PACK, SELF_STORAGE_PACK, HOSPITALITY_PACK, SENIOR_HOUSING_PACK, STUDENT_HOUSING_PACK, LAND_PACK, MIXED_USE_PACK, getPackForAssetClass, emitFromAst, emitExcelFormula, emitCalcExcelFormula, ExcelEmitError, } from './packs/index.js';
27
- export { loadModuleManifest, createModuleRegistry, getModuleCalculationsForAssetClass, ModuleRegistryError, } from './modules.js';
38
+ export { loadModuleManifest, loadModuleManifestAsync, createModuleRegistry, createModuleRegistryAsync, getModuleCalculationsForAssetClass, ModuleRegistryError, } from './modules.js';
39
+ // RFC 0003 — module-declared asset classes. Identifier grammar and resolution
40
+ // are crypto-free and browser-safe; `AssetClass` itself stays a closed union.
41
+ export { parseAssetClass, isCustomAssetClass, resolveAssetClass, declaredAssetClasses, assetClassDeclarationConflicts, declaredModuleDependencies, } from './asset-class.js';
42
+ export { evaluateModuleCalculations, validateAgainstModules, checkModuleSections, } from './module-runtime.js';
43
+ // RFC 0002 — module signatures. Crypto-free half only; `@uwmd/signing` supplies
44
+ // the verifier that `verifyModuleSignature` and the async loaders accept.
45
+ export { moduleSigningPayload, verifyModuleSignature, checkSignatureShape, MODULE_SIGNATURE_SCHEME, } from './module-signing.js';
28
46
  // ─── RFC 0018: document profiles, lease abstracts, deal packages ─────────────
29
47
  // All browser-safe: no I/O, no network, no hashing implementation imported.
30
- export { BUILTIN_DOCUMENT_PROFILES, DEAL_UNDERWRITING_PROFILE, LEASE_ABSTRACT_PROFILE, SOURCE_NOTE_PROFILE, MARKET_DATA_PROFILE, DOCUMENT_PROFILE_PATTERN, lookupDocumentProfile, STANDARD_SECTION_IDS, isStandardSectionId, EXTENSION_SECTION_PREFIX, BUILTIN_EDGE_TYPES, lookupEdgeType, isEdgeTypeValidOnLayer, } from './protocol.js';
48
+ export { BUILTIN_DOCUMENT_PROFILES, DEAL_UNDERWRITING_PROFILE, LEASE_ABSTRACT_PROFILE, SOURCE_NOTE_PROFILE, MARKET_DATA_PROFILE, DOCUMENT_PROFILE_PATTERN, lookupDocumentProfile, STANDARD_SECTION_IDS, isStandardSectionId, EXTENSION_SECTION_PREFIX, BUILTIN_EDGE_TYPES, lookupEdgeType, isEdgeTypeValidOnLayer,
49
+ // RFC 0027: the Protocol §XIII size-intensive registry. Browser-safe.
50
+ SIZE_INTENSIVES, getSizeIntensive, resolveDealSize, } from './protocol.js';
31
51
  export { UW_PACKAGE_VERSION, UW_PACKAGE_ZIP_CODEC, UW_PACKAGE_ZIP_MEDIA_TYPE, UW_PACKAGE_CONTEXT_CODEC, UW_PACKAGE_CONTEXT_MEDIA_TYPE, CONTEXT_INLINABLE_ROLES, UWPackageError, isSafeMemberPath, validateUWDealPackageManifest, assertUWDealPackageManifest, projectPackageLinksToEntityEdges, edgeTypesForLayer, } from './deal-package.js';
32
52
  export { projectUWDealPackageContext, validateUWDealPackageContext, verifyContextContentDigests, } from './deal-package-context.js';
33
53
  export { LEASE_ABSTRACT_PROFILE_ID, LEASE_ABSTRACT_GROUPS, LEASE_TERM_STATUSES, LEASE_ARTIFACT_KINDS, LeaseAbstractError, validateLeaseAbstract, assertLeaseAbstract, projectLeaseAbstractToRentRoll, } from './lease-abstract.js';
@@ -57,17 +77,18 @@ export { deriveDCF } from './dcf.js';
57
77
  // ─── Asset-class defaults & cascade (Protocol §V.7-§V.8) ──────────────────────
58
78
  export { MULTIFAMILY_DEFAULTS, OFFICE_DEFAULTS, RETAIL_DEFAULTS, INDUSTRIAL_DEFAULTS, SELF_STORAGE_DEFAULTS, HOSPITALITY_DEFAULTS, SENIOR_HOUSING_DEFAULTS, STUDENT_HOUSING_DEFAULTS, LAND_DEFAULTS, MIXED_USE_DEFAULTS, getAssetClassDefaults, getDefaultRange, listDefaultedFields, } from './defaults.js';
59
79
  export { inferGaps, summarizeGaps, readGapsContent } from './gaps.js';
60
- export { sha256Hex, computeBlockHash, verifyChain, verifyProvenance, } from './integrity.js';
80
+ export { sha256Hex, computeBlockHash, verifyChain, verifyProvenance, blockSigningPayload, canonicalBlockSigningInput, } from './integrity.js';
61
81
  export { canonicalize } from './integrity-canonical.js';
62
82
  export { CORE_PACKAGE_NAME, CORE_VERSION } from './version.js';
83
+ export { REFERENCE_IMPLEMENTATION_MANIFEST } from './protocol.js';
63
84
  export { UW_RECEIPT_VERSION, SUPPORTED_RECEIPT_VERSIONS, ROLLUP_FUNCTIONS, PORTFOLIO_ROLLUP_SECTION, verifyRollup, evaluateRollup, validateRollupAggregate, UW_LITE_CANONICALIZATION, UW_LITE_CANONICALIZATION_VERSION, UWX_CANONICALIZATION, UWX_CANONICALIZATION_VERSION, RECEIPT_RESULT_TOLERANCE, BUILTIN_POLICY_SET, BUILTIN_POLICY_SET_VERSION, ReceiptError, resolveReceiptSubject, computeReceiptResults, computeResultsDigest, issueReceipt, receiptSigningPayload, verifyReceipt, assertUWReceipt, } from './receipts.js';
64
85
  export { verifyCapitalStack, recomputeSizing, trancheAnnualDebtService, isDebtTranche, capitalStackContext, CAPITAL_STACK_SIZING_DECIMALS, } from './capital-stack.js';
65
86
  export { resolveValue, readInFile } from './cascade.js';
66
- export { DEFAULT_THRESHOLDS, ASSET_CLASSES } from './types.js';
87
+ export { DEFAULT_THRESHOLDS, ASSET_CLASSES, UW_SIGNATURE_ALGORITHMS } from './types.js';
67
88
  // ─── Display formatting ───────────────────────────────────────────────────────
68
89
  export { formatCurrency, formatPercent, formatRatio, formatCount, formatDate, formatNull, formatValue, formatPercentCsv, formatNumberCsv, } from './format.js';
69
90
  // ─── Protocol surface ─────────────────────────────────────────────────────────
70
- export { PROTOCOL_VERSION, FORMAT_VERSION, DEFAULT_NUMBER_FORMAT, DEFAULT_DATE_FORMAT, BUILTIN_VIEW_MODELS, BUILTIN_EDIT_POLICIES, BUILTIN_REMEDIATIONS, BUILTIN_INCOMPLETE_DATA_POLICIES, CASCADE_ORDER, SOURCE_TAGS, lookupIncompleteDataPolicy, } from './protocol.js';
91
+ export { PROTOCOL_VERSION, FORMAT_VERSION, DEFAULT_NUMBER_FORMAT, DEFAULT_DATE_FORMAT, BUILTIN_VIEW_MODELS, BUILTIN_EDIT_POLICIES, BUILTIN_REMEDIATIONS, VALIDATOR_CODE_FAMILIES, validatorCodeFamily, BUILTIN_INCOMPLETE_DATA_POLICIES, CASCADE_ORDER, SOURCE_TAGS, ACTOR_NAMESPACES, ACTOR_SOURCE_RE, parseActorSource, lookupIncompleteDataPolicy, } from './protocol.js';
71
92
  // ─── Refinement / context profiles (Protocol §IX, §X) ────────────────────────
72
93
  export { extractDependencyGraph, getExprDependencies } from './calc/dependencies.js';
73
94
  export { rankGaps } from './refinement.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B;AAYD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,WAAgB,GAAG,MAAM,CAmKlE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B;AAYD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,WAAgB,GAAG,MAAM,CA+KlE"}
package/dist/init.js CHANGED
@@ -68,7 +68,17 @@ source_documents: []
68
68
  section,
69
69
  version: 1,
70
70
  superseded: false,
71
- source: 'wizard',
71
+ // `manual`, not `wizard`. A scaffold a person is about to fill in is a
72
+ // human-authored block, and `manual` is the one token that means the same
73
+ // thing in every source vocabulary the specs define. `wizard` matched no
74
+ // BUILTIN_EDIT_POLICIES pattern, so every freshly generated file carried
75
+ // blocks that no policy governed — which is why replacing them in place
76
+ // appeared to work.
77
+ //
78
+ // Deliberately not `system/init`: that resolves to `system/*`, whose
79
+ // authority is `system_only`, and these stubs exist precisely to be edited
80
+ // by a person.
81
+ source: 'manual',
72
82
  agent_id: null,
73
83
  agent_version: null,
74
84
  actor: 'user',
@@ -110,7 +120,7 @@ source_documents: []
110
120
 
111
121
  _${s.label} — Add narrative here._
112
122
 
113
- \`\`\`json uw:section=${s.id} source=wizard ts=${now} v=1 confidence=low
123
+ \`\`\`json uw:section=${s.id} source=manual ts=${now} v=1 confidence=low
114
124
  ${metaStub(s.id)}
115
125
  \`\`\`
116
126
 
@@ -120,7 +130,9 @@ ${metaStub(s.id)}
120
130
  section: 'pipeline_log',
121
131
  version: 1,
122
132
  superseded: false,
123
- source: 'engine:uwmd',
133
+ // The initializer writing an append-only log entry. `system/init` matches
134
+ // `system/*`; `engine:uwmd` matched nothing.
135
+ source: 'system/init',
124
136
  agent_id: null,
125
137
  agent_version: '1.0.0',
126
138
  actor: 'system',
@@ -161,7 +173,7 @@ ${sectionBlocks}
161
173
 
162
174
  ## Pipeline Log {#pipeline_log}
163
175
 
164
- \`\`\`json uw:section=pipeline_log source=engine:uwmd ts=${now} v=1 confidence=high
176
+ \`\`\`json uw:section=pipeline_log source=system/init ts=${now} v=1 confidence=high
165
177
  ${pipelineLogEntry}
166
178
  \`\`\`
167
179
  `;
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"integrity-canonical.d.ts","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"integrity-canonical.d.ts","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD"}
@@ -2,7 +2,8 @@
2
2
  // Protocol §V.9 — "Canonical block JSON"
3
3
  //
4
4
  // Implements RFC 8785 (JCS) with one extension: the keys `content_hash` and
5
- // `signature` inside any nested `_meta` object are removed before hashing.
5
+ // `signature` inside any nested `_meta` object (spelled `section`/`section_id`)
6
+ // are removed before hashing.
6
7
  // This keeps hash computation idempotent across multiple round trips through
7
8
  // the cascade.
8
9
  //
@@ -47,9 +48,16 @@ function stripExcludedKeys(input) {
47
48
  * meta fields. We strip the excluded keys from every meta-shaped sub-object,
48
49
  * not only the top-level `_meta`, so that nested provenance (e.g. inside
49
50
  * field_overrides) hashes consistently.
51
+ *
52
+ * `section_id` is accepted alongside `section` because it is the spelling every
53
+ * `.uw.md` on disk actually uses (format spec §3, and the `uwmd-block` schema's
54
+ * own example). Requiring `section` alone meant this predicate returned false
55
+ * for every parsed block, so the two exclusions §V.9 mandates silently never
56
+ * applied outside of hand-built test objects — stamping a `content_hash` then
57
+ * changed the hash it was a digest of, and INT-04 fired on untouched files.
50
58
  */
51
59
  function looksLikeMeta(obj) {
52
- return ('section' in obj &&
60
+ return (('section' in obj || 'section_id' in obj) &&
53
61
  'version' in obj &&
54
62
  'source' in obj);
55
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"integrity-canonical.js","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integrity-canonical.js","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ParsedUWFile, UWBlock } from './types.js';
1
+ import type { ParsedUWFile, UWBlock, UWBlockSignature } from './types.js';
2
2
  import type { EditPolicy } from './protocol.js';
3
3
  /**
4
4
  * SHA-256 of the canonicalized JSON of `value`. Returns the lowercase hex
@@ -22,7 +22,7 @@ export declare function sha256BytesHex(bytes: Uint8Array): Promise<string>;
22
22
  * canonicalizer).
23
23
  */
24
24
  export declare function computeBlockHash(block: UWBlock): Promise<string>;
25
- export type IntegrityCode = 'INT-01' | 'INT-02' | 'INT-03' | 'INT-04' | 'POL-01' | 'POL-02';
25
+ export type IntegrityCode = 'INT-01' | 'INT-02' | 'INT-03' | 'INT-04' | 'INT-05' | 'INT-06' | 'INT-07' | 'INT-08' | 'POL-01' | 'POL-02';
26
26
  export interface IntegrityIssue {
27
27
  code: IntegrityCode;
28
28
  severity: 'error' | 'warning';
@@ -36,6 +36,83 @@ export interface IntegrityResult {
36
36
  issues: IntegrityIssue[];
37
37
  chains_verified: number;
38
38
  chains_with_hashes: number;
39
+ /**
40
+ * How many blocks carry `_meta.signature` (RFC 0010). Reported even when no
41
+ * verifier was supplied, so a caller can tell "no signatures" apart from
42
+ * "signatures present but unchecked" — the distinction that makes a
43
+ * `signatures_verified: 0` result readable.
44
+ */
45
+ signatures_present: number;
46
+ /**
47
+ * How many signatures cryptographically verified. Always 0 without a
48
+ * `signatureVerifier`; never inferred from the signature's mere presence.
49
+ */
50
+ signatures_verified: number;
51
+ }
52
+ /**
53
+ * The canonical JSON a block signature covers.
54
+ *
55
+ * Deliberately not the block itself: the signer commits to the block's
56
+ * `content_hash` (which already covers the content), plus the four provenance
57
+ * facts a verifier needs in order to say *who* signed *what*, *when*. Signing
58
+ * the block directly would re-derive the hash for no gain and would drag
59
+ * `parent_hash` into the commitment — see {@link UWBlockSignature}.
60
+ */
61
+ export interface BlockSigningInput {
62
+ content_hash: string;
63
+ section: string;
64
+ actor: string;
65
+ timestamp: string;
66
+ kid: string;
67
+ signed_at: string;
68
+ }
69
+ /**
70
+ * Build the exact bytes a signature is computed over: RFC 8785 canonical JSON
71
+ * of {@link BlockSigningInput}. Crypto-free, so it lives in core — signer and
72
+ * verifier MUST agree on this string or nothing else matters.
73
+ *
74
+ * Returns `null` when the block cannot produce a signing input at all (no
75
+ * `content_hash`, or no signature to take `kid`/`signed_at` from).
76
+ */
77
+ export declare function blockSigningPayload(block: UWBlock): string | null;
78
+ /**
79
+ * Canonicalize an explicit signing input.
80
+ *
81
+ * The signer needs this and {@link blockSigningPayload} cannot serve it: at
82
+ * signing time the block has no `_meta.signature` yet, so there is nowhere to
83
+ * read `kid` and `signed_at` from. Both paths funnel through this one function
84
+ * so the two sides cannot drift.
85
+ */
86
+ export declare function canonicalBlockSigningInput(input: BlockSigningInput): string;
87
+ /** Why a signature failed to verify. Mirrors RFC 0010's `SigVerifyError`. */
88
+ export type BlockSigFailure = 'unknown_kid' | 'algorithm_mismatch' | 'bad_signature' | 'malformed';
89
+ export type BlockSigVerdict = {
90
+ ok: true;
91
+ } | {
92
+ ok: false;
93
+ reason: BlockSigFailure;
94
+ };
95
+ /**
96
+ * Plugged in by `@uwmd/signing`; absent here so core stays crypto-free (the
97
+ * same seam `ReceiptSignatureVerifier` uses for receipts).
98
+ */
99
+ export interface BlockSignatureVerifier {
100
+ verify(payload: string, signature: UWBlockSignature): Promise<BlockSigVerdict>;
101
+ }
102
+ export interface VerifyChainOptions {
103
+ /**
104
+ * Supplied by a signing package. Without it, INT-06/INT-07 never fire and a
105
+ * signed block is treated exactly like an unsigned one — verification is
106
+ * opt-in, and silently "passing" an unchecked signature is the failure this
107
+ * design most wants to avoid, which is what `signatures_present` reports.
108
+ */
109
+ signatureVerifier?: BlockSignatureVerifier;
110
+ /**
111
+ * Algorithms to flag as deprecated (INT-08). Empty at protocol 1.7 — no
112
+ * admitted algorithm is deprecated yet — but the knob exists so a deployment
113
+ * can retire one ahead of the spec.
114
+ */
115
+ deprecatedAlgorithms?: readonly string[];
39
116
  }
40
117
  /**
41
118
  * For every supersede chain in the parsed file:
@@ -47,9 +124,20 @@ export interface IntegrityResult {
47
124
  * `content_hash` (else INT-01 error).
48
125
  *
49
126
  * A chain with no hashes at all yields no findings and is not counted in
50
- * `chains_verified`.
127
+ * `chains_verified` — but its blocks are still swept for signatures, because a
128
+ * signature over a block that has no `content_hash` commits to nothing and is
129
+ * exactly the case INT-05 exists to catch.
130
+ *
131
+ * Signature checks (protocol §V.11) run over every block in the file:
132
+ * - INT-05 error — `signature` present with no `content_hash`.
133
+ * - INT-07 error — the stamped `content_hash` no longer recomputes, so the
134
+ * signature covers content that is no longer there (INT-04 reports the same
135
+ * drift as a warning; on a signed block it is an error).
136
+ * - INT-06 error — `kid` unknown to the supplied store.
137
+ * - INT-07 error — the signature does not verify.
138
+ * - INT-08 warning — the algorithm is in the caller's deprecation list.
51
139
  */
52
- export declare function verifyChain(parsed: ParsedUWFile): Promise<IntegrityResult>;
140
+ export declare function verifyChain(parsed: ParsedUWFile, options?: VerifyChainOptions): Promise<IntegrityResult>;
53
141
  /**
54
142
  * Cross-check `_meta.actor` and the operation that produced the block against
55
143
  * BUILTIN_EDIT_POLICIES.
@@ -1 +1 @@
1
- {"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../src/integrity.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/D;AAED,uEAAuE;AACvE,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBvE;AAWD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAKtE;AAID,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CA2EhF;AAID;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,QAAQ,GAAE,SAAS,UAAU,EAA0B,GACtD,eAAe,CA0CjB"}
1
+ {"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../src/integrity.ts"],"names":[],"mappings":"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"}
package/dist/integrity.js CHANGED
@@ -9,8 +9,9 @@
9
9
  // - SHA-256 implementation is split between Node (`createHash`) and Web
10
10
  // Crypto (`crypto.subtle`). The browser entry point binds the latter via
11
11
  // subpath export when adopters import from `@uwmd/core/browser`.
12
- import { canonicalize } from './integrity-canonical.js';
13
- import { BUILTIN_EDIT_POLICIES } from './protocol.js';
12
+ import { canonicalize, canonicalizeExact } from './integrity-canonical.js';
13
+ import { UW_SIGNATURE_ALGORITHMS } from './types.js';
14
+ import { BUILTIN_EDIT_POLICIES, parseActorSource } from './protocol.js';
14
15
  // ─── Hashing ─────────────────────────────────────────────────────────────────
15
16
  /**
16
17
  * SHA-256 of the canonicalized JSON of `value`. Returns the lowercase hex
@@ -63,6 +64,46 @@ export async function computeBlockHash(block) {
63
64
  // stripped by the canonicalizer.
64
65
  return sha256Hex({ ...block.content, _meta: block.meta });
65
66
  }
67
+ /**
68
+ * Build the exact bytes a signature is computed over: RFC 8785 canonical JSON
69
+ * of {@link BlockSigningInput}. Crypto-free, so it lives in core — signer and
70
+ * verifier MUST agree on this string or nothing else matters.
71
+ *
72
+ * Returns `null` when the block cannot produce a signing input at all (no
73
+ * `content_hash`, or no signature to take `kid`/`signed_at` from).
74
+ */
75
+ export function blockSigningPayload(block) {
76
+ const sig = block.meta.signature;
77
+ const hash = block.meta.content_hash;
78
+ if (!sig || typeof hash !== 'string')
79
+ return null;
80
+ return canonicalBlockSigningInput({
81
+ content_hash: hash,
82
+ section: block.meta.section,
83
+ actor: block.meta.actor,
84
+ timestamp: block.meta.timestamp,
85
+ kid: sig.kid,
86
+ signed_at: sig.signed_at,
87
+ });
88
+ }
89
+ /**
90
+ * Canonicalize an explicit signing input.
91
+ *
92
+ * The signer needs this and {@link blockSigningPayload} cannot serve it: at
93
+ * signing time the block has no `_meta.signature` yet, so there is nowhere to
94
+ * read `kid` and `signed_at` from. Both paths funnel through this one function
95
+ * so the two sides cannot drift.
96
+ */
97
+ export function canonicalBlockSigningInput(input) {
98
+ return canonicalizeExact({
99
+ content_hash: input.content_hash,
100
+ section: input.section,
101
+ actor: input.actor,
102
+ timestamp: input.timestamp,
103
+ kid: input.kid,
104
+ signed_at: input.signed_at,
105
+ });
106
+ }
66
107
  // ─── Chain verification ──────────────────────────────────────────────────────
67
108
  /**
68
109
  * For every supersede chain in the parsed file:
@@ -74,9 +115,20 @@ export async function computeBlockHash(block) {
74
115
  * `content_hash` (else INT-01 error).
75
116
  *
76
117
  * A chain with no hashes at all yields no findings and is not counted in
77
- * `chains_verified`.
118
+ * `chains_verified` — but its blocks are still swept for signatures, because a
119
+ * signature over a block that has no `content_hash` commits to nothing and is
120
+ * exactly the case INT-05 exists to catch.
121
+ *
122
+ * Signature checks (protocol §V.11) run over every block in the file:
123
+ * - INT-05 error — `signature` present with no `content_hash`.
124
+ * - INT-07 error — the stamped `content_hash` no longer recomputes, so the
125
+ * signature covers content that is no longer there (INT-04 reports the same
126
+ * drift as a warning; on a signed block it is an error).
127
+ * - INT-06 error — `kid` unknown to the supplied store.
128
+ * - INT-07 error — the signature does not verify.
129
+ * - INT-08 warning — the algorithm is in the caller's deprecation list.
78
130
  */
79
- export async function verifyChain(parsed) {
131
+ export async function verifyChain(parsed, options = {}) {
80
132
  const issues = [];
81
133
  let chainsWithHashes = 0;
82
134
  let chainsVerified = 0;
@@ -140,14 +192,128 @@ export async function verifyChain(parsed) {
140
192
  if (chainOK)
141
193
  chainsVerified++;
142
194
  }
195
+ const sig = await verifySignatures(parsed, issues, options);
143
196
  const errors = issues.filter((i) => i.severity === 'error').length;
144
197
  return {
145
198
  ok: errors === 0,
146
199
  issues,
147
200
  chains_verified: chainsVerified,
148
201
  chains_with_hashes: chainsWithHashes,
202
+ signatures_present: sig.present,
203
+ signatures_verified: sig.verified,
149
204
  };
150
205
  }
206
+ /**
207
+ * Sweep every block in the file for `_meta.signature` and append INT-05..08.
208
+ *
209
+ * Walks all blocks — heads, superseded priors, and every variant — rather than
210
+ * the per-section chain heads `verifyChain` walks. A signature on a superseded
211
+ * block is the whole point of per-block signing: "the sponsor signed *this*
212
+ * version of the rent roll" must stay checkable after the block is superseded.
213
+ */
214
+ async function verifySignatures(parsed, issues, options) {
215
+ const deprecated = options.deprecatedAlgorithms ?? [];
216
+ let present = 0;
217
+ let verified = 0;
218
+ for (const [sectionId, block] of everyBlock(parsed)) {
219
+ const signature = block.meta.signature;
220
+ if (!signature)
221
+ continue;
222
+ present++;
223
+ const where = `Block v${block.meta.version} of '${sectionId}'`;
224
+ if (deprecated.includes(signature.alg)) {
225
+ issues.push({
226
+ code: 'INT-08',
227
+ severity: 'warning',
228
+ section: sectionId,
229
+ message: `${where} is signed with deprecated algorithm '${signature.alg}'.`,
230
+ actual: signature.alg,
231
+ });
232
+ }
233
+ // INT-05 needs no key material: a signature over an absent content_hash is
234
+ // structurally void, so it is reported whether or not a verifier exists.
235
+ const payload = blockSigningPayload(block);
236
+ if (payload === null) {
237
+ issues.push({
238
+ code: 'INT-05',
239
+ severity: 'error',
240
+ section: sectionId,
241
+ message: `${where} carries a signature but no content_hash, so the signature commits to nothing.`,
242
+ });
243
+ continue;
244
+ }
245
+ // A signed block whose stamped hash no longer recomputes is INT-07 as well
246
+ // as INT-04, and the escalation from warning to error is the point: on an
247
+ // unsigned block a drifted hash is a bookkeeping slip, but on a signed one
248
+ // it means the content in front of you is not the content anybody signed.
249
+ const recomputed = await computeBlockHash(block);
250
+ if (recomputed !== block.meta.content_hash) {
251
+ issues.push({
252
+ code: 'INT-07',
253
+ severity: 'error',
254
+ section: sectionId,
255
+ message: `${where} was signed over content_hash ${block.meta.content_hash}, but its content now hashes to ${recomputed}.`,
256
+ expected: recomputed,
257
+ actual: block.meta.content_hash,
258
+ });
259
+ continue;
260
+ }
261
+ if (!UW_SIGNATURE_ALGORITHMS.includes(signature.alg)) {
262
+ issues.push({
263
+ code: 'INT-07',
264
+ severity: 'error',
265
+ section: sectionId,
266
+ message: `${where} declares unrecognized signature algorithm '${signature.alg}'.`,
267
+ expected: UW_SIGNATURE_ALGORITHMS.join('|'),
268
+ actual: signature.alg,
269
+ });
270
+ continue;
271
+ }
272
+ if (!options.signatureVerifier)
273
+ continue;
274
+ const verdict = await options.signatureVerifier.verify(payload, signature);
275
+ if (verdict.ok) {
276
+ verified++;
277
+ continue;
278
+ }
279
+ if (verdict.reason === 'unknown_kid') {
280
+ issues.push({
281
+ code: 'INT-06',
282
+ severity: 'error',
283
+ section: sectionId,
284
+ message: `${where} is signed by key '${signature.kid}', which this verifier's key store does not hold.`,
285
+ actual: signature.kid,
286
+ });
287
+ continue;
288
+ }
289
+ issues.push({
290
+ code: 'INT-07',
291
+ severity: 'error',
292
+ section: sectionId,
293
+ message: `${where} signature did not verify (${verdict.reason}).`,
294
+ actual: signature.kid,
295
+ });
296
+ }
297
+ return { present, verified };
298
+ }
299
+ /** Every block in the file, superseded priors and variants included. */
300
+ function* everyBlock(parsed) {
301
+ for (const [sectionId, prior] of Object.entries(parsed.superseded)) {
302
+ for (const block of prior)
303
+ yield [sectionId, block];
304
+ }
305
+ for (const [sectionId, entry] of Object.entries(parsed.sections)) {
306
+ if (!entry)
307
+ continue;
308
+ if ('annotation' in entry) {
309
+ yield [sectionId, entry];
310
+ continue;
311
+ }
312
+ for (const variant of Object.values(entry)) {
313
+ yield [sectionId, variant];
314
+ }
315
+ }
316
+ }
151
317
  // ─── Provenance verification ─────────────────────────────────────────────────
152
318
  /**
153
319
  * Cross-check `_meta.actor` and the operation that produced the block against
@@ -195,6 +361,8 @@ export function verifyProvenance(parsed, policies = BUILTIN_EDIT_POLICIES) {
195
361
  issues,
196
362
  chains_verified: 0,
197
363
  chains_with_hashes: 0,
364
+ signatures_present: 0,
365
+ signatures_verified: 0,
198
366
  };
199
367
  }
200
368
  // ─── Helpers ─────────────────────────────────────────────────────────────────
@@ -230,17 +398,35 @@ function globMatch(pattern, value) {
230
398
  }
231
399
  return false;
232
400
  }
401
+ /**
402
+ * Classify from the parsed actor namespace, not string prefixes (RFC 0031).
403
+ * A source outside the actor grammar — a legacy colon form, a bare word, a
404
+ * resolution tag — classifies as `unknown`, never as human by default.
405
+ * `document/*` is likewise `unknown`: a document is evidence, not an
406
+ * authority class.
407
+ */
233
408
  function classifyActor(actor, source) {
234
- if (source.startsWith('system/') || source.startsWith('institution/'))
235
- return 'system';
236
- if (source.startsWith('agent/') || actor.startsWith('agent/'))
409
+ const s = parseActorSource(source);
410
+ if (s.kind === 'namespaced') {
411
+ if (s.namespace === 'system' || s.namespace === 'institution')
412
+ return 'system';
413
+ if (s.namespace === 'agent')
414
+ return 'agent';
415
+ }
416
+ const a = parseActorSource(actor);
417
+ if (a.kind === 'namespaced' && a.namespace === 'agent')
237
418
  return 'agent';
238
- return 'human';
419
+ if (s.kind === 'manual')
420
+ return 'human';
421
+ return 'unknown';
239
422
  }
240
423
  function authorityAllows(authority, actor) {
241
424
  switch (authority) {
425
+ // `unknown` passes `either`: refusing it would turn every legacy source in
426
+ // the wild into a POL-01, which is a migration, not a bug fix. It can
427
+ // never satisfy the three restricted classes below.
242
428
  case 'either':
243
- return actor === 'agent' || actor === 'human';
429
+ return actor !== 'system';
244
430
  case 'agent_only':
245
431
  return actor === 'agent';
246
432
  case 'human_only':