Skip to content

v0.1.0-rc.16

Pre-release
Pre-release

Choose a tag to compare

@alexey-pelykh alexey-pelykh released this 14 Jun 14:50
· 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 new listRegisteredMcpToolNames() export from @ttctl/mcp) and
    reports when a CLI leaf ttctl <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.yaml or an
    inline // mcp-exempt: comment. Warn-by-default;
    CLI_MCP_PARITY_STRICT=1 fails on drift.
  • Scalar type-consistency lint gate (#782).
    scripts/check-scalar-type-consistency.ts (wired into pnpm lint)
    cross-references hand-authored export interface scalar 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 and SCALAR_CONSISTENCY_STRICT=1.

Changed

  • Surface-coverage gate follows sibling-file re-exports (#662). The
    Class A gate parsed only export async function and
    export const ns = {}; it now also follows value re-exports
    (export { name } from "./sibling.js", honoring as aliases and
    ignoring export 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 every ttctl_* 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: paymentGroupId and time-zone offsets are
    number, not string (#779).
    Two #275-class mistypes where the
    hand-authored TypeScript contracted a string while the SDL, generated
    codegen, and live wire all return a numeric Int. payments
    Payout.paymentGroupId / WirePayment.paymentGroupId retyped
    string | nullnumber | null (live wire returns group ids like
    261280). availabilityAvailabilityTimeZone.utcOffset /
    .stdOffset retyped string | nullnumber | null (live wire
    returns offset seconds, e.g. 3600 for 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. The Payments wire snapshot was hand-corrected (and
    live-verified against a populated cycle): paymentGroupId from a
    degenerate null capture to nullable<number>, and billingCycle/job
    from a degenerate non-null capture to their true nullable<object> shape.