Skip to content

Releases: UWMD-OSP/UW-Markdown

v2.13.0 — period-indexed navigation and fidelity fixes

Choose a tag to compare

@jaredmaxey jaredmaxey released this 22 Sep 05:25

Core/CLI 2.13.0 · signing 0.2.17 · batch 0.8.12 · Protocol 2.17.0 · Format 2.0

All four packages are published to npm with SLSA provenance through trusted publishing (OIDC).

What shipped

  • Period-indexed path navigation resolves registered series by stated period identity, such as dcf.annual_cash_flows@Y3, rather than row position.
  • Model-fidelity exports preserve empty frontmatter arrays as []; this fixes the semantic-digest change found in seven private golden-deal/control round trips under 2.12.0.
  • The calc evaluator refuses prototype-polluting path segments, and calculation results are guarded against non-scalar values.
  • The normative RFC 0024 bisection procedure is restored after an unreleased Newton-Raphson regression.
  • Protocol prose labels are synchronized to 2.17.0 and protected by the version guard.

The experimental SQL exporter and unspecified Tier-3 collection surface were both withdrawn before release. Neither is part of the published API.

Evidence

The frozen private golden corpus passed all eight runnable cases: 532 assertions accounted for, 526 passing, six documented source/baseline defects, and all 20 refusal assertions passing. GD04 and GD07 remain evidence-blocked, and RFC 0045 real-deal assembly evidence remains pending.

Release verification passed 2,433 workspace tests, 589 conformance checks, all three capability profiles, 46 JSON Schema compilations, 221 emitted-code checks, package-content verification, version/index/release/lockfile guards, lint, documentation build, and OIDC release readiness.

Standalone Excel 0.9.5, report 0.8.17, lake 0.2.1, hospitality 0.1.5, and data-center 0.1.5 remain unpublished.

v2.12.0 — expense recoveries, waterfall clawback, and the code guard

Choose a tag to compare

@jaredmaxey jaredmaxey released this 16 Sep 15:52
f15ed14

Core/CLI 2.12.0 · signing 0.2.16 · batch 0.8.11 · Protocol 2.17.0 · Format 2.0

All four published to npm with SLSA provenance via trusted publishing (OIDC). Everything in this release is additive and optional: a document stating none of the new members validates exactly as it did at 2.11.0.

RFC 0058 — expense recoveries and the CAM true-up

The commercial tenant record carried a lease type and one orphan cam_cap_pct. recovery_terms now types the pro-rata share, the stop, the recoverable pool and the cap; recovery_true_up records a closed period's reconciliation. Registers REC-01–REC-10.

Two figures are deliberately stated, not recomputed, and the spec says why:

  • The capped amount — a cumulative or compounding cap depends on base-year history no single document carries, so recomputing it from one year would produce a confident wrong number. REC-07 checks only the direction a cap can move.
  • The pool allocation across tenants — that needs a policy for vacant space and is a modeling decision, not a recorded fact.

REC-02 gives cap.accumulation no default, because cumulative, non-cumulative and compounding diverge materially inside three years. REC-05 anchors the closed-period rule on the rent roll's own as_of_date and is skipped when absent — file metadata is an edit timestamp, and using it would refuse a legitimately re-saved document.

RFC 0059 — waterfall clawback as a terminal true-up

Deferred by RFC 0035, deferred again by RFC 0036, and predicted by protocol §XVI as "a terminal true-up tier, not per-period state." This is that shape: §VIII.10 gains step 5, and WF-10–WF-15 are registered.

Every basis is closed-form. The IRR floor reuses RFC 0036's hurdle balance verbatim rather than iterating on xirr — the calc engine has no iteration, and a design needing a nested solve would have been unreachable. A test pins the boundary property: at a floor equal to the IRR the LP actually achieved, the true-up is exactly zero.

The cap is promote_received and nothing else, because a GP cannot owe back more promote than it was paid. Absence and zero stay distinct: no provision reports null, a provision that computes to nothing reports 0, and a stated amount with no provision behind it is unverifiable rather than a disagreement.

verify-codes joins CI

RFC 0058 first shipped nine of its ten codes. REC-09 was in the RFC's table, the format spec and the JSON Schema, and nowhere in the validator — and nothing went red, because a missing refusal looks exactly like a document with nothing to refuse. The new guard cross-checks every code an implemented RFC or format-spec bullet promises against what @uwmd/core actually emits, and that every emitted validation family is registered in protocol §XI.

Verification

1,994 core tests plus every workspace · 589 conformance checks · 3 capability profiles · 46 JSON schemas · 221 emitted codes · lint · test typechecking · package/lockfile/version/index/release guards · docs-site build.

Verified against the registry rather than the job's checkmarks: a clean install of @uwmd/core@2.12.0 reports PROTOCOL_VERSION 2.17.0, and a real document through validateUWFile emits REC-01, REC-03 and REC-08 exactly as specified.

Still typed-but-inert. RFCs 0055–0059 type structures nothing yet consumes: no rent escalates, no break is exercised, no balance amortizes, nothing is priced and no strike crossing is projected. That is the intended state until a verifier is specified for each.

UW Markdown 2.11.0 — lease clauses, rate hedges, escrows and the capex draw

Choose a tag to compare

@jaredmaxey jaredmaxey released this 16 Sep 06:52
90168bc

Core/CLI 2.11.0, signing 0.2.15, batch 0.8.10, Protocol 2.15.0, Format 2.0.

Published to npm with SLSA provenance via trusted publishing (OIDC).

Five RFCs

RFC Scope
0049 @uwmd/lake — an optional PostgreSQL/JSONB adapter. Plans idempotent, digest-keyed upserts from canonical envelopes, block_values facts, receipts and manifests; raw JSON in jsonb beside typed shadow columns, so unknown sections, extension keys, explicit nulls and array order survive a load. Takes no database driver. Unpublished.
0054 Decision: per-lease economics split by shape. Clauses are attributes of a lease and typed in place; the periodic series is deferred.
0055 Commercial lease clauses — escalation steps, break options, co-tenancy triggers and remedies, LC balances beside TI (LSE-01–LSE-09).
0056 Rate hedges (HDG-01–HDG-06) and escrow cash lines (ESC-01–ESC-04).
0057 Renovation draw and expense-targeted capex (CAPX-01–CAPX-08).

All additive. Every member of every new structure is optional, so a document stating none of them validates exactly as it did at 2.10.0. No existing fixture moved.

What is deliberately not here

RFCs 0055, 0056 and 0057 type structures nothing yet consumes. No rent escalates, no break is exercised, no balance amortizes, nothing is priced, no strike crossing is projected and no stated saving is applied. Typed-but-inert is the intended state: the format learns to say these things before anything acts on them, and each consumer arrives with its own contract.

RFC 0054's periodic-series half is unbuilt by decision. A lease × period ledger needs a named consumer, and a calc-grammar answer for collections and a second period dimension, before any pack formula can reach it.

Three required disclosures

Where the unstated reading is the misleading one, the field is required rather than defaulted:

  • HDG-06 — what happens when a rate cap expires. A three-year cap on a five-year hold has a cliff in month 37, and "unstated" was the answer that hid it.
  • CAPX-07 — whether a stated expense saving is already inside the NOI model. Without it, an author reduces the utility line and a second reader applies the saving again.
  • TAX-08 (from 2.10.0) — whether the terminal tax is inside exit NOI.

ESC-04 works the same way from the other direction: a "replace" assumption requires a funded rate_cap_replacement escrow, and that escrow requires the assumption.

Reserved names

rate_swap and rate_collar are named, reserved and refused by HDG-02. Their mark-to-market moves with the curve and can be negative, which a cap's cannot; admitting them as caps would make the capital stack wrong in the one case that matters.

Verification

Build clean · 1937 core tests across 113 files plus every other workspace · 558 conformance checks · 44 JSON schemas · lint · typecheck:tests · version, lockfile, index and release-record gates.

A clean registry install of @uwmd/core@2.11.0 was verified after publish: exports, PROTOCOL_VERSION 2.15.0, and a document round-trip emitting HDG-02/HDG-03/HDG-04 as specified.

Full changelog: https://github.com/UWMD-OSP/UW-Markdown/blob/main/CHANGELOG.md#2110---2026-09-16

UW Markdown 2.10.0 — sale deductions and tax reassessment

Choose a tag to compare

@jaredmaxey jaredmaxey released this 16 Sep 05:14
ee0c131

Core/CLI 2.10.0 with Protocol 2.13.0 and Format 2.0. Signing 0.2.14 and batch 0.8.9 repin core. Published to npm through trusted publishing (OIDC) with SLSA provenance.

Seven accepted RFCs that had accumulated on main ship together.

Financial structures

RFC 0052 — named exit sale deductions. The disposition slot had one transaction_costs category, so a brokerage commission and a transfer tax were indistinguishable except by free-text label. An optional closed sale_deductions vocabulary now names every cost-of-sale row, with other requiring a label so the first unusual deduction does not block on a spec change. prepayment_penalty, defeasance and loan_payoff are reserved and refused — they are levered, below-NOI amounts and this assembly is unlevered. An optional net_sale_proceeds figure is verified against gross sale less exit costs, spanning the whole cell so it cannot be satisfied by leaving a deduction unnamed.

RFC 0053 — typed tax abatements and reassessment basis. noi_model.expenses.real_estate_taxes had carried two stubs since Format 1.0: a boolean nothing read, and a prose string holding real arithmetic nobody checked. Both are now typed, with the TAX-NN validator family. round_to_decimals may be negative, so an author's deliberate rounding is declared rather than unexplained. An RFC 0041 period-addressed abatement schedule covers exemption, freeze, PILOT, phase-in and credit. The format now names three distinct taxes — the seller's trailing, the buyer's going-in, and the terminal tax the next buyer pays — and TAX-08 requires a sale-triggered terminal basis to equal exit_value_gross, catching a going-in tax carried into terminal NOI.

The exit-value/terminal-tax circularity is deliberately not solved: the calc engine has no iteration, and the contract verifies stated figures rather than converging them.

RFC 0050 — preferred-equity split coupons. One tranche carrying current-pay and accrued components: cash_rate enters coverage, accrued_rate does not, and the full rate drives weighted cost. CS-02b validates the shape.

RFC 0051 — waterfall dual-hurdle any mode. On a split tier stating both until_lp_em and until_lp_irr, hurdle_mode: "any" caps at the smaller capacity; the default "both" keeps the larger. WF-01 rejects hurdle_mode without both hurdles.

Documents and tooling

RFC 0046 — document currency identity. Optional frontmatter.currency_code makes display denomination explicit across locales. No FX, no mixed-currency arithmetic, no currency-specific precision.

RFC 0047 — property cash-flow input inventory. Read-only inspectPropertyCashFlowInputs and uwmd inspect-property-cash-flows make the RFC 0045 handoff inspectable without classifying rows or inferring economics.

RFC 0048 — standalone document kit. Worked lease abstracts, source notes, .uwpart.md fragments, inline/externalized composition twins, a packaged .uwpkg.zip example, and a named standalone conformance suite.

The source CLI also gained verify-cash-flows, which checks stated cash-flow metrics without a custom script and distinguishes no claims from verified ones.

Compatibility

Every new member across all seven RFCs is optional. A document or plan stating none of them behaves exactly as it did in 2.9.0, and the existing conformance corpus is unchanged. No financial formula, derived value or iteration is introduced anywhere.

Verification

Build; 1,778 core tests plus every other workspace; test typechecking; 504 default, 76 declarative and 3 profile conformance runs, 0 failures; 38 JSON schemas; lint; and the lockfile, package, version, index and release guards.

Full changelog: https://github.com/UWMD-OSP/UW-Markdown/blob/main/CHANGELOG.md

2.9.0 — explicit property cash-flow assembly

Choose a tag to compare

@jaredmaxey jaredmaxey released this 12 Sep 22:19
7d939c7

Core and CLI 2.9.0 release RFC 0045's explicit property cash-flow assembler under Protocol 2.12.0. Format remains 2.0.

  • assemblePropertyCashFlows is available from core and the browser entry.
  • uwmd assemble-property <file> <plan.json> [--json] emits a read-only candidate with source evidence and typed refusals.
  • Scope is explicitly covered, single-currency, unlevered/pre-tax cash. Acquisition, operating, capital, reserve and disposition coverage must be declared; no missing economic inputs are inferred.
  • A clearly labeled synthetic ledger exercises the workflow and existing dated metrics. Real-deal validation remains separate.

Published companions: signing 0.2.13 and batch 0.8.8. Excel, report and module packages remain unpublished.

Verification: 1,990 workspace tests, 457 default plus 76 declarative conformance checks, 34 JSON schemas, full release gates, docs build and isolated tarball/registry API and CLI checks. Receipt updates change engine labels only; external dependencies and financial calculations are unchanged.

UW Markdown 2.8.0 — period consumers and lease-up projection

Choose a tag to compare

@jaredmaxey jaredmaxey released this 12 Sep 18:59
f0d8642

Core and CLI 2.8.0 are published with Protocol 2.11.0 and Format 2.0. Signing 0.2.12 and batch 0.8.7 carry matching core pins.

This release adds:

  • Stated period inputs and precise missing/ambiguous-input diagnostics in refinement (RFC 0042).
  • Validated --calc-context files for calculation and refinement, preserving explicit variants, zero and null.
  • Public contextual Excel binding APIs and complete period-column snapshots (RFC 0043). The standalone Excel 0.9.0 exporter remains available from source and is not published to npm.
  • projectLeaseUpCashFlows and uwmd project-lease-up: verified lease-up amounts mapped to explicit cash dates, with semantic source digests and binding evidence (RFC 0044). This covers rent receipts, concessions and TI/LC only; it does not infer complete DCF economics.

Install the CLI:

npm install -g @uwmd/cli@2.8.0

Verification passed: 1,931 workspace tests, 517 conformance checks, 31 schemas, all release gates, and separate packed-artifact and clean npm-registry installation checks. Financial formulas, precision boundaries and calculation digests are unchanged.

Publication workflow

UW Markdown 2.7.0 — roles and period addressing

Choose a tag to compare

@jaredmaxey jaredmaxey released this 12 Sep 08:40
560c2aa

UW Markdown 2.7.0 ships signed block roles and explicit period addressing.

  • RFC 0040: signed _role annotations, deterministic role-aware cross-check selection, component exclusion, and per-section coverage evidence.
  • RFC 0041: explicit year, calendar month/quarter, and date selectors for the five standard period series, including contextual variants, overrides, dependency keys, duplicate refusal and PS diagnostics.
  • Existing financial formulas and calculation digests are unchanged.

Packages: @uwmd/core@2.7.0, @uwmd/cli@2.7.0, @uwmd/signing@0.2.11, and @uwmd/batch@0.8.6. Format remains 2.0; Protocol is 2.8.0. Package and protocol versions advance independently. Excel/report and the two reference modules remain unpublished.

Excel emission and refinement perturbation explicitly refuse period-selector expressions. Relative Qn/Mn aliases, calendar conversion, module registration, and speculative leasing remain future work.

Validation: 1,782 workspace tests, 426 default conformance checks, 76 declarative cases, schema validation, test typechecking, package/version/lockfile/index/release checks, documentation build, and Linux/Windows CI.

Publication verified on npm for all four versions, including provenance metadata. A clean install outside the repository passed core/browser/signing/batch imports, role and period API checks, period calculation, and installed CLI parsing. Release workflow and main CI both passed.