tom_core_codespecs 0.12.0
tom_core_codespecs: ^0.12.0 copied to clipboard
CodeSpecs-only gap-filler for tom_core — structures needed by CodeSpecs but not mandatory for a general tom_core project.
Changelog #
0.12.0 #
8 files, +1878/-142 since 0.11.2.
- The gap-class set grew with the CodeSpecs parts catalogue: only the concrete
classes
tom_coregenuinely lacks live here, anddoc/gap_classes.mdstates which and why for each. - The barrel re-exports the additions.
- Documented and test-covered at the quest's standard; the README's status block is now derived rather than transcribed.
0.11.2 #
-
Docs only, no API change: the README's
## Statusblock stated "95 tests, all passing". Nothing connected that number to the suite, so it could only rot — every added test would have been a README edit nobody makes. The block now says how the suite is run and gives no count; the version beside it is pinned topubspec.yamlbytom_ai/core/tool/check_readme_status.py(tcincb153). -
Docs only, no API change: five test comments cited a bare section number of
codespecs_mapping.md, which does not ship with this package, so the justification a reader needed was one indirection away and unreachable. Each now states the reasoning directly — whydomainEnumneeds no gap class, why CE-UP reusestom_core_server's preferences plane, and why the CE-RP drill-through target stays an open route-id string.
0.11.1 #
- Docs only, no API change: the library dartdoc and README now name the CE-AC
trigger vocabulary
CsTriggerKind, following its rename intom_code_specs0.12.0. The note itself stays — it records that CE-AC is not a gap and that its vocabulary is delivered as an annotation argument elsewhere, which is still worth stating. What the rename removes is the part a reader had to be told: the symbol now names its own package. - No API change: the library dartdoc now states dependency-freedom as an
invariant rather than a step still to be taken.
dependencies: {}and the absence of anyimportunderlib/are what letTomReportResultdecline to extendTomTabularResultand what put a job's CE-RP targets on@CsJob(targetReports:); five places already argued from that premise while the barrel promised the opposite. A class needing atom_core_*type is therefore not a gap class — it belongs in the package owning that type. - Two tests pin the invariant, so a single added import can no longer retract those two placement decisions without failing a check.
- Docs only: the README's CE-RP row no longer counts an "authorization key"
among the responsibilities that justify the gap.
TomReportDefinitiondeclines that field on purpose — authorization rides a@CsAuthorizebeside the@CsReportmarker (codespecs_mapping.md§5.15) — so the README was sending a reader to look for a field whose absence is the design. The absence is now stated rather than merely not-claimed, and tied to the rule it follows from: theCs*Reffamily lives intom_code_specs, andtom_core-family classes hold plain ids, so an edge wanting a typed ref belongs on the annotation. Same rule asTomJobDeclaration's report targets. - Docs only: the README's CE-LO row named six of the seven layout symbols,
dropping
TomLayoutNode— the sealed base that typesTomLayoutContainerNode.childrenandTomLayoutModel.findNode's return, and whose sealedness is what makes the two-layer reconcile exhaustive. A reader working from the README could see neither. The row now names it ahead of its two subtypes, so the hierarchy reads in order. - A test pins the inventory: every public top-level declaration under
lib/srcmust be named in the README. Only that direction is checkable — the README legitimately names types from other packages — but it is the direction that drifted, and dropping one name from a parenthesised list is exactly the edit review does not catch. - Docs only:
TomReportDefinition's construction checks were described in three places and agreed in none — the README counted three, the constructor dartdoc named a different three, and the completion record listed five. All three understated a constructor that rejects six defects. The dartdoc is now the one normative enumeration: it sits beside the code, so a seventh check is a diff a reviewer sees next to the list it belongs in. The README stops both counting and enumerating and points there instead, since a count repeated in prose is a count that goes stale. - Five tests close the gap the divergence hid. The empty-
reportIdcheck — the one all three descriptions omitted — had no test at all, and of the five namespaces_rejectDuplicatesguards only column name was exercised, so four could have been dropped from the call list without failing anything. The duplicate cases assert the message, not justArgumentError: a repeated dimension key also trips the key-claimed-by-both check, so a weaker matcher passes with the duplicate check deleted. - Docs only: three dartdoc sites and one CHANGELOG entry cited
codespecs_mapping.md§1.1b, which that document does not contain. The referent is §1.1's lettered pillar (b), carried as a bold inline marker under one heading rather than as a heading of its own. The package already wrote it correctly inREADME.md, so one passage was cited two ways. All four now match the README's§1.1 pillar (b). - The form was plausible because lettered sections are real in this tree —
acl_design_specification.mdgenuinely has## 26b.— so the convention was borrowed from a document that has it to one that does not.check_section_refscannot see that: it asks whether a§reference names a document, never whether the number is in it, which is why a citation naming the right file and the wrong section outlived the ones naming no file at all.
0.11.0 #
- Breaking: remove
TomUserSettings,TomUserSettingsStoreandTomMemoryUserSettingsStore(CE-UP). They were authored on the premise thattom_corehad neither a typed user-settings holder nor a server-side per-user persistence seam.tom_corenow ships the whole preferences plane —TomUserPreferencesoverTomUserPreferenceRepositoryscoped by@TomDbScope(field: 'principal_id')intom_core_server, withTomUserPreferenceDto,TomUserPreferenceKeysandtomUserPreferencesApi's four endpoints intom_core_kernel— so the seam here was a second, worse home for it: an in-memory map with no scope and no rows. - The holder was never needed either.
codespecs_mapping.md§5.16 authors a user setting as@CsUserSetting('user.preferredLanguage') String preferredLanguage = 'de';— the key is the annotation's own argument and the type and default are the member, exactly as a domain enum's default belongs to the member that has one.effectiveValue's persisted-value → default order isTomUserPreferences.getOr(key, <the member's initialiser>), anddisplayNamewas a label's second home, which the closed-vocabulary rule forbids (§1.2 consequence 1, §5.21). CE-UP is a reuse verdict, not a gap. csrb2's pinned gap-class inventory dropsuser_settings.dartand gains a CE-UP absence test, the shapecsrb7uses for domain enums.
0.10.0 #
- Breaking:
TomJobDeclaration.targetRefs(List<String>) is replaced byreadEntities/writtenEntities(List<Type>).codespecs_mapping.md§5.29 scope part 3 and §4.4.1 both required a job's targets to be compiler-checked; the shipped member was a string list, so a renamed entity silently stopped resolving. Entities are already Dart types, so they are cited asTypeliterals — §5.23 gives them noCs*Refconst by design, and aTypeneeds nothing butdart:core, so the package stays dependency-free. - Read and written targets are separate members, not one union.
SCJOB-WORKauthors them as two SOM fields and impact analysis needs the difference: a schema change breaks a writer differently from a reader.targetEntitiesis the deduplicated union for callers that only ask whether a job touches an entity at all. - A job's CE-RP report targets are not here — they ride
@CsJob(targetReports:)intom_code_specsasCsReportRefconsts, becausecodespecs_mapping.md§5.23 places theCs*Reffamily in the annotation parameter vocabulary, beside theCsMessageKeythat annotation already carries forfailureAlert.
0.9.0 #
- Breaking: remove
TomDomainEnum/TomDomainEnumValue(thedomainEnummember kind).codespecs_mapping.md§4.1 realises a domain enum as a plain Dartenum— a member declaration of the part that introduces it, with notom_corebasis to build on — andcodespecs_derivation_contract.md§3.1.1 emits exactly that. The holder was authored from a different reading of the same survey ("tom_corehas only mechanical enums, no domain-enum framework") and the two sides then disagreed about whether a class exists at all. The plain-enum arm stands, for a reason stronger than precedence: the holder had nothing to hold. Each of its fields belongs somewhere else, and belongs there exclusively — the value token is the enum constant's own identifier (no second string to drift from the name), the value label is CE-TX copy in the message-key registry like every other label (§1.2 consequence 1, §5.21), the description is the doc comment the generator writes, and a default belongs to the enum-typed member, since two members of the same type may default differently. Keeping the holder would have given value labels a second home, which the closed-vocabulary rule forbids. test/gap_class_inventory_test.dartdropsdomain_enum.dart— with it, the one entry that was marked verdict contested — and pins the removal the way CE-CC's is pinned, so re-adding the class means arguing with a test.
0.8.0 #
- Breaking: remove
TomClientConfiguration(CE-CC). It was authored whentom_corehad no per-machine client-configuration holder.tom_core_flutternow carries one —TomBaseClientConfigurationwithTomSetting<T>andTomClientConfigurationStore— so CE-CC is a reuse verdict (codespecs_mapping.md§4.1, §5.16) and keeping a second holder would breach the §1.1 pillar that a gap class exists only wheretom_coregenuinely lacks one. Nothing is lost in the trade: the reused holder has typed declaration, baseline resolution fromTomConfigResourceProvider, override-only persistence and per-field plus holder-wide observation, where this class had threeStringfields and two untyped maps. A@CsClientConfigCodeSpec now extendsTomBaseClientConfigurationand declares each setting indeclareSettings(). - Add
test/gap_class_inventory_test.dart, pinning the shipped gap-class files to the parts that justify them. A gap class is a verdict about another package, so it can go stale without anything here changing — which is exactly how CE-CC came to have two holders. The inventory makes adding or removing one an edit that has to be justified next to its part.
0.7.0 #
- csra8: add the CE-RP report model —
TomReportDefinitionwithTomReportDimension,TomReportMeasure,TomReportColumn,TomReportParameterandTomReportChart, plus the sharedTomReportResult/TomReportResultSectionenvelope and theTomReportValueKind/TomReportMeasureFunction/TomReportDeliveryChannel/TomReportChartKindclosed sets. CE-RP was promoted out ofcodespecs_mapping.md§4.3 on the finding that a grouped projection — dimensions and measures — has no authoring home in any active part:tom_core_server'sTomGroupedSelectsupplies the runtime grammar, but CE-DB's spec-authorable surface is row-shaped. - The envelope deliberately does not extend
tom_core_server'sTomTabularResult. Its locus is shared — the client renders a report too — and a shared type cannot depend on a server type, so the server adapts it one way onto the tabular shape when exporting. That is the CE-DB entity placement decision applied again. The adaptation is honoured in one inherited constraint: rows stay aStream, because a report exists for results too large to hold inline. TomReportMeasureFunctionis 1:1 withTomAggregateFunction, andCOUNT(*)/COUNT(DISTINCT c)are fields (columnName,distinct) rather than members — a measure the query layer cannot compile is a measure that cannot run, so the authorable set is exactly the compilable set.- Three checks run at construction, because each is a specification defect a
generator cannot repair: a column whose
sourceKeynames neither a dimension nor a measure, one key claimed by both, and a chart plotting a column the report does not project.
0.6.0 #
- csra7: add the CE-NT notification model —
TomNotificationType,TomNotificationChannelDeclaration,TomNotificationPreferences,TomNotificationCatalogand theTomNotificationCategory/TomNotificationUrgencyclosed sets. CE-NT was promoted out ofcodespecs_mapping.md§4.3 because its SOM section (NotificationModel) is a structured entry list, not free text. - Only the choosing layer is new.
tom_core_server'smessagingmodule already delivers on a named channel (TomMessage,TomMessageChannel,TomMessageRouter,TomMessageOutbox) and is reused as-is per pillar (b); what it has no home for is which types exist, which channels each goes out on, and how a user's preferences narrow that set. - Essentiality lives on the type (
isEssential), so a preference object can never be constructed into a state that silences something it must not. A mute or a global opt-out silences a type outright and can only reach a non-essential one — it is not a per-channel narrowing.
0.5.0 #
- csra3: make CE-UP single-moded and close the second half of its gap.
- Remove
TomUserSettingsPersistenceand thepersistence/isRoamingmembers fromTomUserSettings. They predate the settings re-cut and contradictcodespecs_mapping.md§11, which splits configuration and settings into four parts — one per scope key, each single-moded, with the scope key alone deciding where a value lives. The oldlocalarm is now CE-DS@CsDeviceSetting(a reuse verdict over existingtom_coreproperty/settings classes, so it is deliberately not re-created here); the oldroamingarm is the only meaning CE-UP has. - Add
TomUserSettingsStore+TomMemoryUserSettingsStore— the server-side per-user persistence seam.codespecs_mapping.md§4.1 names the CE-UP gap as "typed user-settings holder + server-side per-user persistence", and only the holder existed; the reused kernel carrier (TomGetSettingsMessage/TomGetSettingsResult) is a read-only bootstrap payload with no write-back path, so a user's chosen preference had nowhere to be stored. The user key is in every method signature because it is the scope — the siblingTomClientConfigurationStoredeliberately has no user parameter at all. - Add
TomUserSettings.effectiveValue, encodingcodespecs_mapping.md§5.16's intra-scope precedence for CE-UP (persisted user value → declared default). Avalueofnullmeans unset, not set to null. - Correct the
TomClientConfigurationdoc-comment, which distinguished CE-CC from "CE-UP roaming". The discriminator is user identity in the key: no user → CE-CC; per signed-in user → CE-DS or CE-UP.
- Remove
Breaking: TomUserSettingsPersistence is gone, and
TomUserSettings(persistence: …) / .isRoaming no longer compile.
0.4.0 #
- csra2: add the four remaining gap classes the
codespecs_mapping.md§4.1 catalogue marks gap, each re-verified against the currenttom_corebefore being written:TomLayoutModel(CE-LO,codespecs_mapping.md§5.2/§5.12/§5.22) — the two-layer layout holder: a generatedbasetree ofTomLayoutContainerNode/TomLayoutSlotNodeover the closed nineTomLayoutContainerKind, plus an authoredoverrideslayer of id-addressedTomLayoutOverrideDeltaover the closed fiveTomLayoutDeltaOp.reconcileWarnings()reports a delta whose target id has vanished and never drops it, so manual layout survives regeneration.tom_flutter_ui'sAclComponentis a rendering leaf holding a liveWidget— it has no base/override layering and no delta grammar.TomMessageKeyRegistry(CE-TX,codespecs_mapping.md§5.8/§5.21) — the closed message-key catalogue:TomMessageKeywith base copy, per-locale copy, declared parameters, the closedTomMessageRolefive andTomMessageCategorypair.resolve()falls back to base copy and never to the raw key, and rejects an uncatalogued key as a generation-time spec error; error copy must name its CE-ER code, because that namespace is the code namespace.tom_core_kernel'sTomTextResourceProvideris an untyped runtimeMap<String, dynamic>with no key vocabulary.TomRouteRegistry(CE-NV,codespecs_mapping.md§5.11) — the route-id registry (registerRouterejects a duplicate id;danglingRouteReferences()finds edges and assignments naming an unregistered route) plus the screen-flow model:TomFormScreenAssignment(replace vs popup) andTomScreenFlowEdge(per-TomFlowOutcomeconditional targets).tom_flutter_ui'sTomPageRouteis a bareMaterialPageRoutesubclass carrying no id.TomJobDeclaration(CE-JB,codespecs_mapping.md§5.29) — the deployment/ownership envelope (enabled,environments,serviceUnitId,targetRefs,runsIn()). Deliberately narrow:tom_core_kernel's scheduling module now supplies the whole runtime half (TomJobDefinition,TomSchedule,TomScheduler,TomJobStore,TomLeaseLock,TomJobDispatcher), which is reused as-is.
- CE-AC (Trigger) is confirmed not a gap and gets no class here —
codespecs_mapping.md§4.1 / §5.10 / §5.20 record "no gap — full action implementation reused". Its closed five-kind taxonomy ships asTriggerKindon@CsTriggerintom_code_specs0.5.0 instead.
0.3.0 #
- csm210-4-1 (wave-2 W10): add the CE-EN domain-enum gap class flagged gap by
the csm4 code-basis survey (
codespecs_mapping.md§5 —tom_core_kernelhas only mechanical enums, no domain-enum/value-object framework):TomDomainEnum— the holder a@CsEnum(CE-EN) CodeSpec is built on:enumId,displayName, an orderedvalueslist, optionaldefaultValueId, andhasValue(id).TomDomainEnumValue— one member: stablevalueId(wire/storage token) separated from displaylabel, plus optionaldescription.
- CE-DB stays a reuse verdict —
@CsTable/@CsColumn/@CsRepositoryare built directly ontom_core_serverpersistence classes, so CE-DB needs no gap class.
0.2.0 #
- csm2r7: add the first concrete gap classes for the four new csm2r5 parts
(survey
codespecs_mapping.md§1.1 pillar (b)). CE-AU (Authentication) and CE-CF (ServerConfiguration) reuse existingtom_coreclasses; the three parts with notom_coreholder land here:TomClientApplication(CE-CL) — client-application descriptor.TomClientConfiguration(CE-CC) — per-machine client config holder.TomUserSettings+enum TomUserSettingsPersistence { local, roaming }(CE-UP) — user-settings holder with thecodespecs_mapping.md§11local/roamingpersistence split (defaultroaming).
- The package is no longer an empty stub.
0.1.0 #
- Initial scaffold (csm3). Empty gap-filler package under
tom_core. - Gap classes are added by later CodeSpecs waves (csm4 surveys tom_core per part and identifies which structures belong here).