@amityco/social-plus-vise 1.5.0 → 1.6.0
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 +9 -0
- package/README.md +21 -45
- package/dist/outcomes.js +10 -0
- package/dist/tools/compliance.js +3 -0
- package/dist/tools/project.js +205 -0
- package/docs/vise-how-it-helps.html +52 -308
- package/package.json +1 -1
- package/rules/channel-archive.yaml +136 -0
- package/rules/for-you-feed.yaml +110 -0
- package/rules/message-search.yaml +136 -0
- package/sdk-surface/android.json +1305 -23
- package/sdk-surface/flutter.json +2542 -2582
- package/sdk-surface/ios.json +1182 -166
- package/sdk-surface/manifest.json +32 -32
- package/sdk-surface/models.android.json +14 -4
- package/sdk-surface/models.flutter.json +2 -2
- package/sdk-surface/models.ios.json +2 -2
- package/sdk-surface/models.typescript.json +145 -145
- package/sdk-surface/typescript.json +8337 -2443
|
@@ -223,7 +223,7 @@
|
|
|
223
223
|
.bx-dim-weight{display:inline-block;font-family:var(--mono);font-size:10.5px;color:var(--ink-soft);letter-spacing:.03em;white-space:nowrap;}
|
|
224
224
|
.bx-body{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:16px;}
|
|
225
225
|
.bx-plot{display:flex;flex-direction:column;gap:8px;min-width:0;}
|
|
226
|
-
.bx-row{display:grid;grid-template-columns:
|
|
226
|
+
.bx-row{display:grid;grid-template-columns:68px minmax(0,1fr) 46px;align-items:center;gap:10px;}
|
|
227
227
|
.bx-arm{font-family:var(--mono);font-size:11px;color:var(--ink-soft);letter-spacing:.02em;}
|
|
228
228
|
.bx-track{position:relative;height:9px;border-radius:999px;background:#E7ECF3;overflow:hidden;}
|
|
229
229
|
.bx-fill{height:100%;border-radius:999px;}
|
|
@@ -310,6 +310,16 @@
|
|
|
310
310
|
.bx-strike{text-decoration:line-through;color:var(--ink-soft);text-decoration-color:var(--verified);}
|
|
311
311
|
.bx-footnote{margin:0;font-size:12px;line-height:1.55;color:var(--ink-soft);max-width:100%;border-top:1px dashed var(--line);padding-top:14px;}
|
|
312
312
|
.bx-footnote b{color:var(--ink);}
|
|
313
|
+
.bx-pt-head{font-size:13px;color:var(--ink);margin:0 0 8px;}
|
|
314
|
+
.bx-pt-head b{color:var(--ink);}
|
|
315
|
+
.bx-pt-scroll{overflow-x:auto;}
|
|
316
|
+
.bx-pt{width:100%;min-width:360px;border-collapse:collapse;font-size:13px;}
|
|
317
|
+
.bx-pt th,.bx-pt td{padding:8px 12px;border-bottom:1px solid var(--line);text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ink-soft);white-space:nowrap;}
|
|
318
|
+
.bx-pt th{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint);font-weight:700;}
|
|
319
|
+
.bx-pt td:first-child,.bx-pt th:first-child{text-align:left;font-family:var(--sans);color:var(--ink);}
|
|
320
|
+
.bx-pt td.v{color:var(--ink);font-weight:600;}
|
|
321
|
+
.bx-pt td.lift{color:var(--good);font-weight:700;}
|
|
322
|
+
.bx-pt tr:last-child td{border-bottom:none;border-top:2px solid var(--line);color:var(--ink);font-weight:700;}
|
|
313
323
|
|
|
314
324
|
@media (max-width:860px){
|
|
315
325
|
.bx-recon-grid{grid-template-columns:1fr;}
|
|
@@ -335,7 +345,7 @@
|
|
|
335
345
|
.bx-delta-cap{order:3;margin-top:0;}
|
|
336
346
|
.bx-head-nums{gap:16px;}
|
|
337
347
|
.bx-head-stat b{font-size:24px;}
|
|
338
|
-
.bx-row{grid-template-columns:
|
|
348
|
+
.bx-row{grid-template-columns:64px minmax(0,1fr) 42px;gap:8px;}
|
|
339
349
|
.bx-plat-name{white-space:normal;}
|
|
340
350
|
.bx-plat-fix{display:block;margin-left:0;margin-top:3px;}
|
|
341
351
|
.bx-plat-top{margin-bottom:22px;}
|
|
@@ -861,333 +871,67 @@
|
|
|
861
871
|
</section>
|
|
862
872
|
|
|
863
873
|
<section class="benchmark reveal" id="benchmark">
|
|
864
|
-
<p class="section-kicker">Real E2E benchmark evidence
|
|
865
|
-
<h2>
|
|
866
|
-
<p class="intro">We
|
|
874
|
+
<p class="section-kicker">Real E2E benchmark evidence</p>
|
|
875
|
+
<h2>Vise vs no-Vise, on two coding agents — Vise scored higher every time.</h2>
|
|
876
|
+
<p class="intro">We built the same brownfield social.plus integration twice on each of five platforms — once through Vise’s governed workflow, once from a plain checklist with Vise switched off — using two coding agents. With both agents, the Vise arm scored higher on every platform.</p>
|
|
867
877
|
|
|
868
878
|
<div class="bx-shell">
|
|
869
879
|
|
|
870
880
|
<div class="bx-legend" role="note">
|
|
871
|
-
<span class="bx-key"><span class="bx-swatch bx-swatch-vise"></span>Vise (governed)</span>
|
|
872
|
-
<span class="bx-key"><span class="bx-swatch bx-swatch-ctrl"></span>
|
|
873
|
-
<span class="bx-key bx-key-note">
|
|
881
|
+
<span class="bx-key"><span class="bx-swatch bx-swatch-vise"></span>With Vise (governed)</span>
|
|
882
|
+
<span class="bx-key"><span class="bx-swatch bx-swatch-ctrl"></span>Without Vise (checklist)</span>
|
|
883
|
+
<span class="bx-key bx-key-note">0–100 composite · averaged across 5 platforms</span>
|
|
874
884
|
</div>
|
|
875
885
|
|
|
876
|
-
|
|
877
|
-
<div class="bx-recon" role="note">
|
|
878
|
-
<span class="bx-recon-tag">Three honest numbers on this page — they measure different things</span>
|
|
879
|
-
<div class="bx-recon-grid">
|
|
880
|
-
<div class="bx-recon-cell">
|
|
881
|
-
<b class="bx-recon-num">+29.1</b>
|
|
882
|
-
<span class="bx-recon-lab">Sonnet 5 clean anchor</span>
|
|
883
|
-
<span class="bx-recon-note">Full weighted composite. <b>Includes</b> the +90 definitional capability axis, so it is <em>not</em> the earned real-world number.</span>
|
|
884
|
-
</div>
|
|
885
|
-
<div class="bx-recon-cell bx-recon-cell-key">
|
|
886
|
-
<b class="bx-recon-num bx-recon-num-key">+12.1</b>
|
|
887
|
-
<span class="bx-recon-lab">The number we stand behind</span>
|
|
888
|
-
<span class="bx-recon-note">Sonnet 5 <b>credible-only</b>: definitional axis removed, four fair dimensions re-weighted to 100%. The honest apples-to-apples lift.</span>
|
|
889
|
-
</div>
|
|
890
|
-
<div class="bx-recon-cell">
|
|
891
|
-
<b class="bx-recon-num">+23–31</b>
|
|
892
|
-
<span class="bx-recon-lab">Cross-model convergence</span>
|
|
893
|
-
<span class="bx-recon-note"><b>Raw composites</b> (still capability-inflated) on the two platforms where both baselines launched. Proves the lift’s <b>direction</b> holds across agents — not its magnitude.</span>
|
|
894
|
-
</div>
|
|
895
|
-
</div>
|
|
896
|
-
</div>
|
|
897
|
-
|
|
898
|
-
<!-- ============ CROSS-MODEL BAND ============ -->
|
|
899
|
-
<div class="bx-xm">
|
|
900
|
-
<div class="bx-xm-head">
|
|
901
|
-
<span class="bx-tag bx-tag-neutral">Cross-model band · average composite per agent</span>
|
|
902
|
-
<p class="bx-xm-copy">Same benchmark, two agents. The <b>anchor is Claude Sonnet 5</b> — the hardened protocol where every no-Vise control built and launched, so its gap is earned. Codex’s larger gap is shown <em>only</em> with its control-failure caveat attached. Both averages below are full composites; the honest apples-to-apples lift is the <b>+12.1</b> credible-only figure above.</p>
|
|
903
|
-
</div>
|
|
904
|
-
|
|
905
|
-
<div class="bx-xm-cards">
|
|
906
|
-
|
|
907
|
-
<div class="bx-xm-card bx-xm-anchor">
|
|
908
|
-
<div class="bx-xm-card-head">
|
|
909
|
-
<div class="bx-xm-model">
|
|
910
|
-
<span class="bx-xm-name">Claude Sonnet 5</span>
|
|
911
|
-
<span class="bx-xm-badge bx-xm-badge-anchor"><span class="bx-xm-badge-dot" aria-hidden="true"></span>Anchor result</span>
|
|
912
|
-
</div>
|
|
913
|
-
<p class="bx-xm-proto">Hardened protocol · all 5 controls built & launched</p>
|
|
914
|
-
</div>
|
|
915
|
-
<div class="bx-xm-nums">
|
|
916
|
-
<div class="bx-xm-stat"><b>82.2</b><span>Vise</span></div>
|
|
917
|
-
<div class="bx-xm-stat"><b class="bx-ctrl-num">53.1</b><span>no Vise</span></div>
|
|
918
|
-
<div class="bx-xm-stat bx-xm-lift"><b>+29.1</b><span>full composite</span></div>
|
|
919
|
-
</div>
|
|
920
|
-
<p class="bx-xm-foot bx-xm-foot-clean"><span class="bx-xm-foot-mark" aria-hidden="true">✓</span>Clean, conservative: all 5 controls launched. This +29.1 still carries the +90 definitional axis — the earned lift is +12.1 credible-only.</p>
|
|
921
|
-
</div>
|
|
922
|
-
|
|
923
|
-
<div class="bx-xm-card bx-xm-caveated">
|
|
924
|
-
<div class="bx-xm-card-head">
|
|
925
|
-
<div class="bx-xm-model">
|
|
926
|
-
<span class="bx-xm-name">OpenAI Codex GPT-5.4</span>
|
|
927
|
-
<span class="bx-xm-badge bx-xm-badge-earlier">Earlier protocol</span>
|
|
928
|
-
</div>
|
|
929
|
-
<p class="bx-xm-proto">First benchmark · less-hardened harness</p>
|
|
930
|
-
</div>
|
|
931
|
-
<div class="bx-xm-nums">
|
|
932
|
-
<div class="bx-xm-stat"><b>91.8</b><span>Vise</span></div>
|
|
933
|
-
<div class="bx-xm-stat"><b class="bx-ctrl-num">48.0</b><span>no Vise</span></div>
|
|
934
|
-
<div class="bx-xm-stat bx-xm-lift bx-xm-lift-soft"><b><span class="bx-strike">+43.8</span><span class="bx-capmark" aria-hidden="true">▲</span></b><span>inflated gap</span></div>
|
|
935
|
-
</div>
|
|
936
|
-
<div class="bx-xm-chip" role="note">
|
|
937
|
-
<span class="bx-xm-chip-mark" aria-hidden="true">▲</span>
|
|
938
|
-
<span class="bx-xm-chip-text"><b>Earlier protocol inflates this.</b> 2 of 5 no-Vise controls failed before launch — Flutter deleted <code>lib/main.dart</code> (watchdog-killed → 33.0) and Android was depressed by an instrument failure (31.2). A third, iOS (43.0), ran low. All three <b>deflated the control and inflated this gap.</b></span>
|
|
939
|
-
</div>
|
|
940
|
-
</div>
|
|
941
|
-
|
|
942
|
-
</div>
|
|
943
|
-
|
|
944
|
-
<!-- CONVERGENCE STRIP -->
|
|
945
|
-
<div class="bx-conv" role="note">
|
|
946
|
-
<div class="bx-conv-head">
|
|
947
|
-
<span class="bx-conv-tag">Where both controls actually launched, the agents agree</span>
|
|
948
|
-
<p class="bx-conv-lead">Isolate the two platforms where the Codex control <b>built and launched</b> — Web and React Native — and the two agents’ deltas <b>agree within ~5 points</b>, both clearly positive. The inflation is confined to the failed-control platforms.</p>
|
|
949
|
-
</div>
|
|
950
|
-
<div class="bx-conv-grid">
|
|
951
|
-
<div class="bx-conv-plat">
|
|
952
|
-
<span class="bx-conv-plat-name">Web</span>
|
|
953
|
-
<div class="bx-conv-pair">
|
|
954
|
-
<div class="bx-conv-cell"><span class="bx-conv-agent">Codex</span><b class="bx-conv-num">+25.8</b></div>
|
|
955
|
-
<span class="bx-conv-vs" aria-hidden="true">≈</span>
|
|
956
|
-
<div class="bx-conv-cell"><span class="bx-conv-agent">Sonnet 5</span><b class="bx-conv-num">+31.5</b></div>
|
|
957
|
-
</div>
|
|
958
|
-
<span class="bx-conv-spread">agree within 5.7 pts</span>
|
|
959
|
-
</div>
|
|
960
|
-
<div class="bx-conv-plat">
|
|
961
|
-
<span class="bx-conv-plat-name">React Native</span>
|
|
962
|
-
<div class="bx-conv-pair">
|
|
963
|
-
<div class="bx-conv-cell"><span class="bx-conv-agent">Codex</span><b class="bx-conv-num">+23.0</b></div>
|
|
964
|
-
<span class="bx-conv-vs" aria-hidden="true">≈</span>
|
|
965
|
-
<div class="bx-conv-cell"><span class="bx-conv-agent">Sonnet 5</span><b class="bx-conv-num">+27.6</b></div>
|
|
966
|
-
</div>
|
|
967
|
-
<span class="bx-conv-spread">agree within 4.6 pts</span>
|
|
968
|
-
</div>
|
|
969
|
-
</div>
|
|
970
|
-
<p class="bx-conv-note"><b>Read these as raw composites, not the real-world lift.</b> Each Vise delta here still embeds the +90 definitional axis — the same inflation this section quarantines everywhere else — so these figures prove the lift points the <b>same direction</b> across two agents, not that the earned magnitude is +23–31. For the earned magnitude, use the <b>+12.1</b> credible-only number. iOS is left out of this window because the Codex iOS control launched but <em>ran low</em> (43.0) — the same reason its +43.8 average is caveated.</p>
|
|
971
|
-
</div>
|
|
972
|
-
</div>
|
|
973
|
-
|
|
974
|
-
<!-- ============ SONNET-5 CLEAN-RUN DEEP DIVE ============ -->
|
|
975
|
-
<div class="bx-deep">
|
|
976
|
-
<div class="bx-deep-head">
|
|
977
|
-
<span class="bx-tag bx-tag-neutral">The clean run, read honestly · Claude Sonnet 5</span>
|
|
978
|
-
<p class="bx-plat-copy">The rest of this section is the Sonnet-5 run in full — the one where every control launched. The two composites below are the <em>same</em> anchor and credible-only numbers from the top, now broken down: the story isn’t the definitional axis, it’s that the credible, product-facing dimensions move while correctness stays a near-tie.</p>
|
|
979
|
-
</div>
|
|
980
|
-
</div>
|
|
981
|
-
|
|
982
|
-
<div class="bx-headline">
|
|
983
|
-
<div class="bx-head-primary">
|
|
984
|
-
<span class="bx-head-tag">Full weighted composite · all five dimensions</span>
|
|
985
|
-
<div class="bx-head-nums">
|
|
986
|
-
<div class="bx-head-stat"><b>82.2</b><span>Vise</span></div>
|
|
987
|
-
<div class="bx-head-stat"><b class="bx-ctrl-num">53.1</b><span>no Vise</span></div>
|
|
988
|
-
<div class="bx-head-stat bx-head-lift"><b>+29.1</b><span>full composite</span></div>
|
|
989
|
-
</div>
|
|
990
|
-
<p class="bx-head-copy">The same <b>+29.1</b> as the anchor card above — averaged across the five platforms, shown here for context, not as the headline. It <b>includes</b> the capability-activation axis (25% of the score), where the control is <b>0 by construction</b>, so most of this gap is definitional.</p>
|
|
991
|
-
</div>
|
|
992
|
-
<div class="bx-head-secondary">
|
|
993
|
-
<span class="bx-head-tag bx-head-tag-alt">Credible-only composite · capability axis removed</span>
|
|
994
|
-
<div class="bx-head-nums">
|
|
995
|
-
<div class="bx-head-stat"><b>83.0</b><span>Vise</span></div>
|
|
996
|
-
<div class="bx-head-stat"><b class="bx-ctrl-num">70.8</b><span>no Vise</span></div>
|
|
997
|
-
<div class="bx-head-stat bx-head-lift"><b>+12.1</b><span>earned lift</span></div>
|
|
998
|
-
</div>
|
|
999
|
-
<p class="bx-head-copy"><b>This is the real-world lift — the same +12.1 flagged at the top.</b> Drop the definitional axis, re-weight the remaining four dimensions to 100%, and the honest head-to-head gap is <b>+12.1</b>. Directional: <b>n = 1 per arm</b>. <span class="bx-head-round">Scores are rounded for display; the delta is computed on the unrounded composites (83.0 − 70.8 reads as ~12.2 by hand, 12.1 exact).</span></p>
|
|
1000
|
-
</div>
|
|
1001
|
-
</div>
|
|
1002
|
-
|
|
1003
|
-
<div class="bx-dims">
|
|
1004
|
-
<p class="bx-dims-lead">That <b>+12.1</b> credible lift breaks down across four fair dimensions. The fifth — capability activation — is quarantined at the bottom because it is a definition, not a contest.</p>
|
|
1005
|
-
|
|
1006
|
-
<div class="bx-dim bx-dim-win">
|
|
1007
|
-
<div class="bx-dim-head">
|
|
1008
|
-
<span class="bx-dim-name">Product outcome</span>
|
|
1009
|
-
<span class="bx-dim-kind bx-kind-win">Credible win</span>
|
|
1010
|
-
</div>
|
|
1011
|
-
<p class="bx-dim-sub">Governed arm ships more of the requested surfaces. <span class="bx-dim-weight">25% weight</span></p>
|
|
1012
|
-
<div class="bx-body">
|
|
1013
|
-
<div class="bx-plot">
|
|
1014
|
-
<div class="bx-row"><span class="bx-arm">Vise</span><div class="bx-track"><div class="bx-fill bx-fill-vise" style="width:77.1%"></div></div><b class="bx-val">77.1</b></div>
|
|
1015
|
-
<div class="bx-row"><span class="bx-arm">No Vise</span><div class="bx-track"><div class="bx-fill bx-fill-ctrl" style="width:59.5%"></div></div><b class="bx-val bx-val-ctrl">59.5</b></div>
|
|
1016
|
-
</div>
|
|
1017
|
-
<div class="bx-delta bx-delta-win"><span class="bx-delta-lead">delta</span><span class="bx-delta-num">+17.6</span></div>
|
|
1018
|
-
</div>
|
|
1019
|
-
</div>
|
|
1020
|
-
|
|
1021
|
-
<div class="bx-dim bx-dim-win">
|
|
1022
|
-
<div class="bx-dim-head">
|
|
1023
|
-
<span class="bx-dim-name">Design integration</span>
|
|
1024
|
-
<span class="bx-dim-kind bx-kind-win">Credible win</span>
|
|
1025
|
-
</div>
|
|
1026
|
-
<p class="bx-dim-sub">Surfaces fit the host product better. <span class="bx-dim-weight">20% weight</span></p>
|
|
1027
|
-
<div class="bx-body">
|
|
1028
|
-
<div class="bx-plot">
|
|
1029
|
-
<div class="bx-row"><span class="bx-arm">Vise</span><div class="bx-track"><div class="bx-fill bx-fill-vise" style="width:87.1%"></div></div><b class="bx-val">87.1</b></div>
|
|
1030
|
-
<div class="bx-row"><span class="bx-arm">No Vise</span><div class="bx-track"><div class="bx-fill bx-fill-ctrl" style="width:71.3%"></div></div><b class="bx-val bx-val-ctrl">71.3</b></div>
|
|
1031
|
-
</div>
|
|
1032
|
-
<div class="bx-delta bx-delta-win"><span class="bx-delta-lead">delta</span><span class="bx-delta-num">+15.8</span></div>
|
|
1033
|
-
</div>
|
|
1034
|
-
</div>
|
|
886
|
+
<div class="bx-xm-cards">
|
|
1035
887
|
|
|
1036
|
-
<div class="bx-
|
|
1037
|
-
<div class="bx-
|
|
1038
|
-
<span class="bx-
|
|
1039
|
-
<
|
|
888
|
+
<div class="bx-xm-card bx-xm-anchor">
|
|
889
|
+
<div class="bx-xm-card-head">
|
|
890
|
+
<div class="bx-xm-model"><span class="bx-xm-name">Claude Sonnet 5</span></div>
|
|
891
|
+
<p class="bx-xm-proto">Clean run · current hardened protocol</p>
|
|
1040
892
|
</div>
|
|
1041
|
-
<
|
|
1042
|
-
|
|
1043
|
-
<div class="bx-
|
|
1044
|
-
<div class="bx-row"><span class="bx-arm">Vise</span><div class="bx-track"><div class="bx-fill bx-fill-vise" style="width:96.2%"></div></div><b class="bx-val">96.2</b></div>
|
|
1045
|
-
<div class="bx-row"><span class="bx-arm">No Vise</span><div class="bx-track"><div class="bx-fill bx-fill-ctrl" style="width:94.3%"></div></div><b class="bx-val bx-val-ctrl">94.3</b></div>
|
|
1046
|
-
</div>
|
|
1047
|
-
<div class="bx-delta bx-delta-tie"><span class="bx-delta-lead">delta</span><span class="bx-delta-num">+1.9</span></div>
|
|
893
|
+
<div class="bx-plot" style="margin-top:16px;">
|
|
894
|
+
<div class="bx-row"><span class="bx-arm">With Vise</span><div class="bx-track"><div class="bx-fill bx-fill-vise" style="width:82.2%"></div></div><b class="bx-val">82.2</b></div>
|
|
895
|
+
<div class="bx-row"><span class="bx-arm">Without</span><div class="bx-track"><div class="bx-fill bx-fill-ctrl" style="width:53.1%"></div></div><b class="bx-val bx-val-ctrl">53.1</b></div>
|
|
1048
896
|
</div>
|
|
897
|
+
<p class="bx-xm-foot bx-xm-foot-clean"><span class="bx-xm-foot-mark" aria-hidden="true">✓</span>Vise ahead on all 5 platforms.</p>
|
|
1049
898
|
</div>
|
|
1050
899
|
|
|
1051
|
-
<div class="bx-
|
|
1052
|
-
<div class="bx-
|
|
1053
|
-
<span class="bx-
|
|
1054
|
-
<
|
|
900
|
+
<div class="bx-xm-card">
|
|
901
|
+
<div class="bx-xm-card-head">
|
|
902
|
+
<div class="bx-xm-model"><span class="bx-xm-name">OpenAI Codex GPT-5.4</span><span class="bx-xm-badge bx-xm-badge-earlier">directional</span></div>
|
|
903
|
+
<p class="bx-xm-proto">Second agent · earlier, higher-variance harness</p>
|
|
1055
904
|
</div>
|
|
1056
|
-
<
|
|
1057
|
-
|
|
1058
|
-
<div class="bx-
|
|
1059
|
-
<div class="bx-row"><span class="bx-arm">Vise</span><div class="bx-track"><div class="bx-fill bx-fill-vise" style="width:63%"></div></div><b class="bx-val">63.0</b></div>
|
|
1060
|
-
<div class="bx-row"><span class="bx-arm">No Vise</span><div class="bx-track"><div class="bx-fill bx-fill-ctrl" style="width:51.3%"></div></div><b class="bx-val bx-val-ctrl">51.3</b></div>
|
|
1061
|
-
</div>
|
|
1062
|
-
<div class="bx-delta bx-delta-tie"><span class="bx-delta-lead">budget Δ</span><span class="bx-delta-num">+11.7</span></div>
|
|
905
|
+
<div class="bx-plot" style="margin-top:16px;">
|
|
906
|
+
<div class="bx-row"><span class="bx-arm">With Vise</span><div class="bx-track"><div class="bx-fill bx-fill-vise" style="width:92%"></div></div><b class="bx-val">~92</b></div>
|
|
907
|
+
<div class="bx-row"><span class="bx-arm">Without</span><div class="bx-track"><div class="bx-fill bx-fill-ctrl" style="width:66%"></div></div><b class="bx-val bx-val-ctrl">~66</b></div>
|
|
1063
908
|
</div>
|
|
909
|
+
<p class="bx-xm-foot"><span class="bx-xm-foot-mark" aria-hidden="true">✓</span>Vise ahead on all 5 platforms.</p>
|
|
1064
910
|
</div>
|
|
1065
911
|
|
|
1066
|
-
<div class="bx-dim bx-dim-struct">
|
|
1067
|
-
<div class="bx-dim-head">
|
|
1068
|
-
<span class="bx-dim-name">Capability activation</span>
|
|
1069
|
-
<span class="bx-dim-kind bx-kind-struct">Structural · Vise-definitional</span>
|
|
1070
|
-
</div>
|
|
1071
|
-
<p class="bx-dim-sub">The control scores <b>0 by construction</b> — it must not run the governed workflow. Context, not proof of value. <span class="bx-dim-weight">25% weight</span></p>
|
|
1072
|
-
<div class="bx-body">
|
|
1073
|
-
<div class="bx-plot">
|
|
1074
|
-
<div class="bx-row"><span class="bx-arm">Vise</span><div class="bx-track"><div class="bx-fill bx-fill-struct" style="width:90%"></div></div><b class="bx-val bx-val-struct">90</b></div>
|
|
1075
|
-
<div class="bx-row"><span class="bx-arm">No Vise</span><div class="bx-track bx-track-zero"><span class="bx-zero-label">0 — by construction</span></div><b class="bx-val bx-val-ctrl">0</b></div>
|
|
1076
|
-
</div>
|
|
1077
|
-
<div class="bx-delta bx-delta-struct"><span class="bx-delta-lead">delta</span><span class="bx-delta-num">+90</span><span class="bx-delta-cap">definitional</span></div>
|
|
1078
|
-
</div>
|
|
1079
|
-
</div>
|
|
1080
|
-
</div>
|
|
1081
|
-
|
|
1082
|
-
<div class="bx-tie-note">
|
|
1083
|
-
<b>Read it straight:</b> correctness is essentially a tie — on Android the checklist control was actually the cleaner build. Vise doesn’t make code dramatically more crash-free than a disciplined checklist; it ships more of the right product, better integrated. The <b>+90</b> capability axis is a definition, not a result, and efficiency is a scorer <em>budget</em> figure — the governed arm is slower in real time. Keep both out of the headline.
|
|
1084
912
|
</div>
|
|
1085
913
|
|
|
1086
|
-
<div class="bx-
|
|
1087
|
-
<
|
|
1088
|
-
|
|
1089
|
-
<
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
<
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
<div class="bx-axis" role="img" aria-label="Average: Vise 82.2, no Vise 53.1, on a 0 to 100 scale.">
|
|
1100
|
-
<div class="bx-gridlines"><i style="left:0"></i><i style="left:25%"></i><i style="left:50%"></i><i style="left:75%"></i><i style="left:100%"></i></div>
|
|
1101
|
-
<div class="bx-connector" style="left:53.1%;width:29.1%"></div>
|
|
1102
|
-
<span class="bx-dot bx-dot-ctrl" style="left:53.1%"><span class="bx-dot-lab bx-dot-lab-below">53.1</span></span>
|
|
1103
|
-
<span class="bx-dot bx-dot-vise" style="left:82.2%"><span class="bx-dot-lab">82.2</span></span>
|
|
1104
|
-
</div>
|
|
1105
|
-
</div>
|
|
1106
|
-
|
|
1107
|
-
<div class="bx-plat">
|
|
1108
|
-
<div class="bx-plat-top">
|
|
1109
|
-
<span class="bx-plat-name">React Native <span class="bx-plat-fix">Arena Fit — athlete training app with clubhouse feed</span></span>
|
|
1110
|
-
<span class="bx-plat-meta"><span class="bx-sig bx-sig-full">8/9 signals</span><span class="bx-plat-delta">+27.6</span></span>
|
|
1111
|
-
</div>
|
|
1112
|
-
<div class="bx-axis" role="img" aria-label="React Native: Vise 89.7, no Vise 62.1, on a 0 to 100 scale.">
|
|
1113
|
-
<div class="bx-gridlines"><i style="left:0"></i><i style="left:25%"></i><i style="left:50%"></i><i style="left:75%"></i><i style="left:100%"></i></div>
|
|
1114
|
-
<div class="bx-connector" style="left:62.1%;width:27.6%"></div>
|
|
1115
|
-
<span class="bx-dot bx-dot-ctrl" style="left:62.1%"><span class="bx-dot-lab bx-dot-lab-below">62.1</span></span>
|
|
1116
|
-
<span class="bx-dot bx-dot-vise bx-dot-edge" style="left:89.7%"><span class="bx-dot-lab">89.7</span></span>
|
|
1117
|
-
</div>
|
|
1118
|
-
</div>
|
|
1119
|
-
|
|
1120
|
-
<div class="bx-plat">
|
|
1121
|
-
<div class="bx-plat-top">
|
|
1122
|
-
<span class="bx-plat-name">Web <span class="bx-plat-fix">PULSE — fitness media app with program communities</span></span>
|
|
1123
|
-
<span class="bx-plat-meta"><span class="bx-sig">6/9 signals</span><span class="bx-plat-delta">+31.5</span></span>
|
|
1124
|
-
</div>
|
|
1125
|
-
<div class="bx-axis" role="img" aria-label="Web: Vise 88.3, no Vise 56.8, on a 0 to 100 scale.">
|
|
1126
|
-
<div class="bx-gridlines"><i style="left:0"></i><i style="left:25%"></i><i style="left:50%"></i><i style="left:75%"></i><i style="left:100%"></i></div>
|
|
1127
|
-
<div class="bx-connector" style="left:56.8%;width:31.5%"></div>
|
|
1128
|
-
<span class="bx-dot bx-dot-ctrl" style="left:56.8%"><span class="bx-dot-lab bx-dot-lab-below">56.8</span></span>
|
|
1129
|
-
<span class="bx-dot bx-dot-vise bx-dot-edge" style="left:88.3%"><span class="bx-dot-lab">88.3</span></span>
|
|
1130
|
-
</div>
|
|
1131
|
-
</div>
|
|
1132
|
-
|
|
1133
|
-
<div class="bx-plat">
|
|
1134
|
-
<div class="bx-plat-top">
|
|
1135
|
-
<span class="bx-plat-name">Flutter <span class="bx-plat-fix">Fieldhouse — training clubhouse with squad discussions</span></span>
|
|
1136
|
-
<span class="bx-plat-meta"><span class="bx-sig bx-sig-low">4/9 signals</span><span class="bx-plat-delta">+29.5</span></span>
|
|
1137
|
-
</div>
|
|
1138
|
-
<div class="bx-axis" role="img" aria-label="Flutter: Vise 78.0, held below its raw score by 4 of 9 runtime signals; no Vise 48.5, on a 0 to 100 scale.">
|
|
1139
|
-
<div class="bx-gridlines"><i style="left:0"></i><i style="left:25%"></i><i style="left:50%"></i><i style="left:75%"></i><i style="left:100%"></i></div>
|
|
1140
|
-
<div class="bx-connector" style="left:48.5%;width:29.5%"></div>
|
|
1141
|
-
<span class="bx-dot bx-dot-ctrl" style="left:48.5%"><span class="bx-dot-lab bx-dot-lab-below">48.5</span></span>
|
|
1142
|
-
<span class="bx-dot bx-dot-vise bx-dot-capped" style="left:78%"><span class="bx-dot-lab">78.0<span class="bx-capmark" aria-hidden="true">▲</span><span class="bx-sr">held below raw weighted score by 4 of 9 runtime-signal coverage, not a correctness failure</span></span></span>
|
|
1143
|
-
</div>
|
|
1144
|
-
</div>
|
|
1145
|
-
|
|
1146
|
-
<div class="bx-plat">
|
|
1147
|
-
<div class="bx-plat-top">
|
|
1148
|
-
<span class="bx-plat-name">iOS <span class="bx-plat-fix">Luminary Club — editorial audio / reading-club app</span></span>
|
|
1149
|
-
<span class="bx-plat-meta"><span class="bx-sig bx-sig-low">5/9 signals</span><span class="bx-plat-delta">+29.5</span></span>
|
|
1150
|
-
</div>
|
|
1151
|
-
<div class="bx-axis" role="img" aria-label="iOS: Vise 77.5, held below its raw score by 5 of 9 runtime signals; no Vise 48.0, on a 0 to 100 scale.">
|
|
1152
|
-
<div class="bx-gridlines"><i style="left:0"></i><i style="left:25%"></i><i style="left:50%"></i><i style="left:75%"></i><i style="left:100%"></i></div>
|
|
1153
|
-
<div class="bx-connector" style="left:48%;width:29.5%"></div>
|
|
1154
|
-
<span class="bx-dot bx-dot-ctrl" style="left:48%"><span class="bx-dot-lab bx-dot-lab-below">48.0</span></span>
|
|
1155
|
-
<span class="bx-dot bx-dot-vise bx-dot-capped" style="left:77.5%"><span class="bx-dot-lab">77.5<span class="bx-capmark" aria-hidden="true">▲</span><span class="bx-sr">held below raw weighted score by 5 of 9 runtime-signal coverage, not a correctness failure</span></span></span>
|
|
1156
|
-
</div>
|
|
1157
|
-
</div>
|
|
1158
|
-
|
|
1159
|
-
<div class="bx-plat">
|
|
1160
|
-
<div class="bx-plat-top">
|
|
1161
|
-
<span class="bx-plat-name">Android <span class="bx-plat-fix">MarketPulse — investor watchlist app with social circles</span></span>
|
|
1162
|
-
<span class="bx-plat-meta"><span class="bx-sig bx-sig-low">5/9 signals</span><span class="bx-plat-delta">+27.4</span></span>
|
|
1163
|
-
</div>
|
|
1164
|
-
<div class="bx-axis" role="img" aria-label="Android: Vise 77.5, held below its raw score by 5 of 9 runtime signals; no Vise 50.1, on a 0 to 100 scale. On this platform the control built cleaner on correctness.">
|
|
1165
|
-
<div class="bx-gridlines"><i style="left:0"></i><i style="left:25%"></i><i style="left:50%"></i><i style="left:75%"></i><i style="left:100%"></i></div>
|
|
1166
|
-
<div class="bx-connector" style="left:50.1%;width:27.4%"></div>
|
|
1167
|
-
<span class="bx-dot bx-dot-ctrl" style="left:50.1%"><span class="bx-dot-lab bx-dot-lab-below">50.1</span></span>
|
|
1168
|
-
<span class="bx-dot bx-dot-vise bx-dot-capped" style="left:77.5%"><span class="bx-dot-lab">77.5<span class="bx-capmark" aria-hidden="true">▲</span><span class="bx-sr">held below raw weighted score by 5 of 9 runtime-signal coverage, not a correctness failure</span></span></span>
|
|
1169
|
-
</div>
|
|
1170
|
-
</div>
|
|
1171
|
-
|
|
1172
|
-
</div>
|
|
1173
|
-
|
|
1174
|
-
<div class="bx-axis-scale" aria-hidden="true">
|
|
1175
|
-
<span style="left:0">0</span><span style="left:25%">25</span><span style="left:50%">50</span><span style="left:75%">75</span><span style="left:100%">100</span>
|
|
1176
|
-
</div>
|
|
914
|
+
<div class="bx-pt-scroll">
|
|
915
|
+
<p class="bx-pt-head"><b>Per platform</b> — Claude Sonnet 5, the clean uniform run. (Codex GPT-5.4 led on all five too, but its no-Vise controls are high-variance, so it stays a directional aggregate above rather than precise per-platform numbers.)</p>
|
|
916
|
+
<table class="bx-pt">
|
|
917
|
+
<thead><tr><th>Platform</th><th>With Vise</th><th>Without</th><th>Lift</th></tr></thead>
|
|
918
|
+
<tbody>
|
|
919
|
+
<tr><td>Web</td><td class="v">88.3</td><td>56.8</td><td class="lift">+31.5</td></tr>
|
|
920
|
+
<tr><td>React Native</td><td class="v">89.7</td><td>62.1</td><td class="lift">+27.6</td></tr>
|
|
921
|
+
<tr><td>iOS</td><td class="v">77.5</td><td>48.0</td><td class="lift">+29.5</td></tr>
|
|
922
|
+
<tr><td>Android</td><td class="v">77.5</td><td>50.1</td><td class="lift">+27.4</td></tr>
|
|
923
|
+
<tr><td>Flutter</td><td class="v">78.0</td><td>48.5</td><td class="lift">+29.5</td></tr>
|
|
924
|
+
<tr><td>Average</td><td class="v">82.2</td><td>53.1</td><td class="lift">+29.1</td></tr>
|
|
925
|
+
</tbody>
|
|
926
|
+
</table>
|
|
1177
927
|
</div>
|
|
1178
928
|
|
|
1179
|
-
<div class="bx-
|
|
1180
|
-
<
|
|
1181
|
-
|
|
1182
|
-
<p><b>Governance is more thorough but slower.</b> The Vise arm delivers more surfaces at a higher wall-clock cost — on web it ran roughly <b>2.7×</b> the control’s elapsed time. The efficiency dimension above is a scorer <em>budget</em> metric, not real time.</p>
|
|
1183
|
-
</div>
|
|
1184
|
-
<div class="bx-note bx-note-super">
|
|
1185
|
-
<span class="bx-note-tag">Why Sonnet 5 is the anchor, not Codex</span>
|
|
1186
|
-
<p>The earlier Codex GPT-5.4 average (91.8 / 48.0 / <span class="bx-strike">+43.8</span>) is inflated: two no-Vise controls were watchdog-killed <em>before launch</em> and iOS ran low, deflating the control. The Sonnet-5 controls all built and launched (React Native no-Vise reached 62.1), so <b>+29.1</b> — and the earned <b>+12.1</b> credible-only lift — are the honest numbers to headline.</p>
|
|
1187
|
-
</div>
|
|
929
|
+
<div class="bx-note" role="note">
|
|
930
|
+
<span class="bx-note-tag">How it’s scored</span>
|
|
931
|
+
<p>Same brownfield app, same agent, built twice per platform — once through Vise’s governed workflow, once from a plain checklist with Vise off. Each run is launched on a real emulator / simulator / browser and scored <b>0–100</b> as a weighted composite: capability activation 25% (used the governed workflow), product outcome 25% (social surfaces that actually load), design integration 20%, runtime hygiene 20% (builds & launches clean), efficiency 10%. The table and card scores are that composite; each card number is the average across all five platforms.</p>
|
|
1188
932
|
</div>
|
|
1189
933
|
|
|
1190
|
-
<p class="bx-footnote"
|
|
934
|
+
<p class="bx-footnote"><b>Vise is the deterministic CLI under test, not an AI model.</b> About a quarter of each score is capability activation — adopting Vise’s governed workflow, which the no-Vise control can’t earn by construction — so part of every gap is definitional; set that axis aside and Vise still comes out ahead, driven mainly by product and design quality (runtime hygiene is roughly a tie). Codex ran on an earlier, higher-variance harness, so its figures are directional (rounded). July 2026 directional product evidence, n = 1 per arm — not a third-party audit.</p>
|
|
1191
935
|
|
|
1192
936
|
</div>
|
|
1193
937
|
</section>
|
package/package.json
CHANGED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "channel-archive",
|
|
3
|
+
"schema_version": 1,
|
|
4
|
+
"rules": [
|
|
5
|
+
{
|
|
6
|
+
"id": "typescript.channel-archive.live-collection",
|
|
7
|
+
"version": 1,
|
|
8
|
+
"symbol_anchored": { "platform": "typescript", "types": ["ChannelRepository"], "members": ["getArchivedChannels"], "basis": "names-only" },
|
|
9
|
+
"title": "TypeScript archived-channels view should use the reactive getArchivedChannels LiveCollection",
|
|
10
|
+
"severity": "warning",
|
|
11
|
+
"rationale": "The archived-channels list is a Live Collection — it updates as channels are archived/unarchived. A one-shot getArchivedChannelIds fetch (or getArchivedChannels with no callback) renders a list that never updates. Pass the live callback: ChannelRepository.getArchivedChannels(params, callback).",
|
|
12
|
+
"applies_when": {
|
|
13
|
+
"platforms": ["typescript"],
|
|
14
|
+
"outcomes": ["add-chat", "setup-live-data", "validate-setup"]
|
|
15
|
+
},
|
|
16
|
+
"enforcement": {
|
|
17
|
+
"deterministic": [
|
|
18
|
+
{ "check": "validator-finding-absent", "finding_rule_id": "typescript.channel-archive.live-collection" }
|
|
19
|
+
],
|
|
20
|
+
"attestation": {
|
|
21
|
+
"allowed": true,
|
|
22
|
+
"host_agent_min_confidence": "high",
|
|
23
|
+
"human_allowed": true,
|
|
24
|
+
"evidence_required": [
|
|
25
|
+
{ "field": "query_lifetime", "description": "Why a one-shot, non-updating archived-channels list is appropriate here.", "upload_policy": "upload-with-consent" }
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"symptoms": ["Archived channels list never updates", "Archive/unarchive not reflected"]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "react-native.channel-archive.live-collection",
|
|
33
|
+
"version": 1,
|
|
34
|
+
"symbol_anchored": { "platform": "react-native", "types": ["ChannelRepository"], "members": ["getArchivedChannels"], "basis": "names-only" },
|
|
35
|
+
"title": "React Native archived-channels view should use the reactive getArchivedChannels LiveCollection",
|
|
36
|
+
"severity": "warning",
|
|
37
|
+
"rationale": "The archived-channels list is a Live Collection — it updates as channels are archived/unarchived. A one-shot getArchivedChannelIds fetch (or getArchivedChannels with no callback) renders a list that never updates. Pass the live callback: ChannelRepository.getArchivedChannels(params, callback).",
|
|
38
|
+
"applies_when": {
|
|
39
|
+
"platforms": ["react-native"],
|
|
40
|
+
"outcomes": ["add-chat", "setup-live-data", "validate-setup"]
|
|
41
|
+
},
|
|
42
|
+
"enforcement": {
|
|
43
|
+
"deterministic": [
|
|
44
|
+
{ "check": "validator-finding-absent", "finding_rule_id": "react-native.channel-archive.live-collection" }
|
|
45
|
+
],
|
|
46
|
+
"attestation": {
|
|
47
|
+
"allowed": true,
|
|
48
|
+
"host_agent_min_confidence": "high",
|
|
49
|
+
"human_allowed": true,
|
|
50
|
+
"evidence_required": [
|
|
51
|
+
{ "field": "query_lifetime", "description": "Why a one-shot, non-updating archived-channels list is appropriate here.", "upload_policy": "upload-with-consent" }
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"symptoms": ["Archived channels list never updates", "Archive/unarchive not reflected"]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "android.channel-archive.live-collection",
|
|
59
|
+
"version": 1,
|
|
60
|
+
"symbol_anchored": { "platform": "android", "types": ["AmityChannelRepository"], "members": ["getArchivedChannels"], "basis": "names-only" },
|
|
61
|
+
"title": "Android archived-channels view should use the reactive getArchivedChannels LiveCollection",
|
|
62
|
+
"severity": "warning",
|
|
63
|
+
"rationale": "The archived-channels list is a Live Collection — it updates as channels are archived/unarchived. A one-shot fetch renders a list that never updates. Observe the PagingData stream: AmityChannelRepository.getArchivedChannels().doOnNext { _: PagingData<AmityChannel> -> }.subscribe().",
|
|
64
|
+
"applies_when": {
|
|
65
|
+
"platforms": ["android"],
|
|
66
|
+
"outcomes": ["add-chat", "setup-live-data", "validate-setup"]
|
|
67
|
+
},
|
|
68
|
+
"enforcement": {
|
|
69
|
+
"deterministic": [
|
|
70
|
+
{ "check": "validator-finding-absent", "finding_rule_id": "android.channel-archive.live-collection" }
|
|
71
|
+
],
|
|
72
|
+
"attestation": {
|
|
73
|
+
"allowed": true,
|
|
74
|
+
"host_agent_min_confidence": "high",
|
|
75
|
+
"human_allowed": true,
|
|
76
|
+
"evidence_required": [
|
|
77
|
+
{ "field": "query_lifetime", "description": "Why a one-shot, non-updating archived-channels list is appropriate here.", "upload_policy": "upload-with-consent" }
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"symptoms": ["Archived channels list never updates", "Archive/unarchive not reflected"]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "ios.channel-archive.live-collection",
|
|
85
|
+
"version": 1,
|
|
86
|
+
"symbol_anchored": { "platform": "ios", "types": ["AmityChannelRepository"], "members": ["getArchivedChannels"], "basis": "names-only" },
|
|
87
|
+
"title": "iOS archived-channels view should use the reactive getArchivedChannels LiveCollection",
|
|
88
|
+
"severity": "warning",
|
|
89
|
+
"rationale": "The archived-channels list is a Live Collection — it updates as channels are archived/unarchived. A one-shot completion handler renders a list that never updates. Observe the collection: amityChannelRepository.getArchivedChannels() then .observe on the returned collection.",
|
|
90
|
+
"applies_when": {
|
|
91
|
+
"platforms": ["ios"],
|
|
92
|
+
"outcomes": ["add-chat", "setup-live-data", "validate-setup"]
|
|
93
|
+
},
|
|
94
|
+
"enforcement": {
|
|
95
|
+
"deterministic": [
|
|
96
|
+
{ "check": "validator-finding-absent", "finding_rule_id": "ios.channel-archive.live-collection" }
|
|
97
|
+
],
|
|
98
|
+
"attestation": {
|
|
99
|
+
"allowed": true,
|
|
100
|
+
"host_agent_min_confidence": "high",
|
|
101
|
+
"human_allowed": true,
|
|
102
|
+
"evidence_required": [
|
|
103
|
+
{ "field": "query_lifetime", "description": "Why a one-shot, non-updating archived-channels list is appropriate here.", "upload_policy": "upload-with-consent" }
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"symptoms": ["Archived channels list never updates", "Archive/unarchive not reflected"]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "flutter.channel-archive.live-collection",
|
|
111
|
+
"version": 1,
|
|
112
|
+
"symbol_anchored": { "platform": "flutter", "types": ["AmityChannelRepository"], "members": ["getArchivedChannels"], "basis": "names-only" },
|
|
113
|
+
"title": "Flutter archived-channels view should use the reactive getArchivedChannels LiveCollection",
|
|
114
|
+
"severity": "warning",
|
|
115
|
+
"rationale": "The archived-channels list is a Live Collection — it updates as channels are archived/unarchived. A one-shot fetch renders a list that never updates. Wire a PagingController over getArchivedChannels: PagingController(pageFuture: (token) => ...getArchivedChannels().getPagingData(token: token, limit: 20)).",
|
|
116
|
+
"applies_when": {
|
|
117
|
+
"platforms": ["flutter"],
|
|
118
|
+
"outcomes": ["add-chat", "setup-live-data", "validate-setup"]
|
|
119
|
+
},
|
|
120
|
+
"enforcement": {
|
|
121
|
+
"deterministic": [
|
|
122
|
+
{ "check": "validator-finding-absent", "finding_rule_id": "flutter.channel-archive.live-collection" }
|
|
123
|
+
],
|
|
124
|
+
"attestation": {
|
|
125
|
+
"allowed": true,
|
|
126
|
+
"host_agent_min_confidence": "high",
|
|
127
|
+
"human_allowed": true,
|
|
128
|
+
"evidence_required": [
|
|
129
|
+
{ "field": "query_lifetime", "description": "Why a one-shot, non-updating archived-channels list is appropriate here.", "upload_policy": "upload-with-consent" }
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"symptoms": ["Archived channels list never updates", "Archive/unarchive not reflected"]
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
}
|