v0.1.0-rc.16
Pre-release
Pre-release
·
33 commits
to main
since this release
Added
- CLI/MCP parity contract test (#151).
packages/ttctl/src/__tests__/cli-mcp-parity.test.ts(runs in
pnpm test) is the sibling parity gate to surface-coverage: it walks
the live Commander tree and a constructed MCP server's tool registry
(a newlistRegisteredMcpToolNames()export from@ttctl/mcp) and
reports when a CLI leafttctl <group> <sub-domain> <verb>and its
ttctl_<group>_<sub-domain>_<verb>MCP tool drift apart. Runtime
discovery resolves the template-literal tool registrations a source
scan cannot; intentional divergences live in.mcp-exempt.yamlor an
inline// mcp-exempt:comment. Warn-by-default;
CLI_MCP_PARITY_STRICT=1fails on drift. - Scalar type-consistency lint gate (#782).
scripts/check-scalar-type-consistency.ts(wired intopnpm lint)
cross-references hand-authoredexport interfacescalar fields under
packages/core/src/services/**against the generated codegen named
types and Zod schemas, flagging a hand-authored field whose primitive
contradicts the wire scalar — the structural defense against the #275
mistype class (#275, #779). Field-name match on a single unambiguous
contradiction; warn-by-default with// scalar-consistency-exempt:
markers andSCALAR_CONSISTENCY_STRICT=1.
Changed
- Surface-coverage gate follows sibling-file re-exports (#662). The
Class A gate parsed onlyexport async functionand
export const ns = {}; it now also follows value re-exports
(export { name } from "./sibling.js", honoringasaliases and
ignoringexport type), attributing the op to the importing index's
namespace — so an op implemented in a sibling file (e.g.
profile.employment.reportingToAutocomplete) is no longer invisible
to it. - README-verbs gate resolves
ttctl_*MCP tool-name claims (#765).
The #762 gate routed everyttctl_*backtick span to its unchecked
report; those spans now resolve against the registered MCP tool roster
(EXPECTED_TOOLS, pinned to the live server registry), so a README
naming a renamed or removed tool is a strict finding rather than a
silent unchecked row.
Fixed
- Scalar type corrections:
paymentGroupIdand time-zone offsets are
number, notstring(#779). Two#275-class mistypes where the
hand-authored TypeScript contracted astringwhile the SDL, generated
codegen, and live wire all return a numericInt.payments—
Payout.paymentGroupId/WirePayment.paymentGroupIdretyped
string | null→number | null(live wire returns group ids like
261280).availability—AvailabilityTimeZone.utcOffset/
.stdOffsetretypedstring | null→number | null(live wire
returns offset seconds, e.g.3600for UTC+1), found by the
accompanying suite-wide scalar-mistype sweep. Runtime rendering is
unchanged (the wire already sent numbers); the fix aligns the type
contract so string operations on these fields are no longer silently
wrong. ThePaymentswire snapshot was hand-corrected (and
live-verified against a populated cycle):paymentGroupIdfrom a
degeneratenullcapture tonullable<number>, andbillingCycle/job
from a degenerate non-null capture to their truenullable<object>shape.