@amityco/social-plus-vise 0.14.18 → 0.14.19

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@ All notable changes to `@amityco/social-plus-vise` are documented in this file.
4
4
 
5
5
  The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 0.14.19 — 2026-06-05
8
+
9
+ ### Changed
10
+ - **Deeper product-first chat/comments surface:** comment target resolution, chat channel source, chat observer cleanup, chat send failure handling, chat channel shape, and TypeScript/React Native chat message ordering now surface through shared product expectation IDs while preserving exact platform `contractRuleId`/`validator.sensorId` evidence.
11
+ - **Capability feed-forward expansion:** chat plans now preflight the new product expectations against bundled SDK surface facts before implementation, so agents see product-level expectations such as `chat.channel-target-resolved`, `chat.message-observer-cleanup`, and `chat.send-error-handling`.
12
+ - **Validation checklist clarity:** add-comments and add-chat validation lists no longer expose platform-specific primary IDs for the promoted target/lifecycle/send/channel-shape checks.
13
+
14
+ ### Verified
15
+ - Focused capability, product-flow, native-idiom, CLI, MCP, compliance, and rule-coverage suites passed. Product-flow now verifies plan and check output for the new shared chat/comment IDs with Android/TypeScript contract evidence.
16
+
7
17
  ## 0.14.18 — 2026-06-05
8
18
 
9
19
  ### Changed
package/README.md CHANGED
@@ -161,15 +161,15 @@ Aggregate: **98/99 expected feed capabilities** and **27/27 selected optional ca
161
161
 
162
162
  ### Current Release Validation
163
163
 
164
- Version 0.14.18 carries current release proof around the full feed-forward, product-expectation, and validation flow:
164
+ Version 0.14.19 carries current release proof around the full feed-forward, product-expectation, and validation flow:
165
165
 
166
166
  | Surface | What was validated |
167
167
  |---|---|
168
168
  | **Product flow** | Local end-to-end smoke covers design extraction, plan feed-forward, blocking intake, answered init, capability check, design conformance, and sensor discovery. |
169
169
  | **Plan questions** | Plans surface blocking questions such as `feature_surface` and `design_contract_confirmation`, plus optional choices such as `feed_optional_capabilities`. |
170
170
  | **Capability-to-sensor flow** | Vise checks platform support, matches the prompt to available capabilities, offers supported features as questions, records answers, and turns selected answers into sensors in `vise check`. |
171
- | **Shared product expectations** | Public IDs such as `feed.target-resolved`, `moderation.affordance-present`, `comments.thread-read-write`, and `chat.unread-visible` stay platform-agnostic while check results retain concrete `contractRuleId` and `validator.sensorId` evidence. |
172
- | **Rule detection** | TP-track dashboard detects **311/311 seeded rule gaps (100.0%)** in the static corpus. |
171
+ | **Shared product expectations** | Public IDs such as `feed.target-resolved`, `comments.target-resolved`, `comments.thread-read-write`, `chat.channel-target-resolved`, `chat.send-error-handling`, and `chat.unread-visible` stay platform-agnostic while check results retain concrete `contractRuleId` and `validator.sensorId` evidence. |
172
+ | **Rule detection** | TP-track dashboard detects **321/321 seeded rule gaps (100.0%)** in the static corpus. |
173
173
  | **Packed-package smoke** | Packed-package and host-agent smokes exercise the release tarball path, surfaced plan questions, selected optional capability sensors, rejected design confirmation handling, and exact contract-rule evidence for shared product expectations. |
174
174
 
175
175
  ### Supporting Proof
@@ -569,6 +569,20 @@ export const SHARED_PRODUCT_EXPECTATIONS = [
569
569
  deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
570
570
  hint: "implement the selected rich composer paths or record an explicit text-only/rich-post scope decision",
571
571
  },
572
+ {
573
+ id: "comments.target-resolved",
574
+ label: "Resolved comment target",
575
+ outcomes: ["add-comments"],
576
+ kind: "shared-expectation",
577
+ availability: [
578
+ {
579
+ label: "SDK comment target/query APIs",
580
+ symbols: [/\bgetComments\b/i, /\bqueryComments\b/i, /\bcreateComment\b/i, /\breferenceId\b/i, /\breferenceType\b/i],
581
+ },
582
+ ],
583
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
584
+ hint: "pass the parent post/story/custom entity id from navigation, props, or app state; do not invent postId/commentId literals",
585
+ },
572
586
  {
573
587
  id: "comments.thread-read-write",
574
588
  label: "Comment thread read/write",
@@ -581,6 +595,62 @@ export const SHARED_PRODUCT_EXPECTATIONS = [
581
595
  deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
582
596
  hint: "if comments are shown, pair the list with a composer and loading/error/empty states unless the surface is explicitly read-only",
583
597
  },
598
+ {
599
+ id: "chat.channel-target-resolved",
600
+ label: "Resolved chat channel",
601
+ outcomes: ["add-chat"],
602
+ kind: "shared-expectation",
603
+ availability: [
604
+ {
605
+ label: "SDK channel query/create APIs",
606
+ symbols: [/\bChannelRepository\b/i, /\bgetChannels\b/i, /\bqueryChannels\b/i, /\bcreateChannel\b/i, /\bchannelId\b/i, /\bconversationId\b/i],
607
+ },
608
+ ],
609
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
610
+ hint: "resolve channelId/conversationId from SDK queries, user selection, routing, or app-owned creation flow; do not hardcode it",
611
+ },
612
+ {
613
+ id: "chat.message-observer-cleanup",
614
+ label: "Chat message observer cleanup",
615
+ outcomes: ["add-chat"],
616
+ kind: "shared-expectation",
617
+ availability: [
618
+ {
619
+ label: "SDK message live query APIs",
620
+ symbols: [/\bMessageRepository\b/i, /\bgetMessages\b/i, /\bqueryMessages\b/i, /\bLiveCollection\b/i, /\bobserve\b/i, /\bsubscribe\b/i, /\bdispose\b/i, /\bunobserve\b/i],
621
+ },
622
+ ],
623
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
624
+ hint: "clean up message live collections/subscriptions on component unmount, view dismissal, or lifecycle disposal",
625
+ },
626
+ {
627
+ id: "chat.send-error-handling",
628
+ label: "Chat send failure handling",
629
+ outcomes: ["add-chat"],
630
+ kind: "shared-expectation",
631
+ availability: [
632
+ {
633
+ label: "SDK message send/failure state APIs",
634
+ symbols: [/\bMessageRepository\b/i, /\bcreate\w*Message\b/i, /\bsendMessage\b/i, /\bsyncState\b/i, /\bdeleteFailedMessages\b/i],
635
+ },
636
+ ],
637
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
638
+ hint: "surface failed sends with error state, retry/delete affordances, or SDK failure cleanup instead of assuming optimistic success",
639
+ },
640
+ {
641
+ id: "chat.channel-shape-matched",
642
+ label: "Chat channel shape",
643
+ outcomes: ["add-chat"],
644
+ kind: "shared-expectation",
645
+ availability: [
646
+ {
647
+ label: "SDK channel type APIs",
648
+ symbols: [/\bchannelType\b/i, /\bChannelType\b/i, /\bAmityChannelType\b/i, /\bconversation\b/i, /\bcommunity\b/i, /\bbroadcast\b/i],
649
+ },
650
+ ],
651
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
652
+ hint: "match the SDK channel type to the selected chat shape: conversation for direct messages, community/group for shared channels, broadcast where applicable",
653
+ },
584
654
  {
585
655
  id: "chat.unread-visible",
586
656
  label: "Chat unread counts",
package/dist/outcomes.js CHANGED
@@ -793,7 +793,7 @@ const addComments = {
793
793
  validation: (platform) => [
794
794
  "comment target resolved",
795
795
  "no invented postId/commentId",
796
- `${platform}.comments.target-resolved`,
796
+ "comments.target-resolved",
797
797
  "comments.thread-read-write",
798
798
  "moderation.affordance-present",
799
799
  "pagination.cursor-opaque",
@@ -1025,9 +1025,10 @@ const addChat = {
1025
1025
  ];
1026
1026
  },
1027
1027
  validation: (platform) => [
1028
- `${platform}.chat.channel-target-resolved`,
1029
- `${platform}.chat.message-observer-cleanup`,
1030
- `${platform}.chat.send-error-handling`,
1028
+ "chat.channel-target-resolved",
1029
+ "chat.message-observer-cleanup",
1030
+ "chat.send-error-handling",
1031
+ "chat.channel-shape-matched",
1031
1032
  "moderation.affordance-present",
1032
1033
  "unread.server-synced",
1033
1034
  "pagination.cursor-opaque",
@@ -8,7 +8,12 @@ export const PRODUCT_EXPECTATION_TITLES = {
8
8
  "unread.server-synced": "Unread counts use the server-synced stream",
9
9
  "feed.rich-post-rendering": "Feed renders rich post types",
10
10
  "feed.rich-post-composer-scope": "Feed composer surfaces rich post scope",
11
+ "comments.target-resolved": "Comment target comes from the parent entity",
11
12
  "comments.thread-read-write": "Comment threads support reading and creation",
13
+ "chat.channel-target-resolved": "Chat channel comes from app state",
14
+ "chat.message-observer-cleanup": "Chat message observers clean up on lifecycle end",
15
+ "chat.send-error-handling": "Chat send failures are handled",
16
+ "chat.channel-shape-matched": "Chat channel type matches the requested shape",
12
17
  "chat.unread-visible": "Chat unread counts are visible",
13
18
  "chat.message-order-explicit": "Chat message order is explicit",
14
19
  "profile.social-counts": "Profile social counts come from the SDK",
@@ -163,6 +168,13 @@ export const PRODUCT_EXPECTATION_BINDINGS = [
163
168
  sensorId: "ios.feed.rich-post-composer-surfaced",
164
169
  platform: "ios",
165
170
  },
171
+ ...platformBindings("comments.target-resolved", {
172
+ typescript: "typescript.comments.target-resolved",
173
+ "react-native": "react-native.comments.target-resolved",
174
+ android: "android.comments.target-resolved",
175
+ flutter: "flutter.comments.target-resolved",
176
+ ios: "ios.comments.target-resolved",
177
+ }),
166
178
  {
167
179
  expectationId: "comments.thread-read-write",
168
180
  sensorId: "typescript.comments.query-has-limit",
@@ -268,6 +280,34 @@ export const PRODUCT_EXPECTATION_BINDINGS = [
268
280
  sensorId: "ios.comments.ui-states-present",
269
281
  platform: "ios",
270
282
  },
283
+ ...platformBindings("chat.channel-target-resolved", {
284
+ typescript: "typescript.chat.channel-target-resolved",
285
+ "react-native": "react-native.chat.channel-target-resolved",
286
+ android: "android.chat.channel-target-resolved",
287
+ flutter: "flutter.chat.channel-target-resolved",
288
+ ios: "ios.chat.channel-target-resolved",
289
+ }),
290
+ ...platformBindings("chat.message-observer-cleanup", {
291
+ typescript: "typescript.chat.message-observer-cleanup",
292
+ "react-native": "react-native.chat.message-observer-cleanup",
293
+ android: "android.chat.message-observer-cleanup",
294
+ flutter: "flutter.chat.message-observer-cleanup",
295
+ ios: "ios.chat.message-observer-cleanup",
296
+ }),
297
+ ...platformBindings("chat.send-error-handling", {
298
+ typescript: "typescript.chat.send-error-handling",
299
+ "react-native": "react-native.chat.send-error-handling",
300
+ android: "android.chat.send-error-handling",
301
+ flutter: "flutter.chat.send-error-handling",
302
+ ios: "ios.chat.send-error-handling",
303
+ }),
304
+ ...platformBindings("chat.channel-shape-matched", {
305
+ typescript: ["typescript.channel.type-matches-shape", "typescript.chat.channel-type-dm"],
306
+ "react-native": ["react-native.channel.type-matches-shape", "react-native.chat.channel-type-dm"],
307
+ android: "android.channel.type-matches-shape",
308
+ flutter: "flutter.channel.type-matches-shape",
309
+ ios: "ios.channel.type-matches-shape",
310
+ }),
271
311
  {
272
312
  expectationId: "chat.unread-visible",
273
313
  sensorId: "typescript.chat.unread-visible",
@@ -293,6 +333,16 @@ export const PRODUCT_EXPECTATION_BINDINGS = [
293
333
  sensorId: "ios.chat.unread-visible",
294
334
  platform: "ios",
295
335
  },
336
+ {
337
+ expectationId: "chat.message-order-explicit",
338
+ sensorId: "typescript.chat.sort-explicit",
339
+ platform: "typescript",
340
+ },
341
+ {
342
+ expectationId: "chat.message-order-explicit",
343
+ sensorId: "react-native.chat.sort-explicit",
344
+ platform: "react-native",
345
+ },
296
346
  {
297
347
  expectationId: "chat.message-order-explicit",
298
348
  sensorId: "android.chat.sort-explicit",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/social-plus-vise",
3
- "version": "0.14.18",
3
+ "version": "0.14.19",
4
4
  "description": "Skill-guided deterministic CLI for social.plus SDK integration assistance.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",