Reframe the interface around composed posts, not republished entries
The channel publishes a post written from a hall entry -- condensed, personal, reach-optimized -- not the entry itself. That changes what this interface is for and where its boundary sits. Composition is deliberately outside the interface. Composing is a probabilistic editorial task, and Blueprint 48.1 forbids an LLM in the mandatory request path, so an interface that composed on demand would be non-deterministic exactly where determinism is the whole claim. It is also editorial: a post speaks about a named person's work in HelixForge's voice, and a review step inside the request path is a review step nobody performs. The contract now takes a composed post with a required reviewer, a cited source entry and a consent basis. A post carrying none of those is refused. Absence of objection is not consent, and in an audit trail an unfaithful post looks exactly like a faithful one -- the defence is that a human read it, the source is named, and both are recorded. The first experiment is rebuilt accordingly. The old competition asked how to fit a whole entry into Telegram; that question no longer exists. The new one asks whether the portrait earns the 3072 characters of caption limit it costs, which is a delivery question this interface actually owns. Competition over editorial voice belongs to the campaign and runs on the per-variant engagement this interface reports. Adds T05b (composition and review), T05c (consent basis for the 94 existing participants, blocking public publication) and T11 (extracting the campaign into pr-hall-of-helix). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014KmVxhJ35tCo7rE7UnLwWu Assistant: claude-code Assistant-Model: opus Assistant-Process: 1116572@bnt-lap001 Assistant-Session: 8ba9bb93-a72a-4883-b189-2499cce5c400
This commit is contained in:
parent
aa95a09ab6
commit
3aa8cb7eaf
14 changed files with 793 additions and 521 deletions
|
|
@ -1,125 +0,0 @@
|
|||
# Competing hypothesis B, in group CG-tg-length.
|
||||
fluid_hypothesis:
|
||||
schema_version: "0.1"
|
||||
|
||||
id: "H-tg-serial"
|
||||
interface_id: "helix-forge-telegram-publishing"
|
||||
state: "DRAFT"
|
||||
|
||||
title: "The whole entry in the channel serves readers better than a link"
|
||||
|
||||
observation:
|
||||
summary: >
|
||||
85% of hall entries exceed Telegram's 4096-character message limit, with
|
||||
a median body of 5767 characters. The interface must choose a form for
|
||||
long entries before it can publish at all.
|
||||
evidence_refs:
|
||||
- "measurement:hall-of-helix/entries@2026-09-04"
|
||||
- "pressure:P-tg-length"
|
||||
affected_cohorts:
|
||||
- "telegram-subscribers"
|
||||
|
||||
pressure:
|
||||
classes:
|
||||
- "missing_interface_capability"
|
||||
pressure_refs:
|
||||
- "P-tg-length"
|
||||
severity: 0.85
|
||||
confidence: 1.0
|
||||
|
||||
explanation:
|
||||
claim: >
|
||||
A link out of Telegram is a cost most readers will not pay. Telegram's
|
||||
rich-text posts are built for long-form reading and the audience is
|
||||
already there. Serializing the entry across a small number of linked
|
||||
messages keeps the whole account where the reader is, and the median
|
||||
entry needs only two.
|
||||
reach:
|
||||
score: 0.5
|
||||
explains:
|
||||
- "P-tg-length"
|
||||
notes: >
|
||||
Medium reach. It answers the length constraint natively but does not
|
||||
transfer to platforms with harder limits.
|
||||
|
||||
proposed_adaptation:
|
||||
class: "presentation"
|
||||
summary: >
|
||||
Split the entry at section boundaries into a small number of rich-text
|
||||
messages, each linked to the previous, with the visual attached to the
|
||||
first.
|
||||
implementation_scope: "interface_only"
|
||||
|
||||
backend_requirements:
|
||||
required: false
|
||||
requirement_refs: []
|
||||
|
||||
expected_outcomes:
|
||||
- metric: "read_through_rate"
|
||||
cohort: "telegram-subscribers"
|
||||
target: 0.15
|
||||
direction: "higher"
|
||||
- metric: "messages_per_entry"
|
||||
cohort: "all"
|
||||
baseline: 1.0
|
||||
target: 2.0
|
||||
direction: "higher"
|
||||
|
||||
guardrails:
|
||||
- metric: "entry_content_loss"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "error_rate"
|
||||
operator: "<="
|
||||
threshold: 0.01
|
||||
- metric: "messages_per_entry"
|
||||
operator: "<="
|
||||
threshold: 4
|
||||
|
||||
fitness_dimensions:
|
||||
expected:
|
||||
client_utility: 0.5
|
||||
discoverability: 0.3
|
||||
simplicity: -0.2
|
||||
correctness: 0.0
|
||||
security: 0.0
|
||||
|
||||
complexity:
|
||||
expected_delta:
|
||||
operation_count: 0
|
||||
concept_count: 1
|
||||
alternative_path_count: 1
|
||||
cognitive_load: 0.2
|
||||
score: 0.3
|
||||
|
||||
risk:
|
||||
level: "LOW"
|
||||
reasons:
|
||||
- "presentation only"
|
||||
- "splitting can lose meaning at a bad boundary; guarded by content-loss check"
|
||||
|
||||
economics:
|
||||
estimated_experiment_cost: 0.0
|
||||
estimated_implementation_cost: 0.0
|
||||
currency: "EUR"
|
||||
expected_value_class: "MEDIUM"
|
||||
|
||||
learning_value:
|
||||
score: 0.8
|
||||
notes: >
|
||||
Tests whether an audience will read long-form in place, which is the
|
||||
question behind every publishing interface HelixForge will build.
|
||||
|
||||
success_criteria:
|
||||
expression: >
|
||||
read_through_rate >= 0.15 AND messages_per_entry <= 4 AND no guardrail violation
|
||||
|
||||
failure_criteria:
|
||||
expression: >
|
||||
any hard guardrail violation
|
||||
OR read_through_rate below the teaser alternative over the same window
|
||||
|
||||
outcome:
|
||||
status: null
|
||||
summary: null
|
||||
evidence_refs: []
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
# Competing hypothesis A, in group CG-tg-length.
|
||||
#
|
||||
# Create with:
|
||||
# fluid hypothesis create --file hypotheses/H-tg-teaser.yaml
|
||||
# fluid hypothesis compete --group CG-tg-length H-tg-teaser H-tg-serial
|
||||
fluid_hypothesis:
|
||||
schema_version: "0.1"
|
||||
|
||||
id: "H-tg-teaser"
|
||||
interface_id: "helix-forge-telegram-publishing"
|
||||
state: "DRAFT"
|
||||
|
||||
title: "A teaser and a link serve readers better than the whole entry"
|
||||
|
||||
observation:
|
||||
summary: >
|
||||
85% of hall entries exceed Telegram's 4096-character message limit, with
|
||||
a median body of 5767 characters. The interface must choose a form for
|
||||
long entries before it can publish at all.
|
||||
evidence_refs:
|
||||
- "measurement:hall-of-helix/entries@2026-09-04"
|
||||
- "pressure:P-tg-length"
|
||||
affected_cohorts:
|
||||
- "telegram-subscribers"
|
||||
|
||||
pressure:
|
||||
classes:
|
||||
- "missing_interface_capability"
|
||||
pressure_refs:
|
||||
- "P-tg-length"
|
||||
severity: 0.85
|
||||
confidence: 1.0
|
||||
|
||||
explanation:
|
||||
claim: >
|
||||
A channel post is scanned, not read. A hall entry is a considered
|
||||
first-person account that rewards attention. Presenting an opening and a
|
||||
link lets a reader decide to give it that attention somewhere designed
|
||||
for reading, rather than committing to a wall of text in a feed.
|
||||
reach:
|
||||
score: 0.5
|
||||
explains:
|
||||
- "P-tg-length"
|
||||
notes: >
|
||||
Medium reach. It answers the length constraint and would answer the
|
||||
same constraint on X, but it does not address entries with visuals or
|
||||
entries readers might want to keep in the channel.
|
||||
|
||||
proposed_adaptation:
|
||||
class: "presentation"
|
||||
summary: >
|
||||
Publish the title, the display name, the opening of the entry, and a link
|
||||
to the full entry in hall-of-helix.
|
||||
implementation_scope: "interface_only"
|
||||
|
||||
backend_requirements:
|
||||
required: false
|
||||
requirement_refs: []
|
||||
|
||||
expected_outcomes:
|
||||
- metric: "read_through_rate"
|
||||
cohort: "telegram-subscribers"
|
||||
target: 0.15
|
||||
direction: "higher"
|
||||
- metric: "messages_per_entry"
|
||||
cohort: "all"
|
||||
baseline: 2.0
|
||||
target: 1.0
|
||||
direction: "lower"
|
||||
|
||||
guardrails:
|
||||
- metric: "entry_content_loss"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "error_rate"
|
||||
operator: "<="
|
||||
threshold: 0.01
|
||||
|
||||
fitness_dimensions:
|
||||
expected:
|
||||
client_utility: 0.4
|
||||
discoverability: 0.5
|
||||
simplicity: 0.6
|
||||
correctness: 0.0
|
||||
security: 0.0
|
||||
|
||||
complexity:
|
||||
expected_delta:
|
||||
operation_count: 0
|
||||
concept_count: 0
|
||||
cognitive_load: -0.1
|
||||
score: 0.05
|
||||
|
||||
risk:
|
||||
level: "LOW"
|
||||
reasons:
|
||||
- "presentation only; no contract or authorization change"
|
||||
- "fully reversible by replacing the revision"
|
||||
|
||||
economics:
|
||||
estimated_experiment_cost: 0.0
|
||||
estimated_implementation_cost: 0.0
|
||||
currency: "EUR"
|
||||
expected_value_class: "MEDIUM"
|
||||
|
||||
learning_value:
|
||||
score: 0.8
|
||||
notes: >
|
||||
Whichever way this resolves, the answer transfers directly to
|
||||
fluid-x and fluid-substack, which face the same problem under
|
||||
different constraints.
|
||||
|
||||
success_criteria:
|
||||
expression: >
|
||||
read_through_rate >= 0.15 AND no guardrail violation
|
||||
|
||||
failure_criteria:
|
||||
expression: >
|
||||
any hard guardrail violation
|
||||
OR read_through_rate below the serialized alternative over the same window
|
||||
|
||||
outcome:
|
||||
status: null
|
||||
summary: null
|
||||
evidence_refs: []
|
||||
122
hypotheses/H-tg-textonly.yaml
Normal file
122
hypotheses/H-tg-textonly.yaml
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
fluid_hypothesis:
|
||||
schema_version: "0.1"
|
||||
|
||||
id: "H-tg-textonly"
|
||||
interface_id: "helix-forge-telegram-publishing"
|
||||
state: "DRAFT"
|
||||
|
||||
title: "Text alone reaches further than a post constrained by a caption"
|
||||
|
||||
observation:
|
||||
summary: >
|
||||
Telegram limits a photo caption to 1024 characters, a quarter of the 4096 available to a text message. Attaching a portrait therefore constrains the composition it accompanies, and a post written to 1024 characters is a different piece of writing from one written to 4096.
|
||||
evidence_refs:
|
||||
- "canon:fluid-telegram/TelegramCapabilityCanon.md#MED-01"
|
||||
- "pressure:P-register"
|
||||
affected_cohorts:
|
||||
- "telegram-subscribers"
|
||||
|
||||
pressure:
|
||||
classes:
|
||||
- "repeated_expectation_mismatch"
|
||||
pressure_refs:
|
||||
- "P-register"
|
||||
severity: 0.6
|
||||
confidence: 0.7
|
||||
|
||||
explanation:
|
||||
claim: >
|
||||
The scarce resource in a condensed post is room to say something specific. A generated portrait is decorative and interchangeable across entries; a concrete detail about what someone actually did is not. Trading three quarters of the available text for a picture spends the thing that makes a post worth reading on the thing that makes it look like everything else in the feed.
|
||||
reach:
|
||||
score: 0.4
|
||||
explains:
|
||||
- "P-register"
|
||||
notes: >
|
||||
Narrow but clean. It settles one delivery question decisively, and the
|
||||
answer transfers to fluid-x and fluid-substack, which face the same
|
||||
question under different feeds.
|
||||
|
||||
proposed_adaptation:
|
||||
class: "presentation"
|
||||
summary: >
|
||||
Publish the post as a text message with a link to the source entry, and no attached visual.
|
||||
implementation_scope: "interface_only"
|
||||
|
||||
backend_requirements:
|
||||
required: false
|
||||
requirement_refs: []
|
||||
|
||||
expected_outcomes:
|
||||
- metric: "engagement_rate"
|
||||
cohort: "telegram-subscribers"
|
||||
target: 0.05
|
||||
direction: "higher"
|
||||
- metric: "source_link_rate"
|
||||
cohort: "telegram-subscribers"
|
||||
target: 0.02
|
||||
direction: "higher"
|
||||
|
||||
guardrails:
|
||||
- metric: "unreviewed_publication"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "missing_source_attribution"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "missing_subject_consent"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "error_rate"
|
||||
operator: "<="
|
||||
threshold: 0.01
|
||||
|
||||
fitness_dimensions:
|
||||
expected:
|
||||
client_utility: 0.2
|
||||
discoverability: 0.3
|
||||
simplicity: 0.3
|
||||
correctness: 0.0
|
||||
security: 0.0
|
||||
|
||||
complexity:
|
||||
expected_delta:
|
||||
operation_count: 0
|
||||
concept_count: 0
|
||||
cognitive_load: 0.1
|
||||
score: 0.05
|
||||
|
||||
risk:
|
||||
level: "LOW"
|
||||
reasons:
|
||||
- "presentation only; no contract, authorization or consent change"
|
||||
- "the simpler arm; nothing to attach and nothing to fail"
|
||||
|
||||
economics:
|
||||
estimated_experiment_cost: 0.0
|
||||
estimated_implementation_cost: 0.0
|
||||
currency: "EUR"
|
||||
expected_value_class: "MEDIUM"
|
||||
|
||||
learning_value:
|
||||
score: 0.7
|
||||
notes: >
|
||||
If this wins, the campaign stops producing portraits for publication and spends that effort on the writing instead.
|
||||
|
||||
success_criteria:
|
||||
expression: >
|
||||
engagement_rate >= 0.05 AND no guardrail violation
|
||||
|
||||
failure_criteria:
|
||||
expression: >
|
||||
any hard guardrail violation
|
||||
OR engagement_rate at or below the rival arm over the same window
|
||||
|
||||
competition:
|
||||
group_id: "CG-tg-delivery"
|
||||
alternatives:
|
||||
- "H-tg-visual"
|
||||
|
||||
outcome:
|
||||
status: null
|
||||
summary: null
|
||||
evidence_refs: []
|
||||
122
hypotheses/H-tg-visual.yaml
Normal file
122
hypotheses/H-tg-visual.yaml
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
fluid_hypothesis:
|
||||
schema_version: "0.1"
|
||||
|
||||
id: "H-tg-visual"
|
||||
interface_id: "helix-forge-telegram-publishing"
|
||||
state: "DRAFT"
|
||||
|
||||
title: "A post carrying its portrait reaches further than text alone"
|
||||
|
||||
observation:
|
||||
summary: >
|
||||
72 of 94 hall entries already carry a generated portrait, produced from the entry's own visual prompt. Telegram renders images inline and its feed is scanned rather than read, so a post with a portrait occupies more of a scrolling reader's attention than one without.
|
||||
evidence_refs:
|
||||
- "measurement:hall-of-helix/visuals@2026-09-04"
|
||||
- "pressure:P-register"
|
||||
affected_cohorts:
|
||||
- "telegram-subscribers"
|
||||
|
||||
pressure:
|
||||
classes:
|
||||
- "repeated_expectation_mismatch"
|
||||
pressure_refs:
|
||||
- "P-register"
|
||||
severity: 0.6
|
||||
confidence: 0.7
|
||||
|
||||
explanation:
|
||||
claim: >
|
||||
Reach in a scanned feed is won by stopping the scroll. The portraits are already made, already tied to the specific person and stretch of work, and cost nothing further to attach. If they do not measurably help, the effort of producing them for publication is not justified and the campaign should know that.
|
||||
reach:
|
||||
score: 0.4
|
||||
explains:
|
||||
- "P-register"
|
||||
notes: >
|
||||
Narrow but clean. It settles one delivery question decisively, and the
|
||||
answer transfers to fluid-x and fluid-substack, which face the same
|
||||
question under different feeds.
|
||||
|
||||
proposed_adaptation:
|
||||
class: "presentation"
|
||||
summary: >
|
||||
Publish the post with its portrait attached as a photo message, with the post body as the caption.
|
||||
implementation_scope: "interface_only"
|
||||
|
||||
backend_requirements:
|
||||
required: false
|
||||
requirement_refs: []
|
||||
|
||||
expected_outcomes:
|
||||
- metric: "engagement_rate"
|
||||
cohort: "telegram-subscribers"
|
||||
target: 0.05
|
||||
direction: "higher"
|
||||
- metric: "source_link_rate"
|
||||
cohort: "telegram-subscribers"
|
||||
target: 0.02
|
||||
direction: "higher"
|
||||
|
||||
guardrails:
|
||||
- metric: "unreviewed_publication"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "missing_source_attribution"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "missing_subject_consent"
|
||||
operator: "=="
|
||||
threshold: false
|
||||
- metric: "error_rate"
|
||||
operator: "<="
|
||||
threshold: 0.01
|
||||
|
||||
fitness_dimensions:
|
||||
expected:
|
||||
client_utility: 0.2
|
||||
discoverability: 0.5
|
||||
simplicity: -0.1
|
||||
correctness: 0.0
|
||||
security: 0.0
|
||||
|
||||
complexity:
|
||||
expected_delta:
|
||||
operation_count: 0
|
||||
concept_count: 0
|
||||
cognitive_load: 0.1
|
||||
score: 0.15
|
||||
|
||||
risk:
|
||||
level: "LOW"
|
||||
reasons:
|
||||
- "presentation only; no contract, authorization or consent change"
|
||||
- "Telegram caps a photo caption at 1024 characters, a quarter of the text limit; this arm constrains the composition it carries"
|
||||
|
||||
economics:
|
||||
estimated_experiment_cost: 0.0
|
||||
estimated_implementation_cost: 0.0
|
||||
currency: "EUR"
|
||||
expected_value_class: "MEDIUM"
|
||||
|
||||
learning_value:
|
||||
score: 0.7
|
||||
notes: >
|
||||
Settles whether the portraits earn their place in publication, and the answer transfers to every other channel HelixForge publishes to.
|
||||
|
||||
success_criteria:
|
||||
expression: >
|
||||
engagement_rate >= 0.05 AND no guardrail violation
|
||||
|
||||
failure_criteria:
|
||||
expression: >
|
||||
any hard guardrail violation
|
||||
OR engagement_rate at or below the rival arm over the same window
|
||||
|
||||
competition:
|
||||
group_id: "CG-tg-delivery"
|
||||
alternatives:
|
||||
- "H-tg-textonly"
|
||||
|
||||
outcome:
|
||||
status: null
|
||||
summary: null
|
||||
evidence_refs: []
|
||||
Loading…
Add table
Add a link
Reference in a new issue