name: product-design-harness description: Use when a product direction, feature, workflow, experiment, launch, feedback signal, automation, or scale decision needs judgment before execution or the next iteration. license: MIT
Product Design Harness
Decide whether a product direction should continue, be verified, or be reframed anywhere in the product loop.
Execution includes design, implementation, prototype, launch, growth, automation, or investment.
Start
Load in this order:
resources/schemas/session-config.schema.json: setworking_language; keepcanonical_identifiersin English.resources/knowledge/ontology.json: use the canonical UX3 knowledge kernel and its approved Flow definitions.resources/knowledge/rules.json: load required rules plus only triggered conditional rules.resources/prompts/start-review.md.
Then fill resources/templates/product-brief.md, select the smallest responsible mode,
and return resources/schemas/review-result.schema.json.
Validate every review result with resources/scripts/check_review.py. JSON Schema checks
shape and conditional fields; check_review.py is the canonical validator for
the worst-verdict, weakest-flow, and headline-tier semantic checks.
Modes
| Mode | Use when |
|---|---|
| Quick Gate | Small, reversible, low-risk change. |
| Standard Gate | New feature, workflow, or experiment. |
| UX3 Council | High uncertainty, external evidence, meaningful risk, multiple reviewers, or human-owned trade-off. |
Handoff is not a review mode. When a prior review already returned continue, reuse its context pack instead of running a new review.
Reversibility lowers mode, not the review requirement.
UX3
Review three connected dimensions:
| Flow | Core question |
|---|---|
| User Flow | Who is the product for, who is affected, what are they trying to accomplish, and what cost or loss of control exists now? |
| Evidence Flow | What signal was observed, where did it come from, what interpretation is being made, what counter-signal weakens it, and what decision impact follows? |
| Business Flow | Who creates value, receives value, pays or decides, bears cost or risk, and can the exchange remain viable and legitimate? |
Then inspect the intersections: Situated Understanding, Viable Learning, and Sustainable Value Exchange.
UX3 Decision Kernel
Apply the same reduction sequence to every submitted review:
- Validate lane contracts and evidence references with
resources/scripts/check_review.py. - Reduce to the worst verdict and deterministic weakest flow.
- Gate uncertainty, risk, reversibility, and human-owned calls.
- Emit one canonical verdict, next action, execution boundary, and stop conditions.
Do not average lanes. Human-owned calls are recorded through an accountable decision record; they are not converted into a machine score.
Before handoff, name product organization, issuer, stakeholder effects, and accountable owner. Missing issuer or owner blocks implementation.
Operating Rules
- Do not implement during review.
verifybranch: verify authorizes only the exact proof_step and never general coding.continuebranch: continue plus a valid context pack authorizes implementation.- Every result states
may_do,must_not_do, andmust_ask. - List disconfirming evidence before support.
- Do not average reviewer verdicts.
- The weakest flow controls the next action.
- External tools return evidence receipts, not verdicts.
- Evidence tier controls action size; confidence does not upgrade weak proof.
- Council mode requires independent reviews and a challenge round.
- If all independent Council reviews return continue, a valid resources/schemas/red-team-review.schema.json result must be attached to the Council input before synthesis.
- Designer taste is a human-owned input, never an evidence score.
- Incoming feedback must be classified before it changes direction or work.
- Human-owned decisions stay human-owned.
Triggered Distilled Rules
Load only rules whose observable trigger applies. These families refine the three Flow reviews; they do not create new verdicts or allow a strong Flow to outvote a weak one.
| Situation | Required rule |
|---|---|
| Mental-model mismatch, hidden capability, or misunderstood consequence | ux3.rule.mental_model_alignment |
| Cognitive or recovery burden across human, task, tool, and environment | ux3.rule.human_factors_load |
| Research claim, synthetic user, simulation, interview, survey, test, or analytics result | ux3.rule.research_validity |
| Value proposition, positioning, buyer, channel, or GTM path before fit is proven | ux3.rule.value_market_path |
| Agent plan or tool action that needs visibility, control, handoff, or recovery | ux3.rule.human_agent_interaction |
| Retention, personalization, or gamification that changes repeated behavior | ux3.rule.motivation_ethics |
Outcome
| Verdict | Required next step |
|---|---|
| continue | Create resources/templates/context-pack.md within the execution boundary. |
| verify | Run one proof step only. |
| stop_reframe | Stop execution and return a better product question. |
Use triggered rule IDs for detail instead of duplicating every rule in prompts. Common triggers include ux3.rule.actor_boundary, ux3.rule.problem_hypothesis, ux3.rule.evidence_separation, ux3.rule.minimum_validated_proof, ux3.rule.feedback_classification, and ux3.rule.human_judgment. The distilled trigger table above covers additional rules that activate only when their specific product condition appears.
Use resources/docs/HARNESS.md for the handbook, resources/docs/OPERATING-PROTOCOL.md for the six-gate protocol, resources/docs/CONTRACTS.md for output rules, and resources/examples/ for worked reviews.
MIT License
Copyright (c) 2026 Product Design Harness contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{ "request_id": "evidence-request-quick-001", "source_connector": "internal-product-sources", "retrieved_at": "2026-07-10T10:00:00Z", "receipts": [ { "evidence_id": "support-pattern-001", "source_id": "support-system", "source_type": "internal", "raw_artifact_uri": "evidence://support/setup-empty-state", "signal_type": "quote", "signal": "People repeatedly ask what to do after reaching the empty state.", "interpretation": "The next action is not clear enough.", "decision_impact": "Supports a reversible copy test.", "evidence_tier": "t2", "confidence_level": "medium", "counter_signal": "Some questions may come from missing setup prerequisites rather than copy.", "collected_at": "2026-07-08T09:00:00Z", "source_last_verified_at": "2026-07-10T09:30:00Z", "max_staleness_days": 30 }, { "evidence_id": "session-replay-pattern-001", "source_id": "session-replay-system", "source_type": "internal", "raw_artifact_uri": "evidence://replays/setup-empty-state", "signal_type": "observed_behavior", "signal": "Several new users pause before selecting the first setup action.", "interpretation": "The action hierarchy or language may be unclear.", "decision_impact": "Supports measuring first-action completion after a copy change.", "evidence_tier": "t2", "confidence_level": "medium", "counter_signal": "The replay sample may overrepresent unsuccessful sessions.", "collected_at": "2026-07-09T08:00:00Z", "source_last_verified_at": "2026-07-10T09:30:00Z", "max_staleness_days": 14 } ], "coverage_gaps": [ "No segmented completion baseline is available." ] }
Verdict Override Example
The review in stop-reframe-review.json returned stop_reframe: the
evidence lane found only untraceable founder impressions. The founder
decides to build a scoped internal prototype anyway. This example shows
what that decision looks like when it is done honestly.
Machine-checkable version: verdict-override.json. Validate it with:
python scripts/check_override.py examples/verdict-override.json \
examples/stop-reframe-review.jsonKey mechanics on display:
| Mechanic | Where |
|---|---|
| The verdict is untouched | the review file still says stop_reframe; the override is a separate artifact |
| The owner restates the gap | acknowledged_weakest_flow must match the review's weakest_flow |
| Scope is granted, not assumed | authorized_scope allows an internal prototype; customer contact stays banned |
| No scope laundering | a may_do entry that repeats the review's must_not_do fails the checker |
| Time-boxed by contract | expires_at is required; a lapsed override fails the checker and the verdict is back in force |
| Voidable | any tripwire firing voids the authorization immediately |
| Renewal is a review | renewal_requires names the evidence a fresh review must see; there is no quiet extension |
One honesty note: this example uses a far-future expires_at so the
repository's own CI never starts failing on it. A real override should
expire in days or weeks, not decades - the expiry is the point.
{ "decision_id": "decision-example-001", "review_id": "example-council-001", "decision_type": "risk", "decision": "Keep human approval for customer-facing workflow actions.", "options_considered": [ "Full autonomous execution.", "Draft-only assistance with approval.", "No workflow assistance." ], "rationale": "Current t1 evidence cannot support irreversible customer-facing action.", "accountable_owner": "Product owner", "decided_at": "2026-07-10T12:00:00Z", "reversal_conditions": [ "Observed error and recovery evidence reaches t3.", "The accountable owner approves a new bounded execution policy." ] }
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "review_id": "example-quick-001", "product_direction": "Clarify the empty-state action on the setup page.", "mode": "quick_gate", "stage": "prototype", "actor_boundary": { "target_population": [ "New workspace admins" ], "operator": "Workspace admin", "beneficiary": "Workspace team", "machine_actor": "Not applicable", "affected_people": [ "Invited team members" ], "excluded_groups": [ "Existing configured workspaces" ] }, "product_organization": { "organization": "Example Product Co.", "project_owner": "Activation team", "issuer": "Example Product Co." }, "stakeholder_effects": [ { "stakeholder": "Invited team members", "effect": "Clearer setup can reduce delayed invitations." } ], "human_judgment_boundary": { "human_owned_decisions": [ "Final copy tone" ], "machine_supported_inputs": [ "Support notes", "Session replays" ], "not_mechanized": [ "Taste and brand judgment" ], "approval_gates": [ { "gate_id": "product-owner-release-approval", "accountable_owner": "Product owner", "condition": "Before release to users." } ] }, "unresolved_assumptions": [ "Whether copy or missing product guidance causes the hesitation." ], "combined_verdict": "continue", "weakest_flow": "evidence", "strongest_signal": "Support notes and session replays show repeated hesitation at the same empty state.", "riskiest_claim": "Clearer copy will improve first-action completion.", "main_uncertainty": "Whether copy or missing product guidance causes the hesitation.", "confidence_level": "medium", "evidence_tier": "t2", "main_trade_off": "Limit the change to copy so the team can learn without expanding onboarding scope.", "human_owned_decision": "none", "human_decision_record_id": null, "evidence_receipt_ids": [ "support-pattern-001", "session-replay-pattern-001" ], "reviews": { "user": { "verdict": "continue", "strongest_signal": "People repeatedly pause before the first setup action.", "weakest_assumption": "The action label is the primary source of confusion.", "missing_evidence": "Post-change completion behavior.", "disconfirming_evidence": "People still pause after the copy change.", "stop_condition": "The change reduces comprehension in a five-person check.", "evidence_tier": "t2" }, "evidence": { "verdict": "continue", "strongest_signal": "Two independent internal sources show the same hesitation.", "weakest_assumption": "The replay sample represents new users.", "missing_evidence": "Segmented first-action completion.", "disconfirming_evidence": "Completion does not move after release.", "stop_condition": "No measurable event can distinguish the old and new copy.", "evidence_tier": "t2" }, "business": { "verdict": "continue", "strongest_signal": "The change is reversible and may improve activation.", "weakest_assumption": "First-action completion predicts later value.", "missing_evidence": "Activation-to-retention link.", "disconfirming_evidence": "Completion rises while retained setup does not.", "stop_condition": "The change expands beyond copy and one action label.", "evidence_tier": "t2" } }, "next_smallest_action": "Release one copy variant and compare first-action completion.", "execution_boundary": { "may_do": [ "Edit the empty-state headline and one action label." ], "must_not_do": [ "Change layout, permissions, data handling, or onboarding steps." ], "must_ask": [ "A material scope, risk, data, or stakeholder impact changes." ] }, "human_approval_gates": [ { "gate_id": "product-owner-release-approval", "accountable_owner": "Product owner", "condition": "Before release to users." } ], "high_risk_actions": [], "stop_conditions": [ "People still hesitate after the copy change.", "The change requires onboarding scope expansion." ], "context_pack_required": true }
{ "review_id": "red-team-unanimous-continue-example", "claim_ids": [ "claim-delegated-operations" ], "evidence_receipt_ids": [ "ev-support-2026-07" ], "failure_modes": [ "The assistant makes an irreversible customer change.", "Operators lose the ability to interrupt the workflow.", "Support volume rises after an incorrect automated action.", "The workflow creates a compliance exception.", "Users keep the current manual workaround." ], "disconfirming_tests": [ "A supervised pilot shows no reduction in completion time." ], "hidden_affected_people": [ "Customers receiving automated changes." ], "current_workaround": "Operators complete each change manually.", "substitute_threats": { "direct": "A competing automation product.", "indirect": "A shared operations service.", "platform": "A native workflow feature.", "workflow": "A checklist and queue process.", "doing_nothing": "Keep the current manual workflow." }, "trust_risk": "An unexplained action damages customer confidence.", "stop_condition": "Any pilot creates an unapproved customer change.", "verdict": "verify" }
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "review_id": "example-stop-001", "product_direction": "Ship an AI support agent that replies to customers in production within two days, based on the founder's interview impressions.", "mode": "standard_gate", "stage": "idea", "actor_boundary": { "target_population": [ "Team admins who repeatedly export reports" ], "operator": "Team admin", "beneficiary": "Reporting team", "machine_actor": "Not applicable", "affected_people": [ "Downstream report consumers" ], "excluded_groups": [ "Teams without recurring report export workflows" ] }, "product_organization": { "organization": "Example Product Co.", "project_owner": "Reporting team", "issuer": "Example Product Co." }, "stakeholder_effects": [ { "stakeholder": "Downstream report consumers", "effect": "Scheduled exports could change how recurring reporting work is coordinated." } ], "human_judgment_boundary": { "human_owned_decisions": [ "Whether recurring export is strategically worth building" ], "machine_supported_inputs": [ "Support tickets", "Product logs" ], "not_mechanized": [ "Roadmap priority trade-off" ], "approval_gates": [ { "gate_id": "product-owner-scheduling-build-approval", "accountable_owner": "Product owner", "condition": "Before any scheduling infrastructure build starts." } ] }, "unresolved_assumptions": [ "Whether the request reflects a recurring workflow or one-off audits." ], "combined_verdict": "stop_reframe", "weakest_flow": "evidence", "strongest_signal": "The founder can name three interviewees who complained about support load.", "riskiest_claim": "Customers will accept AI-written replies without human review.", "main_uncertainty": "Whether any real customer wants unreviewed AI replies at all.", "confidence_level": "very_low", "evidence_tier": "t0", "main_trade_off": "Two days of build speed against untraceable evidence and customer-facing risk.", "human_owned_decision": "risk", "human_decision_record_id": "decision-example-002", "evidence_receipt_ids": [ "founder-impressions-001" ], "reviews": { "user": { "verdict": "verify", "evidence_tier": "t1", "strongest_signal": "Interviewees describe support load as painful.", "weakest_assumption": "Complaints about load imply acceptance of AI replies.", "missing_evidence": "Any observed customer reaction to an AI-written reply.", "disconfirming_evidence": "Customers escalate or churn when replies feel automated.", "stop_condition": "No interviewee can describe a concrete recent support failure." }, "evidence": { "verdict": "stop_reframe", "evidence_tier": "t0", "strongest_signal": "Only the founder's memory of three conversations exists.", "weakest_assumption": "Impressions recalled after the fact count as demand evidence.", "missing_evidence": "Recordings, notes, tickets, or any traceable source artifact.", "disconfirming_evidence": "Written notes contradict the recalled enthusiasm.", "stop_condition": "No source artifact can be produced for any claimed conversation.", "stop_reason_class": "core_evidence" }, "business": { "verdict": "verify", "evidence_tier": "t1", "strongest_signal": "Support cost is a plausible recurring expense to displace.", "weakest_assumption": "Willingness to pay follows from willingness to complain.", "missing_evidence": "Any pricing signal or budget owner for this problem.", "disconfirming_evidence": "Prospects expect AI support to be free.", "stop_condition": "No budget owner can be named for the purchase." } }, "next_smallest_action": "Rewrite the product question, then collect five traceable support-failure artifacts before any build step.", "execution_boundary": { "may_do": [ "Collect and file traceable evidence artifacts.", "Draft the reframed product question for review." ], "must_not_do": [ "Write any product code.", "Contact customers with an AI-written reply.", "Commit to the two-day ship date." ], "must_ask": [ "Which named budget owner will confirm the reframed problem is worth paying for?" ] }, "human_approval_gates": [ { "gate_id": "risk-owner-reframe-approval", "accountable_owner": "Product owner", "condition": "Before the reframed question enters a new review." } ], "high_risk_actions": [ { "action": "Send customer-facing AI replies without human review.", "approval_gate": { "gate_id": "risk-owner-reframe-approval", "accountable_owner": "Product owner", "condition": "Blocked until the reframed direction passes a new review with tier t2 or stronger evidence." }, "rollback_plan": "Disable AI replies and route all tickets back to the human queue." } ], "stop_conditions": [ "Any build work starts before the reframed question passes a new review.", "Evidence collection substitutes recalled impressions for artifacts again." ], "context_pack_required": false, "reframed_question": "Which recurring, traceable support failure costs a named budget owner enough that they would pay for a reviewed-by-human AI drafting workflow?" }
Example: Quick Gate Review
Machine-checkable result: quick-gate-review.json.
Product Direction
Change the empty-state copy on a setup page to reduce confusion.
Mode
Quick Gate.
Verdict
continue.
Why
The change is reversible, low risk, and tied to a known confusion point.
UX3 Review
| Flow | Result |
|---|---|
| User Flow | Users reach the empty state after connecting no sources and do not know what to do next. |
| Evidence Flow | Support notes and session replays show repeated hesitation at the same page. |
| Business Flow | Clearer setup may improve activation without changing product scope. |
Evidence And Confidence
| Field | Answer |
|---|---|
| Evidence tier | t1 |
| Confidence level | Medium |
| Riskiest claim | Clearer copy will improve first-action completion. |
| Main uncertainty | Whether copy or missing guidance causes the hesitation. |
Constraints
| Field | Answer |
|---|---|
| Scope | Edit empty-state headline and action label. |
| Non-goals | Do not redesign setup, add new automation, or change onboarding flow. |
| Measurement | Track click-through to first setup action. |
| Stop condition | Stop if users still hesitate or support questions do not change. |
Context Pack
Execution may change copy and one action label.
Execution must not change layout, permissions, data handling, or onboarding steps.
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "product_direction": "Add a visible save-state label to the note editor header.", "accountable_owner": "Product owner", "stage": "prototype", "actor_boundary": { "target_population": [ "Workspace editors drafting internal notes" ], "operator": "Workspace editor", "beneficiary": "Workspace editor", "machine_actor": "Repository-aware coding agent", "affected_people": [ "Workspace editors", "Support team" ], "excluded_groups": [ "External collaborators", "Public note viewers" ] }, "business_boundary": { "product_organization": "Example Notes Co.", "project_owner": "Editor experience team", "issuer": "Example Notes Co.", "customers": [ "Team workspace customers" ], "buyers": [ "Workspace admins" ], "operators": [ "Workspace editors" ], "partners": [ "Not applicable" ], "funders": [ "Not applicable" ], "platforms": [ "Web app" ], "regulators": [ "Not applicable" ], "externality_bearers": [ "Support team" ], "decision_authority": "Product owner", "value_exchange": "Editors get clearer save-state feedback while the product may reduce avoidable support questions." }, "human_judgment_boundary": { "human_owned_decisions": [], "machine_supported_inputs": [ "Support ticket pattern", "Session replay observation" ], "not_mechanized": [], "approval_gates": [] }, "unresolved_assumptions": [ "The confusion comes from unclear save-state feedback rather than a real save failure.", "A header label is noticeable enough without changing the editor workflow." ], "execution_boundary": { "may_do": [ "implement the approved bounded change" ], "must_not_do": [ "expand scope or execute external irreversible actions" ], "must_ask": [ "new stakeholder, data, risk, or scope appears" ] }, "problem_hypothesis": "Workspace editors hesitate before leaving the note editor because they cannot tell whether the current draft has been saved.", "current_evidence": [ { "evidence_id": "lc-support-save-state-001", "source_id": "support-tag-editor-save-state-2026-07", "source_type": "internal", "raw_artifact_uri": "internal://support/tags/editor-save-state/2026-07", "signal_type": "quote", "signal": "Six support conversations in two weeks ask whether note edits were saved before closing the editor.", "interpretation": "The uncertainty is visible enough to generate support contact.", "decision_impact": "Supports a small reversible clarity change before deeper editor work.", "evidence_tier": "t2", "confidence_level": "medium", "counter_signal": "The tickets do not prove data loss or quantify all editor sessions.", "collected_at": "2026-07-09T12:00:00Z", "source_last_verified_at": "2026-07-09T12:00:00Z", "max_staleness_days": 30 }, { "evidence_id": "lc-replay-exit-hesitation-001", "source_id": "session-replay-note-editor-exit-2026-07", "source_type": "workflow", "raw_artifact_uri": "internal://replay/note-editor-exit-hesitation/2026-07", "signal_type": "observed_behavior", "signal": "Four of eight sampled editors pause near the close control after typing and before leaving the editor.", "interpretation": "The hesitation aligns with the support pattern but is not yet a measured completion metric.", "decision_impact": "Supports adding one visible save-state label and measuring whether exit hesitation falls.", "evidence_tier": "t2", "confidence_level": "medium", "counter_signal": "The sample is small and may overrepresent uncertain sessions.", "collected_at": "2026-07-09T13:00:00Z", "source_last_verified_at": "2026-07-09T13:00:00Z", "max_staleness_days": 30 } ], "business_goal": "Reduce avoidable save-state confusion without changing the editor workflow.", "constraints": [ "Keep the change to the existing editor header.", "Do not change persistence, permissions, notifications, or external delivery.", "Preserve existing save behavior and rollback by removing the label." ], "proposed_next_step": "Run review live-coding-review-001 and, only on continue, hand off a context pack for the bounded label change.", "known_risks": [ "The label could be missed if it is too subtle.", "The label could imply stronger save guarantees than the product currently provides." ] }
{ "product_brief": { "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "product_direction": "Let a workflow assistant complete recurring customer operations without manual approval.", "accountable_owner": "Product owner", "stage": "prototype", "actor_boundary": { "target_population": [ "Workspace editors drafting internal notes" ], "operator": "Workspace editor", "beneficiary": "Workspace editor", "machine_actor": "Repository-aware coding agent", "affected_people": [ "Workspace editors", "Support team" ], "excluded_groups": [ "External collaborators", "Public note viewers" ] }, "business_boundary": { "product_organization": "Example Notes Co.", "project_owner": "Editor experience team", "issuer": "Example Notes Co.", "customers": [ "Team workspace customers" ], "buyers": [ "Workspace admins" ], "operators": [ "Workspace editors" ], "partners": [ "Not applicable" ], "funders": [ "Not applicable" ], "platforms": [ "Web app" ], "regulators": [ "Not applicable" ], "externality_bearers": [ "Support team" ], "decision_authority": "Product owner", "value_exchange": "Editors get clearer save-state feedback while the product may reduce avoidable support questions." }, "human_judgment_boundary": { "human_owned_decisions": [], "machine_supported_inputs": [ "Support ticket pattern", "Session replay observation" ], "not_mechanized": [], "approval_gates": [] }, "unresolved_assumptions": [ "The confusion comes from unclear save-state feedback rather than a real save failure.", "A header label is noticeable enough without changing the editor workflow." ], "execution_boundary": { "may_do": [ "implement the approved bounded change" ], "must_not_do": [ "expand scope or execute external irreversible actions" ], "must_ask": [ "new stakeholder, data, risk, or scope appears" ] }, "problem_hypothesis": "Operators lose repeated time on recurring customer operations and may want delegated execution.", "current_evidence": [ { "evidence_id": "lc-support-save-state-001", "source_id": "support-tag-editor-save-state-2026-07", "source_type": "internal", "raw_artifact_uri": "internal://support/tags/editor-save-state/2026-07", "signal_type": "quote", "signal": "Six support conversations in two weeks ask whether note edits were saved before closing the editor.", "interpretation": "The uncertainty is visible enough to generate support contact.", "decision_impact": "Supports a small reversible clarity change before deeper editor work.", "evidence_tier": "t2", "confidence_level": "medium", "counter_signal": "The tickets do not prove data loss or quantify all editor sessions.", "collected_at": "2026-07-09T12:00:00Z", "source_last_verified_at": "2026-07-09T12:00:00Z", "max_staleness_days": 30 }, { "evidence_id": "lc-replay-exit-hesitation-001", "source_id": "session-replay-note-editor-exit-2026-07", "source_type": "workflow", "raw_artifact_uri": "internal://replay/note-editor-exit-hesitation/2026-07", "signal_type": "observed_behavior", "signal": "Four of eight sampled editors pause near the close control after typing and before leaving the editor.", "interpretation": "The hesitation aligns with the support pattern but is not yet a measured completion metric.", "decision_impact": "Supports adding one visible save-state label and measuring whether exit hesitation falls.", "evidence_tier": "t2", "confidence_level": "medium", "counter_signal": "The sample is small and may overrepresent uncertain sessions.", "collected_at": "2026-07-09T13:00:00Z", "source_last_verified_at": "2026-07-09T13:00:00Z", "max_staleness_days": 30 } ], "business_goal": "Reduce avoidable save-state confusion without changing the editor workflow.", "constraints": [ "Keep the change to the existing editor header.", "Do not change persistence, permissions, notifications, or external delivery.", "Preserve existing save behavior and rollback by removing the label." ], "proposed_next_step": "Decide whether to build autonomous execution or draft-only assistance.", "known_risks": [ "The label could be missed if it is too subtle.", "The label could imply stronger save guarantees than the product currently provides." ] }, "claim_analysis": { "claims": [ { "id": "c1", "type": "user", "claim": "Operators want delegated execution of recurring operations.", "status": "assumption", "support": "Support notes describe recurring time loss.", "counter_signal": "No operator has asked for autonomous action.", "confidence_level": "low", "depends_on": [], "breaks_if_false": [ "c2" ], "proof_step": "Observe five recurring workflows and ask about delegation.", "stop_condition": "No recurring workflow has a clear operator cost." }, { "id": "c2", "type": "business", "claim": "Cycle-time reduction deepens workflow dependency and retention.", "status": "assumption", "support": "Cycle time is a stated operator pain.", "counter_signal": "Review and recovery cost may exceed time saved.", "confidence_level": "low", "depends_on": [ "c1" ], "breaks_if_false": [ "c1" ], "proof_step": "Measure cycle time with draft-only assistance.", "stop_condition": "Exception handling grows without bound." } ], "riskiest_claim_id": "c1", "critical_path": [ "c1", "c2" ], "highest_leverage_proof_step": "Test draft-only assistance with human approval on five recurring workflows.", "human_owned_decision": "risk" }, "independent_reviews": [ { "reviewer": "user_flow", "review_round": "independent", "verdict": "verify", "evidence_tier": "t1", "confidence_level": "low", "strongest_signal": "user lane signal from support notes.", "weakest_assumption": "user lane assumption untested with operators.", "missing_evidence": "Observed workflows and approval preferences.", "disconfirming_evidence": "Operators reject autonomous customer-facing action.", "stop_condition": "Customer-facing errors cannot be traced or reversed.", "next_smallest_action": "Test draft-only assistance with human approval." }, { "reviewer": "evidence_flow", "review_round": "independent", "verdict": "verify", "evidence_tier": "t1", "confidence_level": "low", "strongest_signal": "evidence lane signal from support notes.", "weakest_assumption": "evidence lane assumption untested with operators.", "missing_evidence": "Observed workflows and approval preferences.", "disconfirming_evidence": "Operators reject autonomous customer-facing action.", "stop_condition": "Customer-facing errors cannot be traced or reversed.", "next_smallest_action": "Test draft-only assistance with human approval." }, { "reviewer": "business_flow", "review_round": "independent", "verdict": "verify", "evidence_tier": "t1", "confidence_level": "low", "strongest_signal": "business lane signal from support notes.", "weakest_assumption": "business lane assumption untested with operators.", "missing_evidence": "Observed workflows and approval preferences.", "disconfirming_evidence": "Operators reject autonomous customer-facing action.", "stop_condition": "Customer-facing errors cannot be traced or reversed.", "next_smallest_action": "Test draft-only assistance with human approval." } ], "challenge_reviews": [ { "reviewer": "user_flow", "review_round": "challenge", "verdict": "verify", "evidence_tier": "t1", "confidence_level": "low", "strongest_signal": "Cross-lane check of the strongest claim.", "weakest_assumption": "The challenged lane may overweight reported pain.", "missing_evidence": "Any behavioral trace supporting the challenged claim.", "disconfirming_evidence": "Draft assistance does not reduce cycle time.", "stop_condition": "The challenged claim fails without a replacement.", "next_smallest_action": "Add the counter-evidence to the proof step.", "objection_to": "business_flow", "counter_evidence": "Support notes show pain but no delegation request.", "position_change": "weakened" }, { "reviewer": "evidence_flow", "review_round": "challenge", "verdict": "verify", "evidence_tier": "t1", "confidence_level": "low", "strongest_signal": "Cross-lane check of the strongest claim.", "weakest_assumption": "The challenged lane may overweight reported pain.", "missing_evidence": "Any behavioral trace supporting the challenged claim.", "disconfirming_evidence": "Draft assistance does not reduce cycle time.", "stop_condition": "The challenged claim fails without a replacement.", "next_smallest_action": "Add the counter-evidence to the proof step.", "objection_to": "user_flow", "counter_evidence": "Support notes show pain but no delegation request.", "position_change": "weakened" }, { "reviewer": "business_flow", "review_round": "challenge", "verdict": "verify", "evidence_tier": "t1", "confidence_level": "low", "strongest_signal": "Cross-lane check of the strongest claim.", "weakest_assumption": "The challenged lane may overweight reported pain.", "missing_evidence": "Any behavioral trace supporting the challenged claim.", "disconfirming_evidence": "Draft assistance does not reduce cycle time.", "stop_condition": "The challenged claim fails without a replacement.", "next_smallest_action": "Add the counter-evidence to the proof step.", "objection_to": "evidence_flow", "counter_evidence": "Support notes show pain but no delegation request.", "position_change": "weakened" } ], "uncertainty_review": { "evidence_tier": "t1", "confidence_level": "low", "risk_class": "r3", "reversibility": "low", "main_uncertainty": "Whether people want full autonomy or faster preparation with approval.", "false_confidence_risk": "Reported pain reads as demand for autonomy.", "stale_evidence_ids": [], "proof_bar": "Observed approval behavior on five real workflows.", "verdict_impact": "verify", "human_owned_decision": "risk" } }
Stop / Reframe Review Example
A standard gate review that ends in stop_reframe: the evidence lane finds
only untraceable founder impressions (tier t0), which forces the stop and
produces one better product question instead of any execution work.
Machine-checkable version: stop-reframe-review.json (validates against
../schemas/review-result.schema.json and ../scripts/check_review.py).
Key mechanics on display:
| Mechanic | Where |
|---|---|
| Lane-level stop with a machine-readable reason | the evidence lane carries stop_reason_class core_evidence |
| Weakest flow decides; no averaging | two verify lanes cannot rescue a t0 evidence lane |
| Tier gate | headline tier t0 forces stop_reframe by contract |
| No execution scope on a stop | the boundary allows research actions only |
| The single output of a stop | one reframed question, not a plan and not a backlog |
Example: UX3 Council Review
Machine-checkable result: ux3-council-review.json.
Product Direction
Let a workflow assistant complete recurring customer operations without manual approval.
Stage: prototype. Risk class: R3.
Claim Graph
| ID | Claim | Type | Depends on | Breaks if false |
|---|---|---|---|---|
| U1 | Operators repeatedly perform a costly workflow. | User | None | E1, B1 |
| E1 | Assistance reduces cycle time without increasing corrections. | Evidence | U1 | R1, B1 |
| R1 | Customer-facing mistakes can be detected and reversed. | Risk | E1 | B1, direction |
| B1 | Time saved exceeds review, support, and recovery cost. | Business | U1, E1, R1 | direction |
R1 is the riskiest claim because its failure blocks autonomous action even if the user and business claims remain plausible.
Independent Reviews
| Flow | Verdict | Main reason |
|---|---|---|
| User | verify | The problem is plausible, but approval preference and recovery mental model are unclear. |
| Evidence | verify | Current proof is t1: stated pain and support notes without observed delegation behavior. |
| Business | verify | Value is plausible, but trust, review, and exception cost are unknown. |
Challenge Round
| Reviewer | objection_to | counter_evidence | position_change |
|---|---|---|---|
| User | business_flow | Reported time savings do not prove willingness to delegate customer-facing action. | unchanged |
| Evidence | user_flow | Support requests may ask for speed, not autonomy. | weakened |
| Business | evidence_flow | A draft-only test can measure cycle time and correction cost without full autonomy. | strengthened |
The challenge round does not force consensus. It identifies draft-only assistance as the proof step that can test all three lanes safely.
Uncertainty Review
| Field | Answer |
|---|---|
| Evidence tier | t1 |
| Confidence level | Low |
| Risk class | R3 |
| Reversibility | Medium |
| Main uncertainty | Whether people want autonomy or faster preparation with approval. |
| Proof bar | Observe five workflows and compare draft cycle time, corrections, and approval decisions. |
Final Result
| Machine field | Answer |
|---|---|
| combined_verdict | verify |
| weakest_flow | evidence |
| main_trade_off | Delay autonomy to protect trust, recovery, and accountability. |
| human_owned_decision | risk |
| next_smallest_action | Test draft-only assistance with human approval on five workflows. |
| context_pack_required | false |
Execution may prepare workflow drafts and collect approval decisions.
Execution must not perform customer-facing actions or remove human approval.
Stop Conditions
- No recurring workflow has a clear operator cost.
- Operators reject draft-only assistance.
- Recovery paths remain unclear.
- Customer-facing mistakes cannot be reversed.
Example: Feature Gate Review
Product Brief
| Field | Answer |
|---|---|
| Product direction | Add automated weekly report export for team managers. |
| Stage | Prototype |
| Claimed user | Team manager. |
| Current evidence | Support team reports that managers ask for weekly summaries. No behavior data yet. |
| Proposed next step | Build the export feature. |
User Flow Review
| Field | Answer |
|---|---|
| Verdict | Verify |
| Strongest user signal | Support reports mention repeated requests for weekly summaries. |
| Weakest user assumption | Managers need export, not just better in-product visibility. |
| Affected people | Team members whose activity may appear in the report. |
| Excluded groups | Managers who do not use spreadsheet workflows. |
| Disconfirming evidence | Managers only need occasional screenshots or dashboards; exports are for one large account only. |
| Stop condition | Stop if the request is not repeated across accounts or if reports expose sensitive data without review. |
| Next smallest action | Interview five managers using their current weekly reporting workflow. |
Evidence Flow Review
| Field | Answer |
|---|---|
| Verdict | Verify |
| Evidence tier | t2 |
| Strongest evidence | Support requests are real, but not yet tied to frequency or value. |
| Weakest evidence assumption | Support volume represents broad demand. |
| Missing measurement | Number of accounts requesting reports, current workaround time, weekly recurrence. |
| Failure criteria | Fewer than 3 of 5 managers currently create weekly reports manually. |
| Trace requirement | Record source account, current workaround, time cost, and requested format. |
| Next smallest action | Count requests and observe one current manual reporting workflow. |
Business Flow Review
| Field | Answer |
|---|---|
| Verdict | Verify |
| Strongest business signal | Reporting may improve account retention for manager-heavy teams. |
| Weakest business assumption | Export feature creates retention rather than support burden. |
| Cost risks | Permission rules, data privacy, support for formats, scheduled delivery, data correctness. |
| Retention logic | Managers may return weekly if reports become part of team rituals. |
| Defensibility | Weak unless report templates reflect domain-specific management insight. |
| Disconfirming evidence | Users export once, then churn; exports create compliance concerns; dashboard improvements solve the issue. |
| Next smallest action | Test one static report sample before building scheduled export. |
Council Decision
| Field | Answer |
|---|---|
| Combined verdict | Verify |
| Weakest flow | Evidence |
| Main conflict | Support requests suggest need, but the requested solution may be wrong. |
| Human-owned decision | Risk |
| Trade-off | Delay automation to protect data correctness and learn the actual reporting job. |
| Execution boundary | Do not build scheduled export yet. Create a static report mock and test workflow fit. |
| Next smallest action | Run five workflow interviews and one static report test. |
This is a verify result. The allowed work is the proof step, not a context
pack or implementation handoff.
Handoff Boundary
Execution may create:
- one static report sample
- interview guide
- evidence table
Execution must not create:
- scheduled export
- live customer data access
- permission model changes
- external delivery
Stop Conditions
- Report need is not repeated across accounts.
- Users cannot name a weekly decision the report supports.
- Data sensitivity requires permissions not yet designed.
- Dashboard changes solve the problem with less cost.
{ "override_id": "override-example-001", "review_id": "example-stop-001", "overridden_verdict": "stop_reframe", "acknowledged_weakest_flow": "evidence", "authorized_scope": { "may_do": [ "Build an internal prototype that drafts replies into a human review queue.", "Run the prototype on the next twenty real tickets with a human reviewing every draft." ], "must_not_do": [ "Send any AI-written reply to a customer without human approval.", "Announce, demo externally, or sell the feature." ], "must_ask": [ "Who reviews every draft during the trial, by name?" ] }, "accountable_owner": "Jordan Lee, founder", "rationale": "A strategic partner demo in three weeks needs a working draft queue. The founder accepts the evidence gap for an internal-only prototype behind a mandatory human review step, and accepts personally owning the outcome if the tripwires fire.", "expires_at": "2099-01-01T00:00:00Z", "tripwires": [ "Any AI-drafted reply reaches a customer without human approval.", "The partner demo is cancelled or moved beyond the override window." ], "renewal_requires": [ "Twenty human-reviewed tickets with approval rate and edit distance filed as evidence receipts." ] }
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "review_id": "live-coding-review-001", "goal": "Add one visible save-state label to the existing note editor header so editors know whether they can leave safely.", "stage": "prototype", "combined_verdict": "continue", "actor_boundary": { "target_population": [ "Workspace editors drafting internal notes" ], "operator": "Workspace editor", "beneficiary": "Workspace editor", "machine_actor": "Repository-aware coding agent", "affected_people": [ "Workspace editors", "Support team" ], "excluded_groups": [ "External collaborators", "Public note viewers" ] }, "product_organization": { "organization": "Example Notes Co.", "project_owner": "Editor experience team", "issuer": "Example Notes Co." }, "stakeholder_effects": [ { "stakeholder": "Workspace editors", "effect": "They get clearer save-state feedback before leaving the editor." }, { "stakeholder": "Support team", "effect": "They may receive fewer avoidable questions about whether notes were saved." } ], "human_judgment_boundary": { "human_owned_decisions": [], "machine_supported_inputs": [ "Support ticket pattern", "Session replay observation" ], "not_mechanized": [], "approval_gates": [] }, "unresolved_assumptions": [ "The confusion comes from unclear save-state feedback rather than a real save failure.", "A header label is noticeable enough without changing the editor workflow." ], "scope": [ "Add one visible save-state label to the existing note editor header.", "Use the current save state already available to the editor UI.", "Add or preserve a measurement hook that can compare exit hesitation and save-state support-tag volume." ], "non_goals": [ "Do not change save persistence.", "Do not change permissions.", "Do not add notifications, external delivery, or background jobs.", "Do not redesign the editor header beyond the save-state label." ], "acceptance_criteria": [ "The label is visible in the editor header while a note is being edited.", "The label wording does not imply guarantees beyond existing save behavior.", "Existing save behavior, permissions, and external actions remain unchanged.", "The change can be reversed by removing the label and measurement hook." ], "measurement_hooks": [ "Compare editor close hesitation before and after the label.", "Track support conversations tagged editor-save-state for the next review.", "Classify post-build feedback as behavior, quote, support pattern, counter-signal, or scope-change trigger." ], "evidence_snapshot_ids": [ "lc-support-save-state-001", "lc-replay-exit-hesitation-001" ], "rollback_plan": "Remove the save-state label and any label-specific measurement hook; keep the existing editor save behavior unchanged.", "human_approval_gates": [], "high_risk_actions": [], "stop_conditions": [ "The implementation requires persistence, permission, notification, or external delivery changes.", "A new stakeholder group is affected by the label.", "The label implies a stronger save guarantee than the product can support." ], "execution_boundary": { "may_do": [ "implement the approved bounded change" ], "must_not_do": [ "expand scope or execute external irreversible actions" ], "must_ask": [ "new stakeholder, data, risk, or scope appears" ] } }
Examples
| File | Purpose |
|---|---|
quick-gate-review.md |
Small reversible change. |
quick-gate-review.json |
Machine-checkable Quick Gate result. |
quick-context-pack.json |
Machine-checkable handoff for the Quick Gate continue result. |
live-coding-product-brief.json |
Product brief for a complete live-coding brief -> review -> context-pack chain. |
live-coding-review.json |
Machine-checkable live-coding review with a legitimate continue verdict. |
live-coding-context-pack.json |
Machine-checkable live-coding implementation handoff for the approved bounded change. |
stop-reframe-review.md |
Human-readable stop_reframe walkthrough. |
stop-reframe-review.json |
Machine-checkable stop_reframe result: t0 evidence forces the stop. |
ux3-council-input.json |
Machine-checkable council input: claim graph, blind first-round verdicts, challenge round, uncertainty review. |
red-team-review.json |
Structured counter-case attached when every independent Council lane continues. |
feature-gate-review.md |
End-to-end example of a vague feature request becoming a gate review and handoff. |
standard-gate-review.json |
Machine-checkable Standard Gate result. |
ux3-council-review.md |
Extended UX3 council review. |
ux3-council-review.json |
Machine-checkable Council result. |
human-decision.json |
Accountable decision record used by the Council example. |
verdict-override.json |
Signed override of the stop_reframe example; validated by check_override. |
verdict-override.md |
Human-readable override walkthrough. |
evidence-response.json |
Evidence receipts with provenance and freshness. |
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "review_id": "example-quick-001", "goal": "Increase first-action completion by clarifying the empty state.", "stage": "prototype", "combined_verdict": "continue", "actor_boundary": { "target_population": [ "New workspace admins" ], "operator": "Workspace admin", "beneficiary": "Workspace team", "machine_actor": "Not applicable", "affected_people": [ "Invited team members" ], "excluded_groups": [ "Existing configured workspaces" ] }, "product_organization": { "organization": "Example Product Co.", "project_owner": "Activation team", "issuer": "Example Product Co." }, "stakeholder_effects": [ { "stakeholder": "Invited team members", "effect": "Clearer setup can reduce delayed invitations." } ], "human_judgment_boundary": { "human_owned_decisions": [ "Final copy tone" ], "machine_supported_inputs": [ "Support notes", "Session replays" ], "not_mechanized": [ "Taste and brand judgment" ], "approval_gates": [ { "gate_id": "product-owner-release-approval", "accountable_owner": "Product owner", "condition": "Before release to users." } ] }, "unresolved_assumptions": [ "Whether copy or missing product guidance causes the hesitation." ], "scope": [ "Edit the empty-state headline.", "Edit one action label." ], "non_goals": [ "Do not change layout.", "Do not change onboarding steps.", "Do not change permissions or data handling." ], "acceptance_criteria": [ "The new copy names the next action.", "The first-action event distinguishes the released variant." ], "measurement_hooks": [ "Compare first-action completion with the prior copy." ], "evidence_snapshot_ids": [ "support-pattern-001", "session-replay-pattern-001" ], "rollback_plan": "Restore the prior copy.", "human_approval_gates": [ { "gate_id": "product-owner-release-approval", "accountable_owner": "Product owner", "condition": "Before release to users." } ], "high_risk_actions": [], "stop_conditions": [ "People still hesitate after the copy change.", "The change requires onboarding scope expansion." ], "execution_boundary": { "may_do": [ "Edit the empty-state headline and one action label." ], "must_not_do": [ "Change layout, permissions, data handling, or onboarding steps." ], "must_ask": [ "A material scope, risk, data, or stakeholder impact changes." ] } }
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "review_id": "example-council-001", "product_direction": "Let a workflow assistant complete recurring customer operations without manual approval.", "mode": "ux3_council", "stage": "prototype", "actor_boundary": { "target_population": [ "Operations teams handling recurring customer workflows" ], "operator": "Operations team member", "beneficiary": "Operations team and customers receiving correct service", "machine_actor": "Workflow assistant", "affected_people": [ "Customers affected by completed operations" ], "excluded_groups": [ "One-off workflows", "Workflows without reversible approval paths" ] }, "product_organization": { "organization": "Example Product Co.", "project_owner": "Workflow automation team", "issuer": "Example Product Co." }, "stakeholder_effects": [ { "stakeholder": "Customers affected by completed operations", "effect": "Autonomous execution could create customer-facing errors or recovery burden." } ], "human_judgment_boundary": { "human_owned_decisions": [ "Acceptable customer-facing recovery risk" ], "machine_supported_inputs": [ "Support notes", "Observed workflow traces", "Approval behavior" ], "not_mechanized": [ "Risk tolerance for autonomous customer-facing action" ], "approval_gates": [ { "gate_id": "accountable-owner-customer-action-approval", "accountable_owner": "Named accountable owner", "condition": "Before any customer-facing execution." } ] }, "unresolved_assumptions": [ "Whether people want full autonomy or faster preparation with approval." ], "combined_verdict": "verify", "weakest_flow": "evidence", "strongest_signal": "Operators report repeated time loss in recurring customer operations.", "riskiest_claim": "The assistant can act safely without approval.", "main_uncertainty": "Whether people want full autonomy or faster preparation with approval.", "confidence_level": "low", "evidence_tier": "t1", "main_trade_off": "Delay autonomy to protect trust, recovery, and accountability.", "human_owned_decision": "risk", "human_decision_record_id": "decision-example-001", "evidence_receipt_ids": [ "support-notes-001" ], "reviews": { "user": { "verdict": "verify", "strongest_signal": "Operators can name recurring work that consumes time.", "weakest_assumption": "They want autonomous execution rather than assisted preparation.", "missing_evidence": "Observed workflows and approval preferences.", "disconfirming_evidence": "Operators reject autonomous action for customer-facing work.", "stop_condition": "No recurring workflow has a clear operator cost.", "evidence_tier": "t1" }, "evidence": { "verdict": "verify", "strongest_signal": "Support notes describe recurring work.", "weakest_assumption": "Reported pain predicts willingness to delegate.", "missing_evidence": "Observed error rate, recovery cost, and approval behavior.", "disconfirming_evidence": "Draft assistance does not reduce cycle time.", "stop_condition": "Customer-facing errors cannot be traced or reversed.", "evidence_tier": "t1" }, "business": { "verdict": "verify", "strongest_signal": "Cycle-time reduction could deepen workflow dependency.", "weakest_assumption": "Support and trust costs remain bounded.", "missing_evidence": "Retention impact and operating cost.", "disconfirming_evidence": "Review and recovery cost exceed time saved.", "stop_condition": "The product must absorb unbounded exception handling.", "evidence_tier": "t1" } }, "next_smallest_action": "Test draft-only assistance with human approval on five recurring workflows.", "execution_boundary": { "may_do": [ "Prepare workflow drafts and collect approval decisions." ], "must_not_do": [ "Execute customer-facing actions or remove human approval." ], "must_ask": [ "Any test would execute customer-facing work or remove human approval." ] }, "human_approval_gates": [ { "gate_id": "accountable-owner-customer-action-approval", "accountable_owner": "Named accountable owner", "condition": "Before any customer-facing execution." } ], "high_risk_actions": [ { "action": "Execute customer-facing workflow actions.", "approval_gate": { "gate_id": "accountable-owner-customer-action-approval", "accountable_owner": "Named accountable owner", "condition": "Before any customer-facing execution." }, "rollback_plan": "Stop the test and restore manual approval." } ], "council_record": { "independent_review_ids": [ "review-user-001", "review-evidence-001", "review-business-001" ], "challenges": [ { "reviewer": "user_flow", "objection_to": "business_flow", "counter_evidence": "Reported time savings do not prove willingness to delegate customer-facing action.", "position_change": "unchanged" }, { "reviewer": "evidence_flow", "objection_to": "user_flow", "counter_evidence": "Support requests may ask for speed, not autonomy.", "position_change": "weakened" }, { "reviewer": "business_flow", "objection_to": "evidence_flow", "counter_evidence": "A draft-only test can measure cycle time and correction cost without autonomy.", "position_change": "strengthened" } ], "unresolved_conflicts": [ "The acceptable threshold for customer-facing recovery risk remains human-owned." ] }, "stop_conditions": [ "Operators reject draft-only assistance.", "Recovery paths remain unclear.", "Customer-facing mistakes cannot be reversed." ], "context_pack_required": false, "proof_step": "Observe five workflows and compare draft-only cycle time, corrections, and approval decisions." }
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "review_id": "example-standard-001", "product_direction": "Add scheduled CSV export to the reports page for team admins.", "mode": "standard_gate", "stage": "prototype", "actor_boundary": { "target_population": [ "Team admins who repeatedly export reports" ], "operator": "Team admin", "beneficiary": "Reporting team", "machine_actor": "Not applicable", "affected_people": [ "Downstream report consumers" ], "excluded_groups": [ "Teams without recurring report export workflows" ] }, "product_organization": { "organization": "Example Product Co.", "project_owner": "Reporting team", "issuer": "Example Product Co." }, "stakeholder_effects": [ { "stakeholder": "Downstream report consumers", "effect": "Scheduled exports could change how recurring reporting work is coordinated." } ], "human_judgment_boundary": { "human_owned_decisions": [ "Whether recurring export is strategically worth building" ], "machine_supported_inputs": [ "Support tickets", "Product logs" ], "not_mechanized": [ "Roadmap priority trade-off" ], "approval_gates": [ { "gate_id": "product-owner-scheduling-build-approval", "accountable_owner": "Product owner", "condition": "Before any scheduling infrastructure build starts." } ] }, "unresolved_assumptions": [ "Whether the request reflects a recurring workflow or one-off audits." ], "combined_verdict": "verify", "weakest_flow": "evidence", "strongest_signal": "Fourteen support tickets in one quarter ask for recurring report export.", "riskiest_claim": "Admins will schedule exports instead of downloading manually.", "main_uncertainty": "Whether the request reflects a recurring workflow or one-off audits.", "confidence_level": "low", "evidence_tier": "t1", "main_trade_off": "Verify the recurring need before building scheduling infrastructure.", "human_owned_decision": "none", "human_decision_record_id": null, "evidence_receipt_ids": [ "support-ticket-pattern-002" ], "reviews": { "user": { "verdict": "continue", "evidence_tier": "t2", "strongest_signal": "Admins already download the same report every week.", "weakest_assumption": "The weekly download is done by the same person each time.", "missing_evidence": "Who consumes the exported file downstream.", "disconfirming_evidence": "Downloads are irregular one-off audit pulls.", "stop_condition": "No admin can name a recurring consumer of the export." }, "evidence": { "verdict": "verify", "evidence_tier": "t1", "strongest_signal": "Ticket volume is consistent across three months.", "weakest_assumption": "Ticket requests represent the broader admin base.", "missing_evidence": "Product logs showing repeat manual export behavior.", "disconfirming_evidence": "Logs show most exporters export only once.", "stop_condition": "Export behavior cannot be measured per account." }, "business": { "verdict": "continue", "evidence_tier": "t2", "strongest_signal": "Scheduled exports deepen weekly workflow dependency.", "weakest_assumption": "Maintenance cost of scheduling stays bounded.", "missing_evidence": "Infrastructure cost of recurring export jobs.", "disconfirming_evidence": "Exports are replaced by a BI integration request.", "stop_condition": "Scheduling requires a new permission or billing model." } }, "next_smallest_action": "Query product logs for repeat manual exports per account over 90 days.", "execution_boundary": { "may_do": [ "Analyze existing export logs and interview two weekly exporters." ], "must_not_do": [ "Build scheduling infrastructure or change report permissions." ], "must_ask": [ "The proof step requires production schema changes or new permissions." ] }, "human_approval_gates": [ { "gate_id": "product-owner-scheduling-build-approval", "accountable_owner": "Product owner", "condition": "Before any scheduling infrastructure build starts." } ], "high_risk_actions": [], "stop_conditions": [ "Fewer than ten accounts export the same report more than twice.", "The proof step requires production schema changes." ], "context_pack_required": false, "proof_step": "Measure repeat manual export behavior in product logs over the last 90 days." }
{ "schema_version": "2.1", "session_config": { "working_language": "en", "canonical_identifiers": "en", "fallback_language": "en" }, "review_id": "live-coding-review-001", "product_direction": "Add a visible save-state label to the note editor header.", "mode": "quick_gate", "stage": "prototype", "actor_boundary": { "target_population": [ "Workspace editors drafting internal notes" ], "operator": "Workspace editor", "beneficiary": "Workspace editor", "machine_actor": "Repository-aware coding agent", "affected_people": [ "Workspace editors", "Support team" ], "excluded_groups": [ "External collaborators", "Public note viewers" ] }, "product_organization": { "organization": "Example Notes Co.", "project_owner": "Editor experience team", "issuer": "Example Notes Co." }, "stakeholder_effects": [ { "stakeholder": "Workspace editors", "effect": "They get clearer save-state feedback before leaving the editor." }, { "stakeholder": "Support team", "effect": "They may receive fewer avoidable questions about whether notes were saved." } ], "human_judgment_boundary": { "human_owned_decisions": [], "machine_supported_inputs": [ "Support ticket pattern", "Session replay observation" ], "not_mechanized": [], "approval_gates": [] }, "unresolved_assumptions": [ "The confusion comes from unclear save-state feedback rather than a real save failure.", "A header label is noticeable enough without changing the editor workflow." ], "combined_verdict": "continue", "weakest_flow": "evidence", "strongest_signal": "Support tickets and replay observations both show editors hesitating around save-state confidence.", "riskiest_claim": "One visible header label will reduce save-state confusion without implying a stronger persistence guarantee.", "main_uncertainty": "Whether the label is noticeable enough to change behavior without overstating save guarantees.", "confidence_level": "medium", "evidence_tier": "t2", "main_trade_off": "Ship a small reversible clarity improvement now while staying inside existing editor patterns and avoiding deeper workflow or persistence changes.", "human_owned_decision": "none", "human_decision_record_id": null, "evidence_receipt_ids": [ "lc-support-save-state-001", "lc-replay-exit-hesitation-001" ], "reviews": { "user": { "verdict": "continue", "strongest_signal": "Editors ask whether edits are saved and pause before leaving the editor.", "weakest_assumption": "The visible label addresses the actual moment of uncertainty.", "missing_evidence": "Post-change hesitation and support-contact rate.", "disconfirming_evidence": "Editors still pause or ask the same question after the label ships.", "stop_condition": "A five-person comprehension check shows the label is misunderstood.", "evidence_tier": "t2" }, "evidence": { "verdict": "continue", "strongest_signal": "Two independent internal sources point to the same save-state uncertainty.", "weakest_assumption": "The sampled sessions represent normal editor behavior.", "missing_evidence": "A measured event for hesitation before leaving the editor.", "disconfirming_evidence": "Instrumented sessions show no change in exit hesitation after the label.", "stop_condition": "No measurement hook can distinguish label impact from normal editor use.", "evidence_tier": "t2" }, "business": { "verdict": "continue", "strongest_signal": "The change is low cost, reversible, and aligned with support reduction.", "weakest_assumption": "Reducing save-state confusion is worth editor header attention.", "missing_evidence": "Longer-term effect on support volume and editor trust.", "disconfirming_evidence": "The label adds visual noise without reducing support contact or hesitation.", "stop_condition": "The change requires persistence, permission, notification, or external delivery work.", "evidence_tier": "t2" } }, "next_smallest_action": "Implement one save-state label in the editor header, keep current save behavior unchanged, and measure exit hesitation plus support-tag volume.", "execution_boundary": { "may_do": [ "implement the approved bounded change" ], "must_not_do": [ "expand scope or execute external irreversible actions" ], "must_ask": [ "new stakeholder, data, risk, or scope appears" ] }, "human_approval_gates": [], "high_risk_actions": [], "stop_conditions": [ "The implementation requires persistence, permission, notification, or external delivery changes.", "A new stakeholder group is affected by the label.", "The label implies a stronger save guarantee than the product can support." ], "context_pack_required": true }
Decision Log Template
Identity
| Field | Answer |
|---|---|
| Decision ID | |
| Review ID | |
| Date | YYYY-MM-DD |
| Stage | idea / prototype / launch / scale |
| Verdict | continue / verify / stop_reframe |
| Evidence tier | t0 / t1 / t2 / t3 / t4 |
Decision
What did we decide?
Evidence Used
| Evidence ID | Signal | Tier | Freshness | Decision impact |
|---|---|---|---|---|
Trade-Off
What did we protect, and what did we sacrifice?
Human-Owned Judgment
| Field | Answer |
|---|---|
| Decision type | taste / risk / strategy / ethics / meaning / none |
| Accountable owner | |
| Options considered | |
| Rationale | |
| Reversal conditions |
Next Action
One action only:
Stop Conditions
Review Date
When should this decision be revisited?
UX3 Review Template
Use templates/gate-review.md for the canonical final result.
Claim Graph
| ID | Type | Claim | Support | Counter-signal | Depends on | Breaks if false | Proof step | Stop condition |
|---|---|---|---|---|---|---|---|---|
Independent Reviews
Each reviewer returns schemas/reviewer-verdict.schema.json with
review_round: independent.
| Reviewer | Verdict | Evidence tier | Strongest signal | Weakest assumption |
|---|---|---|---|---|
| User Flow | ||||
| Evidence Flow | ||||
| Business Flow |
Challenge Round
| Reviewer | objection_to | counter_evidence | position_change |
|---|---|---|---|
| User Flow | |||
| Evidence Flow | |||
| Business Flow |
Uncertainty
| Field | Answer |
|---|---|
| Evidence tier | t0 / t1 / t2 / t3 / t4 |
| Confidence level | very_low / low / medium / high / very_high |
| Risk class | r1 / r2 / r3 / r4 |
| Reversibility | low / medium / high |
| Main uncertainty | |
| Freshness risk | |
| Proof bar |
Human Judgment
| Field | Answer |
|---|---|
| Decision type | taste / risk / strategy / ethics / meaning |
| Accountable owner | |
| Options considered | |
| Rationale | |
| Reversal conditions |
Override Ledger
One row per verdict override, kept where every reviewer can see it. The ledger exists because one override is judgment and ten quiet overrides are policy nobody agreed to.
Rules:
- Any new review of a direction with an active override must list that override in its inputs.
- Three or more active overrides on one product area force a
verifyon the next review of that area, with this ledger cited as evidence. - A row leaves the Active table only by expiry, a fired tripwire, or a renewal review - never by deletion. Move it to History with the exit reason.
Active
| override_id | review_id | accountable_owner | overridden_verdict | expires_at | tripwire status |
|---|---|---|---|---|---|
History
| override_id | exit reason (expired / tripwire fired / renewed by review) | date |
|---|---|---|
Templates
| File | Use |
|---|---|
product-brief.md |
Input brief before review. |
gate-review.md |
UX3 review output. |
ux3-council-review.md |
Extended stage, claim, confidence, and council output. |
context-pack.md |
Handoff after Continue verdict. |
decision-log.md |
Durable decision record. |
override-ledger.md |
Active verdict overrides; three on one area force verify. |
Every completed review uses ../schemas/review-result.schema.json. Templates
are human-readable companions, not alternate contracts.
Product Brief Template
This template maps to schemas/product-brief.schema.json.
1. Contract
| Field | Answer |
|---|---|
| schema_version | 2.1 |
| working_language | en / zh-TW / zh-CN / ja / ko / es / fr / de / pt |
| canonical_identifiers | en |
| fallback_language | en |
2. Product Direction
What are we considering?
3. Accountable Owner
Who owns the final human decision?
4. Stage
Choose one:
- Idea
- Prototype
- Launch
- Scale
5. Actor Boundary
| Field | Answer |
|---|---|
| actor_boundary.target_population | |
| Operator | |
| Beneficiary | |
| Machine or agent actor | |
| Affected people | |
| Excluded groups |
6. Business Boundary
| Field | Answer |
|---|---|
| Product organization | |
| Project owner | |
| Issuer | |
| Customers | |
| Buyers | |
| Operators | |
| Partners | |
| Funders | |
| Platforms | |
| Regulators | |
| Externality bearers | |
| Decision authority | |
| Value exchange |
7. Human Judgment Boundary
| Field | Answer |
|---|---|
| Human-owned decisions | |
| Machine-supported inputs | |
| Not mechanized | |
| Named human approval gate | |
| Accountable owner | |
| Condition |
8. Unresolved assumptions
9. Execution Boundary
| Field | Answer |
|---|---|
| May do | |
| Must not do | |
| Must ask |
10. Problem Hypothesis
Write one sentence:
[actor] in [situation] faces [problem] with [frequency/cost], currently solves it by [workaround], and we will know it is real if [evidence standard].
11. Current Evidence
| Signal | Source | Evidence tier | Collected at | Decision it supports |
|---|---|---|---|---|
12. Business Goal
What business outcome matters?
13. Constraints
| Constraint | Notes |
|---|---|
| Time | |
| Budget | |
| Data | |
| Brand | |
| Legal / policy | |
| Technical |
14. Proposed Next Step
What do we want to do next?
15. Known Risks
| Risk | Reversibility | Accountable owner | Condition | Rollback plan |
|---|---|---|---|---|
Gate Review Template
Human-readable companion to schemas/review-result.schema.json.
1. Contract
| Machine field | Answer |
|---|---|
| schema_version | 2.1 |
| working_language | en / zh-TW / zh-CN / ja / ko / es / fr / de / pt |
| canonical_identifiers | en |
| fallback_language | en |
| review_id | |
| product_direction | |
| mode | quick_gate / standard_gate |
| stage | idea / prototype / launch / scale |
2. Product Context
| Field | Answer |
|---|---|
| actor_boundary.target_population | |
| Operator | |
| Beneficiary | |
| Machine or agent actor | |
| Affected people | |
| Excluded groups | |
| Product organization | |
| Project owner | |
| Issuer | |
| Stakeholder effects | |
| Unresolved assumptions |
3. Human Judgment Boundary
| Field | Answer |
|---|---|
| Human-owned decisions | |
| Machine-supported inputs | |
| Not mechanized | |
| Named human approval gate | |
| Accountable owner | |
| Condition |
4. Canonical Result
| Machine field | Answer |
|---|---|
| combined_verdict | continue / verify / stop_reframe |
| weakest_flow | user / evidence / business |
| strongest_signal | |
| riskiest_claim | |
| main_uncertainty | |
| confidence_level | very_low / low / medium / high / very_high |
| evidence_tier | t0 / t1 / t2 / t3 / t4 |
| main_trade_off | |
| human_owned_decision | taste / risk / strategy / ethics / meaning / none |
| human_decision_record_id | |
| evidence_receipt_ids | |
| next_smallest_action | |
| context_pack_required | true / false |
5. Lane Reviews
| Flow | Verdict | Evidence tier | Strongest signal | Weakest assumption | Missing evidence | Disconfirming evidence | Stop condition |
|---|---|---|---|---|---|---|---|
| User | |||||||
| Evidence | |||||||
| Business |
6. Execution Boundary
| Field | Answer |
|---|---|
| May do | |
| Must not do | |
| Must ask |
7. Human Approval Gates
| Named human approval gate | Accountable owner | Condition |
|---|---|---|
8. High-Risk Actions
| Action | Named human approval gate | Accountable owner | Condition | Rollback plan |
|---|---|---|---|---|
9. Verdict Branch
| Field | Answer |
|---|---|
| proof_step for verify | |
| reframed_question for stop_reframe | |
| stop_conditions |
Context Pack Template
Use this only after Product Design Harness returns continue.
This template maps to schemas/context-pack.schema.json.
1. Contract
| Field | Answer |
|---|---|
| schema_version | 2.1 |
| working_language | en / zh-TW / zh-CN / ja / ko / es / fr / de / pt |
| canonical_identifiers | en |
| fallback_language | en |
| review_id | |
| stage | idea / prototype / launch / scale |
| combined_verdict | continue |
2. Goal
What outcome should execution achieve?
3. Approved Product Boundary
| Field | Answer |
|---|---|
| actor_boundary.target_population | |
| Operator | |
| Beneficiary | |
| Machine or agent actor | |
| Affected people | |
| Excluded groups | |
| Product organization | |
| Project owner | |
| Issuer | |
| Stakeholder effects | |
| Unresolved assumptions |
4. Human Judgment Boundary
| Field | Answer |
|---|---|
| Human-owned decisions | |
| Machine-supported inputs | |
| Not mechanized | |
| Named human approval gate | |
| Accountable owner | |
| Condition |
5. Scope
What should be done now?
6. Non-Goals
What must not be done?
7. User Rules
| Rule | Notes |
|---|---|
| Actor boundary | |
| Affected people | |
| Excluded groups | |
| Mental model | |
| Recovery path |
8. Evidence Rules
| Rule | Notes |
|---|---|
| Evidence snapshot IDs | |
| Measurement hooks | |
| Failure criteria | |
| Trace requirement | |
| Review point | |
| Evidence freshness |
9. Business Rules
| Rule | Notes |
|---|---|
| Value | |
| Cost boundary | |
| Retention logic | |
| Distribution constraint |
10. Acceptance Criteria
11. Stop Conditions
12. Execution Boundary
| Field | Answer |
|---|---|
| May do | |
| Must not do | |
| Must ask | |
| Named human approval gate | |
| Accountable owner | |
| Condition | |
| Rollback plan |
13. High-Risk Actions
| Action | Named human approval gate | Accountable owner | Condition | Rollback plan |
|---|---|---|---|---|
14. Handoff Notes
What should execution know before starting?
{ "schema_version": "1.0", "agents": [ { "id": "claim_analyst", "instructions": "agents/claim-analyst.md", "input_schema": "schemas/product-brief.schema.json", "output_schema": "schemas/claim-analysis.schema.json" }, { "id": "user_flow_reviewer", "instructions": "agents/user-flow-reviewer.md", "input_schema": "schemas/product-brief.schema.json", "output_schema": "schemas/reviewer-verdict.schema.json" }, { "id": "evidence_flow_reviewer", "instructions": "agents/evidence-flow-reviewer.md", "input_schema": "schemas/product-brief.schema.json", "output_schema": "schemas/reviewer-verdict.schema.json" }, { "id": "business_flow_reviewer", "instructions": "agents/business-flow-reviewer.md", "input_schema": "schemas/product-brief.schema.json", "output_schema": "schemas/reviewer-verdict.schema.json" }, { "id": "uncertainty_reviewer", "instructions": "agents/uncertainty-reviewer.md", "input_schema": "schemas/council-input.schema.json", "output_schema": "schemas/uncertainty-review.schema.json" }, { "id": "council_facilitator", "instructions": "agents/council-facilitator.md", "input_schema": "schemas/council-input.schema.json", "output_schema": "schemas/review-result.schema.json" } ] }
Council Facilitator
Role
Turn verified disagreement into one product decision. Do not vote and do not average.
Preflight
Reject synthesis unless the council input contains:
- claim analysis with dependency edges
- three independent lane reviews
- three challenge-round reviews
- uncertainty review
- evidence provenance and freshness
- an accountable owner for any human-owned decision
- a valid red_team_review with claim and evidence references when all three independent lane reviews returned continue
Decision Rule
| Lane state | Combined verdict |
|---|---|
Any lane stop_reframe, for any reason |
stop_reframe |
One or more verify and no stop |
verify |
All three continue |
continue |
Select the weakest flow deterministically: the lane with the most severe
verdict (stop_reframe > verify > continue); ties break to the lowest
lane evidence_tier, then to the fixed priority evidence, user, business.
The weakest flow defines the next action. Human judgment may raise the proof
bar, but it may not erase missing actor clarity, provenance, or safety.
Contract
Input: schemas/council-input.schema.json
Output: schemas/review-result.schema.json
Additional rules:
- If every lane returned continue, require the structured red-team result
(
schemas/red-team-review.schema.json) in council_input.red_team_review before synthesizing; its findings may downgrade the combined verdict to verify. - On stop_reframe, the execution boundary carries no build scope: may_do lists research and reframing actions only.
- A human override of any verdict must be recorded through
schemas/verdict-override.schema.json(checked withscripts/check_override.py) and tracked intemplates/override-ledger.md; an unlogged override does not exist. The review-result itself is never edited - the verdict stays on record, and the override authorizes execution despite it.
Only continue creates a context pack. verify creates one proof step.
stop_reframe creates one better product question.
Uncertainty Reviewer
Role
Prevent false confidence before execution expands.
Separate evidence tier from confidence. Evidence tier limits action; confidence describes trust in the interpretation.
Checks
| Check | Required question |
|---|---|
| Evidence tier | What is the strongest valid tier after freshness checks? |
| Risk class | Is the impact R1, R2, R3, or R4? |
| Reversibility | Can the next action be rolled back without hidden accumulation? |
| False confidence | What looks proven but is not? |
| Proof bar | What must be true before the next stage? |
| Human decision | What cannot be delegated without losing accountability? |
Contract
Input: schemas/council-input.schema.json
Output: schemas/uncertainty-review.schema.json
Use the decision matrix in docs/UNCERTAINTY.md. Expired evidence is
downgraded until re-verified.
User Flow Reviewer
Role
Protect user reality: actor, situation, problem, path, consequence, affected people, exclusion, mental model, and recovery.
Do not review interface polish. Do not propose a solution before the problem is testable.
Use knowledge/ontology.json for the User Flow definition and actor roles.
Use knowledge/rules.json for triggered rule IDs, especially
ux3.rule.actor_boundary, ux3.rule.problem_hypothesis, and
ux3.rule.behavior_subjective_separation. Answer in working_language; keep
schema fields, rule IDs, and Flow identifiers canonical.
Checks
| Check | Continue signal | Stop signal |
|---|---|---|
| Actor boundary | Operator, beneficiary, affected people, and excluded groups are named. | The brief says only "users." |
| Problem | Situation, frequency, consequence, workaround, and disconfirmation are clear. | The problem is a requested feature. |
| Situated Understanding | Stated opinion, quote, feeling, behavior, and trace remain distinct. | All signals are treated as equal proof. |
| Mental model | People can predict action, consequence, and recovery. | Important power is hidden. |
| Exclusion | Access, language, device, ability, policy, and data constraints are named. | No excluded group is considered. |
Approved User Flow question: who is the product for, who is affected, what are they trying to accomplish, and what cost, friction, risk, or loss of control exists now?
Reversibility lowers mode, not the review requirement.
- Boundary: verify authorizes only the exact proof_step and never general coding.
- Boundary: continue plus a valid context pack authorizes implementation.
If the user boundary is incomplete, put the missing actor facts in must_ask;
do not authorize implementation.
Contract
Input: schemas/product-brief.schema.json
Output: schemas/reviewer-verdict.schema.json with reviewer: user_flow.
List disconfirming evidence before support. In the challenge round, question one material premise from Evidence Flow or Business Flow and record whether the position changed.
Evidence Flow Reviewer
Role
Protect decision quality: provenance, signal type, interpretation, freshness, counter-signal, measurement, and failure criteria.
Do not decide whether an idea sounds attractive.
Use knowledge/ontology.json for the Evidence Flow definition and evidence
terms. Use knowledge/rules.json for triggered rule IDs, especially
ux3.rule.evidence_separation, ux3.rule.disconfirm_first,
ux3.rule.minimum_validated_proof, ux3.rule.feedback_classification, and
ux3.rule.human_judgment. Answer in working_language; keep schema fields,
rule IDs, and Flow identifiers canonical.
Checks
| Check | Continue signal | Stop signal |
|---|---|---|
| Provenance | Raw artifact and source identifier are traceable. | The source is a summary with no trace. |
| Signal type | Opinion, quote, behavior, log, transaction, and derived signal remain distinct. | Evidence types are blended. |
| Freshness | Collection and verification dates fit the decision. | Expired evidence is treated as current. |
| Decision impact | Every receipt changes a claim or next action. | Metrics are decorative. |
| Failure criteria | The team knows what stops or reframes work. | No failure condition exists. |
Approved Evidence Flow question: what signal was observed, where did it come from, what interpretation is being made, what counter-signal weakens it, and what decision impact follows?
Designer taste is a named human-owned input, not an evidence score. Post-build feedback must be classified before it changes product direction. Reversibility lowers mode, not the review requirement. verify authorizes only the exact proof_step and never general coding. continue plus a valid context pack authorizes implementation.
Contract
Evidence retrieval uses:
schemas/evidence-request.schema.jsonschemas/evidence-response.schema.jsonschemas/evidence.schema.json
Reviewer output uses schemas/reviewer-verdict.schema.json with
reviewer: evidence_flow.
In the challenge round, test whether User Flow and Business Flow conclusions are stronger than their provenance, tier, or freshness allows.
Business Flow Reviewer
Role
Protect sustainable value: value exchange, ownership cost, priority, distribution, retention, defensibility, and trust.
Do not ask only whether the direction can be built. Ask whether it deserves ownership.
Use knowledge/ontology.json for the Business Flow definition and stakeholder
roles. Use knowledge/rules.json for triggered rule IDs, especially
ux3.rule.actor_boundary, ux3.rule.whole_ownership_cost,
ux3.rule.false_product_market_fit, ux3.rule.depth_accumulation, and
ux3.rule.human_judgment. Answer in working_language; keep schema fields,
rule IDs, and Flow identifiers canonical.
Checks
| Check | Continue signal | Stop signal |
|---|---|---|
| Value exchange | User value and product value are explicit and fair. | The direction is only interesting. |
| Ownership cost | Support, trust, maintenance, exceptions, and opportunity cost are bounded. | Only initial build cost is counted. |
| Distribution | A credible route to adoption exists. | No channel or workflow entry exists. |
| Retention | Value survives novelty. | Usage depends on curiosity. |
| Defensibility | Workflow depth, domain knowledge, community, data, or edge cases compound. | It is a generic feature. |
Approved Business Flow question: who creates value, who receives value, who pays or decides, who bears cost or risk, and can the exchange remain viable and legitimate?
Require product organization, issuer, stakeholder effects, and accountable owner before handoff. A strong business lane cannot average out missing user or evidence proof. Reversibility lowers mode, not the review requirement. verify authorizes only the exact proof_step and never general coding. continue plus a valid context pack authorizes implementation.
Contract
Input: schemas/product-brief.schema.json
Output: schemas/reviewer-verdict.schema.json with reviewer: business_flow.
Compare against the current workaround and doing nothing. In the challenge round, question whether User Flow value and Evidence Flow proof can support the claimed ownership cost.
Agents
These files define reviewer roles.
registry.json is the machine-readable role registry. The Markdown files are
the human-readable instructions.
| File | Role |
|---|---|
user-flow-reviewer.md |
Checks actor, problem, affected people, and user reality. |
evidence-flow-reviewer.md |
Checks proof, measurement, failure criteria, and traceability. |
business-flow-reviewer.md |
Checks value, cost, distribution, retention, and defensibility. |
claim-analyst.md |
Breaks product directions into testable claims. |
uncertainty-reviewer.md |
Reviews unknowns, confidence, reversibility, and proof bar. |
council-facilitator.md |
Combines reviewer outputs into one verdict. |
registry.json |
Maps each role to its input and output schema. |
Claim Analyst
Role
Break a product direction into testable claims and dependency edges before the council reviews it. Do not decide whether to build.
Method
- Split broad statements into user, evidence, business, risk, and taste claims.
- Give each claim a stable identifier.
- Add support and counter-signal.
- Connect depends_on and breaks_if_false.
- Name a proof step and stop condition.
- Identify the claim whose failure changes the decision most.
Contract
Input: schemas/product-brief.schema.json
Output: schemas/claim-analysis.schema.json
Use docs/CLAIMS.md. A claim without counter-signal, dependency edges, or a
stop condition is incomplete.
#!/usr/bin/env python3 import argparse import copy import json import sys from pathlib import Path
SEVERITY = {"stop_reframe": 2, "verify": 1, "continue": 0} VERDICTS = ["continue", "verify", "stop_reframe"]
ROUTINE_KEYWORDS = [ "typo", "css", "style", "format", "lint", "comment", "readme", "docs", "rename", "cleanup", "refactor test", "fix test" ]
HIGH_RISK_KEYWORDS = [ "drop table", "alter table", "migration", "secret", "auth", "payment", "billing", "token", "privacy", "delete user", "external api", "webhook", "telemetry", "export data" ]
def classify_route_baseline(prompt, context=None): if not isinstance(prompt, str): raise ValueError("Task prompt must be a string.") if context is not None: if not isinstance(context, dict): raise ValueError("Route context must be an object.") files_changed = context.get("files_changed", 0) if type(files_changed) is not int or files_changed < 0: raise ValueError("files_changed must be a nonnegative integer.") if files_changed > 5: return "commitment" prompt_lower = prompt.lower() for kw in HIGH_RISK_KEYWORDS: if kw in prompt_lower: return "commitment" for kw in ROUTINE_KEYWORDS: if kw in prompt_lower: return "routine" return "discovery"
def evaluate_three_lanes_baseline(state): if not isinstance(state, dict): raise ValueError("Task state must be an object.") prompt = state.get("prompt", "") if not isinstance(prompt, str): raise ValueError("Task prompt must be a string.") prompt_lower = prompt.lower() evidence_tier = state.get("evidence_tier", "t0") if evidence_tier not in ("t0", "t1", "t2", "t3", "t4"): raise ValueError("evidence_tier must be one of t0, t1, t2, t3, t4.")
if evidence_tier == "t0" or any(kw in prompt_lower for kw in ["maybe", "i think", "someone said"]):
evidence_verdict = "stop_reframe"
evidence_tier = "t0"
elif evidence_tier == "t1":
evidence_verdict = "verify"
else:
evidence_verdict = "continue"
if any(kw in prompt_lower for kw in ["bypass auth", "disable security", "free tier exploit"]):
business_verdict = "stop_reframe"
elif any(kw in prompt_lower for kw in ["billing", "payment", "paid"]):
business_verdict = "verify"
else:
business_verdict = "continue"
if any(kw in prompt_lower for kw in ["everyone", "anyone", "all users"]) and "commitment" in prompt_lower:
user_verdict = "verify"
else:
user_verdict = "continue"
lane_verdicts = {
"user_flow": user_verdict,
"evidence_flow": evidence_verdict,
"business_flow": business_verdict,
}
max_sev = max(SEVERITY[v] for v in lane_verdicts.values())
combined_verdict = VERDICTS[max_sev]
priority = {"evidence_flow": 0, "user_flow": 1, "business_flow": 2}
def flow_sort(flow):
return (-SEVERITY[lane_verdicts[flow]], priority[flow])
weakest_flow = sorted(lane_verdicts.keys(), key=flow_sort)[0]
return {
"advisory": True,
"user_flow": user_verdict,
"evidence_flow": evidence_verdict,
"business_flow": business_verdict,
"evidence_tier": evidence_tier,
"combined_verdict": combined_verdict,
"weakest_flow": weakest_flow,
}def generate_boundary(state): if not isinstance(state, dict) or not isinstance(state.get("review"), dict): raise ValueError("A canonical review is required; task metadata cannot authorize execution.") if package: from .check_review import check, check_handoff else: from check_review import check, check_handoff
review = state["review"]
problems = check(review)
if problems:
raise ValueError("Invalid review: " + "; ".join(problems))
if review["combined_verdict"] == "continue":
pack = state.get("context_pack")
if not isinstance(pack, dict):
raise ValueError("A continue review requires its validated context_pack.")
problems = check_handoff(review, pack)
if problems:
raise ValueError("Invalid handoff: " + "; ".join(problems))
boundary = copy.deepcopy(review["execution_boundary"])
boundary.update({
"verdict": review["combined_verdict"],
"review_id": review["review_id"],
"weakest_flow": review["weakest_flow"],
})
for field in ["stop_conditions", "human_approval_gates", "high_risk_actions", "proof_step", "reframed_question"]:
if field in review:
boundary[field] = copy.deepcopy(review[field])
return boundarydef main(): parser = argparse.ArgumentParser(description="Offline advisory routing and canonical review boundary validation.") subparsers = parser.add_subparsers(dest="command", required=True)
route_p = subparsers.add_parser("route")
route_p.add_argument("prompt", help="User intent or task description")
eval_p = subparsers.add_parser("evaluate")
eval_p.add_argument("--task", required=True, help="Path to task JSON state")
bound_p = subparsers.add_parser("boundary")
bound_p.add_argument("--task", required=True, help="JSON containing review and, for continue, context_pack")
args = parser.parse_args()
try:
if args.command == "route":
route = classify_route_baseline(args.prompt)
print(json.dumps({"route": route, "bypass": False, "review_required": True}))
return 0
state = json.loads(Path(args.task).read_text(encoding="utf-8"))
if args.command == "evaluate":
res = evaluate_three_lanes_baseline(state)
else:
res = generate_boundary(state)
print(json.dumps(res, indent=2))
return 0
except (OSError, ValueError) as exc:
print(str(exc), file=sys.stderr)
return 1if name == "main": sys.exit(main())
#!/usr/bin/env python3 """Validate a verdict-override file against the canonical contract AND cross-check it against the review-result it overrides.
Usage: python scripts/check_override.py path/to/override.json path/to/review.json Exit 0 = valid; exit 1 = violations printed to stderr. """ import json import sys from datetime import datetime, timezone from pathlib import Path
from jsonschema import Draft202012Validator
ROOT = Path(file).resolve().parent.parent
def check(override, review, now=None): problems = [] schema = json.loads( (ROOT / "schemas" / "verdict-override.schema.json").read_text() ) for error in Draft202012Validator(schema).iter_errors(override): problems.append(f"schema: {error.json_path}: {error.message}") if problems: return problems
if override["review_id"] != review["review_id"]:
problems.append(
"review_id mismatch: override targets "
f"{override['review_id']!r} but the review file is "
f"{review['review_id']!r}"
)
if review["combined_verdict"] == "continue":
problems.append(
"a continue verdict needs no override; do not create one"
)
elif override["overridden_verdict"] != review["combined_verdict"]:
problems.append(
"overridden_verdict must equal the review's combined_verdict: "
f"{override['overridden_verdict']!r} != "
f"{review['combined_verdict']!r}"
)
if override["acknowledged_weakest_flow"] != review["weakest_flow"]:
problems.append(
"acknowledged_weakest_flow must equal the review's weakest_flow: "
f"{override['acknowledged_weakest_flow']!r} != "
f"{review['weakest_flow']!r}"
)
expires_at = datetime.fromisoformat(
override["expires_at"].replace("Z", "+00:00")
)
if now is None:
now = datetime.now(timezone.utc)
if expires_at <= now:
problems.append(
f"override expired at {override['expires_at']}: the original "
"verdict is in force again; renew through a new review"
)
banned = {
entry.casefold()
for entry in review["execution_boundary"]["must_not_do"]
}
for entry in override["authorized_scope"]["may_do"]:
if entry.casefold() in banned:
problems.append(
"authorized_scope.may_do repeats an entry from the review's "
f"execution_boundary.must_not_do: {entry!r}"
)
return problemsdef main(): if len(sys.argv) != 3: print(doc, file=sys.stderr) raise SystemExit(2) override = json.loads(Path(sys.argv[1]).read_text()) review = json.loads(Path(sys.argv[2]).read_text()) problems = check(override, review) if problems: for problem in problems: print(problem, file=sys.stderr) raise SystemExit(1) print("ok")
if name == "main": main()
#!/usr/bin/env python3 """Validate a review-result file against the canonical contract AND the semantic rules that JSON Schema alone cannot fully express.
Usage: python scripts/check_review.py path/to/review.json [--context-pack path/to/pack.json] Exit 0 = valid; exit 1 = violations printed to stderr. """ import argparse import json import sys from pathlib import Path
from jsonschema import Draft202012Validator from referencing import Registry, Resource
ROOT = Path(file).resolve().parent.parent SEVERITY = {"stop_reframe": 2, "verify": 1, "continue": 0} PRIORITY = {"evidence": 0, "user": 1, "business": 2} VERDICTS = ["continue", "verify", "stop_reframe"]
def expected_weakest_flow(reviews): def sort_key(lane): review = reviews[lane] return ( -SEVERITY[review["verdict"]], review["evidence_tier"], PRIORITY[lane], )
return sorted(reviews, key=sort_key)[0]def schema_errors(document, schema_name): schema = json.loads( (ROOT / "schemas" / schema_name).read_text() ) resources = [] for external_name in ["session-config.schema.json", "actor-boundary.schema.json"]: external_schema = json.loads((ROOT / "schemas" / external_name).read_text()) resource = Resource.from_contents(external_schema) resources.extend( [ (external_schema["$id"], resource), (external_name, resource), ( f"https://cis2042.github.io/ux3-product-design-harness/schemas/{external_name}", resource, ), ] ) registry = Registry().with_resources(resources) return [ f"schema: {error.json_path}: {error.message}" for error in Draft202012Validator(schema, registry=registry).iter_errors(document) ]
def check(document): problems = schema_errors(document, "review-result.schema.json") if problems: return problems
reviews = document["reviews"]
severities = [SEVERITY[lane["verdict"]] for lane in reviews.values()]
expected_combined = VERDICTS[max(severities)]
if document["combined_verdict"] != expected_combined:
problems.append(
"combined_verdict must equal the worst lane verdict: "
f"expected {expected_combined}, got {document['combined_verdict']}"
)
expected_weakest = expected_weakest_flow(reviews)
if document["weakest_flow"] != expected_weakest:
problems.append(
"weakest_flow must follow the deterministic selection: "
f"expected {expected_weakest}, got {document['weakest_flow']}"
)
min_lane_tier = min(lane["evidence_tier"] for lane in reviews.values())
if document["evidence_tier"] != min_lane_tier:
problems.append(
"headline evidence_tier must equal the lowest lane tier: "
f"expected {min_lane_tier}, got {document['evidence_tier']}"
)
tier = document["evidence_tier"]
verdict = document["combined_verdict"]
if tier == "t0" and verdict != "stop_reframe":
problems.append(
"evidence tier t0 forces stop_reframe: internal belief with no "
f"traceable source cannot authorize {verdict}"
)
if tier == "t1" and verdict == "continue":
problems.append(
"evidence tier t1 can never return continue: stated opinion or "
"isolated signals support at most a verify"
)
boundary = document.get("execution_boundary", {})
allowed = {entry.strip().casefold() for entry in boundary.get("may_do", [])}
forbidden = {entry.strip().casefold() for entry in boundary.get("must_not_do", [])}
contradictions = sorted(allowed & forbidden)
if contradictions:
problems.append(
"execution_boundary contradicts itself; the same entry appears in "
f"may_do and must_not_do: {contradictions}"
)
if document.get("mode") == "ux3_council":
challenges = document.get("council_record", {}).get("challenges", [])
if not any(ch.get("objection_to") != "none" for ch in challenges):
problems.append(
"council challenge round is vacuous: at least one challenge "
"must object to another lane (objection_to != none)"
)
return problemsdef check_handoff(document, context_pack): """Validate an entire handoff once; no persistent cache or authorization.""" problems = check(document) problems.extend(schema_errors(context_pack, "context-pack.schema.json")) if problems: return problems if document["combined_verdict"] != "continue": problems.append("context pack requires a continue review") fields = [ "schema_version", "session_config", "review_id", "stage", "combined_verdict", "actor_boundary", "product_organization", "stakeholder_effects", "human_judgment_boundary", "unresolved_assumptions", "execution_boundary", "human_approval_gates", "high_risk_actions", "stop_conditions", ] for field in fields: if context_pack.get(field) != document.get(field): problems.append(f"context pack {field} must match the review") if context_pack.get("evidence_snapshot_ids") != document.get("evidence_receipt_ids"): problems.append("context pack evidence_snapshot_ids must match review evidence_receipt_ids") return problems
def main(): parser = argparse.ArgumentParser(description=doc) parser.add_argument("review") parser.add_argument("--context-pack", help="Validate the review and linked handoff together") args = parser.parse_args() try: document = json.loads(Path(args.review).read_text()) if args.context_pack: context_pack = json.loads(Path(args.context_pack).read_text()) problems = check_handoff(document, context_pack) else: problems = check(document) except (OSError, ValueError) as error: print(f"cannot read artifact: {error}", file=sys.stderr) return 1 if problems: for problem in problems: print(problem, file=sys.stderr) return 1 print("ok") return 0
if name == "main": raise SystemExit(main())
jsonschema==4.26.0
Claim Analysis Prompt
Use this when a product direction sounds attractive but broad.
Prompt
Break the product direction into user, evidence, business, risk, and taste claims. Do not propose solutions.
For each claim, return schemas/claim.schema.json:
- stable claim identifier
- one testable claim
- current support
- counter-signal
- confidence level
- depends_on edges
- breaks_if_false edges
- smallest proof step
- stop condition
Then identify:
| Field | Required answer |
|---|---|
| Riskiest claim | The claim whose failure changes the decision most. |
| Critical path | The dependency chain that can collapse the direction. |
| Highest-leverage proof step | The smallest test that changes the most claims. |
| Human-owned decision | Taste, risk, strategy, ethics, meaning, or none. |
Use docs/CLAIMS.md for decomposition rules.
UX3 Council Prompt
Use this for high-uncertainty or high-impact product work before execution.
Prompt
Run a UX3 Product Design Harness council. Do not implement.
- Identify stage and risk class.
- Run claim analysis and create dependency edges.
- Retrieve missing evidence with
schemas/evidence-request.schema.jsonandschemas/evidence-response.schema.json. - Fork User, Evidence, and Business reviewers in parallel (or rotate
roles in one context, writing each lane's JSON before reading the next
brief). If all three lanes return continue, run
red-team.mdand give itsschemas/red-team-review.schema.jsonoutput to the facilitator as council_input.red_team_review before synthesis. - Wait until all three independent reviews validate against
schemas/reviewer-verdict.schema.json. Those verdicts are working artifacts: when the facilitator assembles the finalschemas/review-result.schema.json, each lane is reduced to the canonical lane fields (verdict,evidence_tier,strongest_signal,weakest_assumption,missing_evidence,disconfirming_evidence,stop_condition, andstop_reason_classonly on astop_reframeverdict); reviewer-verdict-only fields never appear insidereviews.*. - Run a challenge round. Each reviewer must name
objection_to,counter_evidence, andposition_change. - Run Uncertainty Reviewer on evidence tier, freshness, risk, and reversibility.
- Run Council Facilitator only after the join barrier.
- Route taste, risk, strategy, ethics, or meaning to Human Judgment Gate.
- Return
schemas/review-result.schema.json.
Rules:
- Do not average verdicts.
- Do not synthesize before all three lane reviews and challenge outputs exist.
- A connector, search result, or external tool cannot provide a verdict.
- Evidence tier controls action size.
- Confidence cannot upgrade evidence.
- An expired source must be re-verified or downgraded.
- A human-owned decision requires an accountable owner.
- Only
continuecreates a context pack.
Intake Prompt
Use this when a product idea is vague.
Prompt
Do not propose features.
Fill schemas/product-brief.schema.json or its human-readable companion
templates/product-brief.md.
Use working_language for prose and keep canonical identifiers in English.
Use knowledge/ontology.json for actor and stakeholder terms, then load only
triggered rule IDs from knowledge/rules.json.
Required decisions:
| Field | Required answer |
|---|---|
| stage | idea / prototype / launch / scale |
| actor_boundary | Operator, beneficiary, affected people, excluded groups. |
| product_organization | Organization, project owner, issuer, and decision authority. |
| stakeholder_effects | Who receives value, pays, decides, operates, or bears risk. |
| problem_hypothesis | Actor, situation, frequency, consequence, workaround, evidence standard. |
| evidence_tier | t0 / t1 / t2 / t3 / t4 |
| riskiest_claim | The belief most likely to change the direction. |
| disconfirming_evidence | What would prove the problem or direction wrong. |
| accountable_owner | Who owns the final human decision. |
| human_taste | Named human-owned taste input, if any; do not score it as evidence. |
| feedback_classification | Evidence, noise, incident, drift, or not_applicable. |
| execution_boundary | may_do, must_not_do, and must_ask. |
| next_question | One question that reduces the most uncertainty. |
Then run prompts/mode-selector.md. Do not write an execution plan.
Start Review Prompt
Use this as the first prompt for Product Design Harness.
Prompt
Start a Product Design Harness review.
Do not implement.
Load first, in order:
schemas/session-config.schema.jsonto setworking_languagewhile keeping canonical identifiers in English.knowledge/ontology.jsonas the canonical UX3 knowledge kernel.knowledge/rules.json, including required rules and only conditional rules triggered by the request.- This start-review prompt.
First choose the review mode:
| Mode | Use when |
|---|---|
| Quick Gate | Small reversible change. |
| Standard Gate | New feature, workflow, or experiment. |
| UX3 Council | High uncertainty, external evidence, multiple reviewers, or human-owned trade-off. |
Reversibility lowers mode, not the review requirement.
If a previous review already returned continue with a valid context pack, skip mode selection and reuse that context pack; no new review is created.
Then produce:
| Field | Required answer |
|---|---|
| Selected mode | Quick Gate, Standard Gate, or UX3 Council. |
| Reason | Why this mode fits. |
| Missing intake | Any required information not supplied. |
| Next prompt | Which prompt should run next. |
Required intake includes product organization, issuer, stakeholder effects, and accountable owner. If any are missing, list them before handoff.
If the request is vague, first fill templates/product-brief.md.
If the mode is UX3 Council, run prompts/ux3-council.md.
If the verdict becomes Continue, create templates/context-pack.md.
continue plus a valid context pack authorizes implementation.
If the verdict becomes Verify, run only the returned proof_step.
verify authorizes only the exact proof_step and never general coding.
Every completed review must return
schemas/review-result.schema.json. Do not invent a different output shape.
Every result must include may_do, must_not_do, and must_ask.
Prompts
| File | Use |
|---|---|
start-review.md |
Choose mode and start the harness. |
mode-selector.md |
Select Quick Gate, Standard Gate, or UX3 Council, or route to context-pack handoff. |
intake.md |
Turn a vague idea into a reviewable hypothesis. |
gate-review.md |
Run the full UX3 review. |
claim-analysis.md |
Break broad product ideas into testable claims. |
ux3-council.md |
Run stage, claim, flow, uncertainty, and council review. |
red-team.md |
Challenge an overly convincing product plan. |
Red-Team Prompt
Use this when a product plan sounds convincing.
Prompt
Red-team this product direction using Product Design Harness.
Do not list supporting reasons first.
Start with:
| Field | Required answer |
|---|---|
| Five failure modes | Ways this direction can fail. |
| Disconfirming tests | Evidence that would prove it wrong. |
| Hidden affected people | People affected without direct operation. |
| Current workaround | What users do today instead. |
| Substitute threats | Direct, indirect, platform, workflow, and doing-nothing substitutes. |
| Trust risk | What could damage confidence or dignity. |
| Stop condition | What should block execution. |
Then provide a verdict using continue, verify, or stop_reframe as a
valid schemas/red-team-review.schema.json object. Include the claim IDs and
evidence receipt IDs that the challenge relies on.
When all three independent Council reviewers returned continue, attach this object as council_input.red_team_review before the facilitator synthesizes.
Gate Review Prompt
Use this before design, implementation, prototype, launch, or growth work.
Prompt
Run a Product Design Harness gate review. Do not implement.
Use the already-loaded schemas/session-config.schema.json,
knowledge/ontology.json, and triggered knowledge/rules.json entries. Keep
the response in working_language while keeping schema fields, rule IDs, and
Flow identifiers canonical.
Review User Flow, Evidence Flow, and Business Flow independently.
Each lane must return the fields in
schemas/reviewer-verdict.schema.json. For a Standard Gate, use
review_round: independent and omit objection_to, counter_evidence,
and position_change; those fields exist only in the challenge round.
Explain the counter-evidence search in disconfirming_evidence.
Reviewer verdicts are working artifacts, not the final shape. When you
assemble schemas/review-result.schema.json, reduce each lane to exactly
the canonical lane fields: verdict, evidence_tier, strongest_signal,
weakest_assumption, missing_evidence, disconfirming_evidence,
stop_condition, plus stop_reason_class when and only when that lane
verdict is stop_reframe. Never copy reviewer, review_round,
confidence_level, or next_smallest_action into reviews.*; the
canonical contract rejects them.
Then apply the weakest-flow rule:
| Lane state | Combined verdict |
|---|---|
Any lane stop_reframe, for any reason |
stop_reframe |
At least one verify and no stop |
verify |
All three continue |
continue |
Select weakest_flow deterministically: the most severe lane verdict
(stop_reframe > verify > continue); ties break to the lowest lane
evidence_tier, then to the fixed priority evidence, user, business.
Return the final result as schemas/review-result.schema.json.
Rules:
- Reversibility lowers mode, not the review requirement.
- List disconfirming evidence before support.
- Use evidence tier, not confidence alone, to bound action. The contract
enforces the floor:
t0headline evidence forcesstop_reframe, andt1can never returncontinue. - Do not average verdicts.
continuecreates a context pack; continue plus a valid context pack authorizes implementation.verifycreates one proof step; verify authorizes only the exact proof_step and never general coding.stop_reframecreates one better product question.- Every branch must state
may_do,must_not_do, andmust_ask. - Product organization, issuer, stakeholder effects, and accountable owner must be present before any handoff.
- Designer taste stays a human-owned input and never upgrades evidence.
- Post-build feedback must be classified with ux3.rule.feedback_classification before it changes scope.
Mode Selector Prompt
Use this to choose the smallest review process that is still responsible.
Prompt
Select the Product Design Harness mode.
Answer the questions:
| Question | Answer |
|---|---|
| Is the next step reversible? | Yes / No / Unknown |
| Is user harm possible? | Yes / No / Unknown |
| Is business cost high? | Yes / No / Unknown |
| Is external evidence needed? | Yes / No / Unknown |
| Are multiple stakeholders affected? | Yes / No / Unknown |
| Is the product direction still vague? | Yes / No / Unknown |
| Is this a new feature or workflow, rather than a small bounded change? | Yes / No / Unknown |
Return:
| Field | Required answer |
|---|---|
| Mode | Quick Gate, Standard Gate, or UX3 Council. |
| Why this mode | One sentence. |
| Evidence bar | What evidence is needed before the next step. |
| Human gate needed | Yes or No. |
| Next file | Prompt or template to use next. |
Rules:
- If risk is high or reversibility is low, choose UX3 Council.
- If the direction is vague, choose Standard Gate and complete the product brief.
- If the work is a new feature, workflow, or experiment, choose Standard Gate.
- Choose Quick Gate only for a small, reversible, bounded change to an existing flow.
- Do not choose Quick Gate for irreversible or high-risk work.
Handoff is not a review mode. If a valid continue review-result already
exists, skip mode selection and produce a context pack from
../templates/context-pack.md; no new review-result is created.
{ "schema_version": "1.0.0", "rules": [ { "rule_id": "ux3.rule.actor_boundary", "title": "Actor boundary", "flow": "user_flow", "strength": "required", "trigger": [ "A review names a user, customer, operator, beneficiary, machine actor, buyer, issuer, owner, or affected group." ], "must_inspect": [ "Primary and secondary users, beneficiaries, affected people, excluded groups, machine actors, buyers, issuers, and accountable owners." ], "must_do": [ "Separate who operates the product, who benefits, who pays, who decides, who issues claims, who owns accountability, and who absorbs risk." ], "must_not_do": [ "Treat user, customer, buyer, beneficiary, operator, and affected person as interchangeable." ], "evidence_required": [ "Named roles with source, relationship to the workflow, authority, benefit, burden, and risk exposure." ], "counter_signal": [ "A stakeholder is affected or pays but is missing from the actor map, or a machine actor can act without a named accountable owner." ], "human_boundary": [ "A named human decides whether excluded or indirectly affected groups are acceptable for the current proof step." ], "stop_condition": [ "Stop or reframe when the accountable owner, affected population, or machine actor authority cannot be identified." ], "output_requirement": [ "Emit an actor map with operator, beneficiary, affected_person, excluded_group, buyer, issuer, and accountable_owner fields or explicit not_applicable reasons." ], "source": [ "UX3 canonical model: User Flow and Business Flow actor definitions." ] }, { "rule_id": "ux3.rule.problem_hypothesis", "title": "Problem hypothesis", "flow": "user_flow", "strength": "required", "trigger": [ "A request proposes a feature, workflow, product direction, launch, or change." ], "must_inspect": [ "Target situation, current workaround, actor cost, friction, risk, urgency, and falsification criteria." ], "must_do": [ "Restate the request as a testable problem hypothesis before recommending build or launch." ], "must_not_do": [ "Treat a requested solution, executive preference, or novelty claim as proof that the problem exists." ], "evidence_required": [ "Observed behavior, direct quote, workflow trace, support issue, willingness signal, or comparable source tied to a specific actor and situation." ], "counter_signal": [ "Actors do not experience the cost, already have a sufficient workaround, or would not change behavior if the product existed." ], "human_boundary": [ "A named human may choose to explore a weakly evidenced problem only by recording the learning reason and proof bar." ], "stop_condition": [ "Stop or reframe when the problem, actor, situation, or disconfirming test cannot be stated." ], "output_requirement": [ "Emit a problem_hypothesis with actor, situation, current_workaround, cost, falsification_criteria, and next_learning_step." ], "source": [ "UX3 knowledge kernel: problem requests remain hypotheses until situated evidence is known." ] }, { "rule_id": "ux3.rule.behavior_subjective_separation", "title": "Behavior and subjective experience separation", "flow": "evidence_flow", "strength": "required", "trigger": [ "A review uses user opinion, interview language, sentiment, analytics, logs, observed workflow, or behavioral metrics." ], "must_inspect": [ "Observed behavior, stated experience, context, intensity, timing, and whether either signal changes the product decision." ], "must_do": [ "Record behavior and subjective experience as different signals and compare whether they support the same interpretation." ], "must_not_do": [ "Use praise as behavior, use behavior as motivation, or let either signal impersonate the other." ], "evidence_required": [ "At least one source-labeled behavior signal or source-labeled subjective signal with context and decision impact." ], "counter_signal": [ "Users praise the idea but do not act, or users act while stated motivation contradicts the assumed reason." ], "human_boundary": [ "A named human decides how much subjective meaning or emotional intensity should influence taste and positioning." ], "stop_condition": [ "Stop or downgrade when behavior and subjective experience are collapsed into one unsupported evidence claim." ], "output_requirement": [ "Emit separate behavior_signal and subjective_signal entries, each with source, interpretation, counter_signal, and decision_impact." ], "source": [ "UX3 canonical model: Evidence Flow separates behavior, subjective experience, and interpretation." ] }, { "rule_id": "ux3.rule.disconfirm_first", "title": "Disconfirm first", "flow": "evidence_flow", "strength": "required", "trigger": [ "A review supports a product direction, proof claim, investment, launch, or automation step." ], "must_inspect": [ "The strongest material counter-evidence, missing evidence, alternate explanations, and failure criteria." ], "must_do": [ "Present disconfirming evidence and uncertainty before supporting evidence." ], "must_not_do": [ "List only positive signals or bury counter-signals after a confident recommendation." ], "evidence_required": [ "A source-labeled counter-signal or an explicit statement that no material counter-signal is currently known and what search was performed." ], "counter_signal": [ "The main support can be explained by novelty, selection bias, channel pressure, one-off urgency, or reviewer preference." ], "human_boundary": [ "A named human may proceed despite counter-evidence only with recorded rationale, accepted risk, and reversal condition." ], "stop_condition": [ "Stop or reframe when no plausible counter-signal has been inspected for a material decision." ], "output_requirement": [ "Emit counter_signal_first with counter_signal, alternate_explanation, decision_impact, and reversal_condition." ], "source": [ "UX3 distilled rule family: Disconfirm first." ] }, { "rule_id": "ux3.rule.evidence_separation", "title": "Evidence separation", "flow": "evidence_flow", "strength": "required", "trigger": [ "Any evidence receipt, claim, metric, quote, benchmark, incident, or evaluation is used to change a decision." ], "must_inspect": [ "Source, signal, interpretation, counter-signal, freshness, reliability, and decision impact." ], "must_do": [ "Keep source, signal, interpretation, counter-signal, and decision impact as separate fields." ], "must_not_do": [ "Embed interpretation inside a metric or quote, or let a source label stand in for decision impact." ], "evidence_required": [ "Traceable evidence receipt with provenance and a decision-changing interpretation." ], "counter_signal": [ "The same signal supports multiple interpretations, is stale, lacks provenance, or conflicts with another material source." ], "human_boundary": [ "A named human owns any taste, ethics, or strategy input that is not observed evidence." ], "stop_condition": [ "Stop or downgrade when source, signal, interpretation, or decision impact is missing for material evidence." ], "output_requirement": [ "Emit evidence entries with source, signal, interpretation, counter_signal, and decision_impact fields." ], "source": [ "UX3 canonical model: Evidence Flow separation." ] }, { "rule_id": "ux3.rule.evidence_sized_action", "title": "Evidence-sized action", "flow": "cross_flow", "strength": "required", "trigger": [ "A review recommends build, launch, spend, automation, external communication, irreversible change, or broader rollout." ], "must_inspect": [ "Evidence tier, risk, reversibility, blast radius, uncertainty, stakeholder exposure, and next smallest learning step." ], "must_do": [ "Limit the next action to what the current evidence tier, risk, and reversibility justify." ], "must_not_do": [ "Upgrade weak proof with confidence language, urgency, taste, or stakeholder pressure." ], "evidence_required": [ "Evidence tier and rationale for why the proposed action size is proportional to observed proof and recoverability." ], "counter_signal": [ "The action affects more people, spends more, grants more authority, or becomes harder to reverse than the evidence supports." ], "human_boundary": [ "A named human may accept a larger action only by recording risk appetite, owner, limit, and reversal condition." ], "stop_condition": [ "Stop or reduce scope when action size exceeds evidence tier or recovery capacity." ], "output_requirement": [ "Emit bounded_action with evidence_tier, max_scope, risk_limit, reversibility, owner, stop_condition, and observation_plan." ], "source": [ "UX3 distilled rule family: Evidence-sized action." ] }, { "rule_id": "ux3.rule.minimum_authority", "title": "Minimum authority", "flow": "cross_flow", "strength": "conditional", "trigger": [ "A machine actor, automation, agent, workflow, integration, or delegated process can read, write, decide, spend, message, publish, or call tools." ], "must_inspect": [ "Requested permissions, tool access, data access, execution boundary, approval path, trace, and recovery option." ], "must_do": [ "Grant the least authority needed for the current proof step and require a named accountable owner." ], "must_not_do": [ "Grant broad, persistent, external, or irreversible authority for a narrow learning step." ], "evidence_required": [ "Specific task need, minimum permission set, duration, owner, audit trace, and revocation path." ], "counter_signal": [ "The actor requests unused permissions, lacks an owner, cannot be audited, or can affect parties outside the proof boundary." ], "human_boundary": [ "A named human approves any external, irreversible, sensitive, financial, or reputation-bearing authority." ], "stop_condition": [ "Stop when minimum permission, owner, trace, or revocation path is absent." ], "output_requirement": [ "Emit authority_boundary with actor, allowed_actions, denied_actions, data_scope, time_limit, owner, audit_trace, and revocation_path." ], "source": [ "UX3 distilled rule family: Minimum authority." ] }, { "rule_id": "ux3.rule.high_risk_action_bundle", "title": "High-risk action bundle", "flow": "cross_flow", "strength": "conditional", "trigger": [ "The next action is external, irreversible, sensitive, financial, legal, reputation-bearing, safety-relevant, or hard to recover." ], "must_inspect": [ "Owner, approval, scope limit, blast radius, trace, failure handling, rollback, recovery path, and user or stakeholder impact." ], "must_do": [ "Require an owner, explicit approval, limit, trace, failure handling, and recovery path before execution." ], "must_not_do": [ "Execute high-risk actions from an implicit approval, vague owner, or unbounded scope." ], "evidence_required": [ "Approval record, action boundary, risk assessment, recovery plan, and evidence that the action is necessary for the current proof step." ], "counter_signal": [ "No rollback exists, affected parties are not identified, approval is ambiguous, or failure handling depends on manual discovery after harm." ], "human_boundary": [ "A named human retains final approval and responsibility for high-risk execution." ], "stop_condition": [ "Stop when owner, approval, limit, trace, failure handling, or recovery path is missing." ], "output_requirement": [ "Emit high_risk_action_bundle with owner, approval_record, scope_limit, trace_id, failure_handling, recovery_path, and abort_condition." ], "source": [ "UX3 distilled rule family: High-risk action bundle." ] }, { "rule_id": "ux3.rule.minimum_validated_proof", "title": "Minimum Validated Proof", "flow": "cross_flow", "strength": "required", "trigger": [ "A review proposes an MVP, prototype, pilot, experiment, launch slice, or validation step." ], "must_inspect": [ "Riskiest assumption, actor behavior needed to prove it, proof bar, smallest test, and what would invalidate the direction." ], "must_do": [ "Design the smallest proof that tests the riskiest assumption, not the smallest feature list." ], "must_not_do": [ "Call a reduced feature set an MVP when it does not test the core risk." ], "evidence_required": [ "A named riskiest assumption, measurable behavior or outcome, proof bar, observation plan, and disconfirming threshold." ], "counter_signal": [ "The proposed MVP mainly demonstrates build ability, visual appeal, or internal preference while leaving the riskiest assumption untested." ], "human_boundary": [ "A named human chooses which assumption is strategic enough to test first when multiple material risks remain." ], "stop_condition": [ "Stop or reframe when the proof step does not observe the riskiest assumption." ], "output_requirement": [ "Emit minimum_validated_proof with riskiest_assumption, test_actor, proof_bar, smallest_test, disconfirming_threshold, and next_decision." ], "source": [ "UX3 distilled rule family: Minimum Validated Proof." ] }, { "rule_id": "ux3.rule.feedback_classification", "title": "Feedback classification", "flow": "evidence_flow", "strength": "required", "trigger": [ "Incoming feedback, complaint, praise, support request, metric change, incident, review, or stakeholder request may affect product direction." ], "must_inspect": [ "Source, actor role, recency, repeatability, severity, behavior link, decision impact, and whether the signal is evidence, noise, incident, or drift." ], "must_do": [ "Classify feedback before changing direction or adding work." ], "must_not_do": [ "Treat all feedback as equal, or convert a single loud signal into a roadmap change without classification." ], "evidence_required": [ "Feedback source, classification, rationale, related evidence, counter-signal, and proposed action or no-action reason." ], "counter_signal": [ "The feedback is isolated, unactionable, mismatched to the target actor, contradicted by behavior, or already covered by an accepted risk." ], "human_boundary": [ "A named human decides whether strategically important but weak feedback deserves exploration despite low evidence." ], "stop_condition": [ "Stop or defer when feedback cannot be classified or lacks a decision impact." ], "output_requirement": [ "Emit feedback_classification with category, source, actor_role, severity, repeatability, decision_impact, and next_action." ], "source": [ "UX3 distilled rule family: Feedback classification." ] }, { "rule_id": "ux3.rule.false_product_market_fit", "title": "False product-market fit", "flow": "cross_flow", "strength": "required", "trigger": [ "A review claims traction, product-market fit, strong demand, adoption, retention, or launch readiness." ], "must_inspect": [ "Repeated use, workflow dependence, payment or budget movement, switching cost, referral with reputation at stake, retention, and cohort quality." ], "must_do": [ "Rank praise and novelty below repeated behavior, workflow dependence, payment, and reputation-bearing referral." ], "must_not_do": [ "Treat excitement, signups, demos, vanity metrics, or novelty as product-market fit." ], "evidence_required": [ "Behavioral proof tied to a target actor and repeated or costly enough to show real demand." ], "counter_signal": [ "Users praise but do not return, do not pay, do not integrate, do not depend on the workflow, or churn after novelty fades." ], "human_boundary": [ "A named human may pursue a strategic wedge before fit only by recording that fit is unproven and naming the next proof bar." ], "stop_condition": [ "Stop or downgrade fit claims when proof is limited to praise, novelty, signups, or one-off usage." ], "output_requirement": [ "Emit fit_evidence with signal_strength, behavior_frequency, workflow_dependence, payment_signal, referral_risk, counter_signal, and fit_claim_limit." ], "source": [ "UX3 distilled rule family: False product-market fit." ] }, { "rule_id": "ux3.rule.whole_ownership_cost", "title": "Whole ownership cost", "flow": "business_flow", "strength": "required", "trigger": [ "A review recommends building, launching, integrating, automating, scaling, or maintaining a product capability." ], "must_inspect": [ "Support, trust, measurement, maintenance, confusion, governance, dependency, opportunity cost, recovery cost, and stakeholder burden." ], "must_do": [ "Include whole ownership cost in viability and value exchange decisions." ], "must_not_do": [ "Use build cost, model cost, or implementation effort as the full cost of ownership." ], "evidence_required": [ "Cost categories, responsible owner, expected operating load, measurement plan, and what cost would make the direction nonviable." ], "counter_signal": [ "Hidden support, trust, compliance, maintenance, or confusion cost exceeds the value created or cannot be owned." ], "human_boundary": [ "A named human accepts or rejects ownership cost trade-offs and opportunity cost." ], "stop_condition": [ "Stop or reframe when ownership cost is unknown, unowned, or larger than the justified proof step." ], "output_requirement": [ "Emit ownership_cost with support, trust, measurement, maintenance, governance, opportunity_cost, owner, and nonviable_threshold." ], "source": [ "UX3 distilled rule family: Whole ownership cost." ] }, { "rule_id": "ux3.rule.depth_accumulation", "title": "Depth accumulation", "flow": "business_flow", "strength": "advisory", "trigger": [ "A review claims defensibility, moat, compounding advantage, quality, expertise, or long-term product strength." ], "must_inspect": [ "Domain terms, edge cases, failure history, workflow rules, evaluation suites, expert judgment, proprietary learning, and switching cost." ], "must_do": [ "Identify what durable depth accumulates from use, learning, failures, and expert review." ], "must_not_do": [ "Describe feature count, generic automation, or visual polish as durable product depth." ], "evidence_required": [ "A depth asset with source, owner, reuse path, evaluation method, and evidence that it improves future decisions or workflow lock-in." ], "counter_signal": [ "The asset is generic, easily copied, not reused, not evaluated, or disconnected from the target workflow." ], "human_boundary": [ "A named human judges whether the depth aligns with strategy and is worth compounding." ], "stop_condition": [ "Stop claiming defensibility when no durable depth asset or accumulation path is identified." ], "output_requirement": [ "Emit depth_asset with asset_type, source, reuse_path, evaluation_method, owner, counter_signal, and compounding_decision." ], "source": [ "UX3 distilled rule family: Depth accumulation." ] }, { "rule_id": "ux3.rule.failure_to_rule_learning", "title": "Failure-to-rule learning", "flow": "evidence_flow", "strength": "required", "trigger": [ "An edge case, incident, repeated failure, surprising outcome, or recurring review correction appears." ], "must_inspect": [ "Failure pattern, recurrence, affected actors, missing evidence, broken assumption, reproducible case, and whether the system should change." ], "must_do": [ "Convert repeated failure into a reproducible case, test, evaluation, rule, or explicit accepted risk." ], "must_not_do": [ "Leave repeated failures as chat memory, undocumented judgment, or one-off manual caution." ], "evidence_required": [ "Failure description, recurrence evidence, affected scope, root assumption, selected learning artifact, and owner." ], "counter_signal": [ "The failure is non-reproducible, isolated, outside the product boundary, or already covered by a sufficient rule and test." ], "human_boundary": [ "A named human may accept a recurring risk only with rationale, owner, review date, and reversal condition." ], "stop_condition": [ "Stop or block repetition when a repeated failure has no test, evaluation, rule, or accepted-risk record." ], "output_requirement": [ "Emit learning_update with failure_pattern, recurrence, artifact_type, owner, due_condition, and accepted_risk if applicable." ], "source": [ "UX3 distilled rule family: Failure-to-rule learning." ] }, { "rule_id": "ux3.rule.mental_model_alignment", "title": "Mental model alignment", "flow": "user_flow", "strength": "conditional", "trigger": [ "A product introduces a novel interaction, agent capability, automated decision, unfamiliar state, hidden system behavior, or changed responsibility that a target actor must understand." ], "must_inspect": [ "The actor's current mental model, the product team's conceptual model, prior expectation, predicted system behavior, visible state, error expectation, and responsibility boundary." ], "must_do": [ "Compare what the actor expects with what the product or agent will actually do, then expose the smallest explanation, preview, feedback, or control needed for accurate prediction." ], "must_not_do": [ "Treat first-use success, visual familiarity, or confident language as proof that the actor understands capability, uncertainty, hidden action, or consequence." ], "evidence_required": [ "A comprehension or prediction test in which a target actor explains what will happen, what data or authority is involved, what failure looks like, and how to intervene." ], "counter_signal": [ "The actor can complete the happy path but predicts the wrong capability, state, error, data use, automation boundary, or recovery path." ], "human_boundary": [ "A named human decides which complexity is essential to the product promise and which complexity must be removed rather than explained away." ], "stop_condition": [ "Stop or reduce autonomy when the target actor cannot form an accurate mental model of material behavior, consequence, or intervention." ], "output_requirement": [ "Emit mental_model_record with target_actor, current_expectation, conceptual_model, prediction_test, mismatch, intervention, evidence_needed, owner, and stop_condition." ], "source": [ "UX3 chapter 0-2: mental model and conceptual model alignment.", "UX3 chapter 1-3: iterative user-centered design.", "UX3 chapter 2-3: interaction feedback and system-state understanding." ] }, { "rule_id": "ux3.rule.human_factors_load", "title": "Human factors load", "flow": "user_flow", "strength": "conditional", "trigger": [ "A workflow has material cognitive, physical, attention, accessibility, safety, interruption, handoff, automation-bias, or recovery risk, or observed evidence shows that the target actor is overloaded or losing situation awareness." ], "must_inspect": [ "The human, task, tool, and environment as one system; attention demand, working memory demand, situation awareness, action mapping, interruption, handoff, error visibility, and recovery burden." ], "must_do": [ "Reduce memory-dependent action, keep material state in the world, make task progress and automation state visible, and provide a recoverable path after interruption or error." ], "must_not_do": [ "Optimize the interface in isolation while ignoring the surrounding task, environment, cognitive load, automation bias, overtrust, handoff fatigue, or recovery work." ], "evidence_required": [ "Observed task performance in the intended context, including attention shifts, memory failures, completion, error, hesitation, interruption, handoff, and recovery behavior." ], "counter_signal": [ "The flow appears efficient in a scripted demo but fails under interruption, divided attention, real environment constraints, automation bias, overtrust, or recovery." ], "human_boundary": [ "A named human accepts any residual cognitive or physical burden and confirms that safety, accessibility, and operator responsibility remain supportable." ], "stop_condition": [ "Stop or simplify when material state is hidden, recovery depends on memory, or observed cognitive burden exceeds the target actor's context and capacity." ], "output_requirement": [ "Emit human_factors_review with actor, task, tool, environment, attention_load, memory_load, automation_risk, interruption_path, recovery_path, observed_evidence, owner, and required_change." ], "source": [ "UX3 chapter 1-7: human, task, tool, and environment system; attention, memory, situation awareness, and knowledge in the world.", "UX3 chapter 2-3: action, feedback, mapping, and interaction principles.", "UX3 chapter 3-8: contextual usability, effectiveness, efficiency, satisfaction, error, and recovery." ] }, { "rule_id": "ux3.rule.research_validity", "title": "Research validity", "flow": "evidence_flow", "strength": "conditional", "trigger": [ "A decision cites an interview, survey, usability test, analytics result, field observation, experiment, synthetic user, simulation, model-generated synthesis, or research claim." ], "must_inspect": [ "The research question, decision uncertainty, method fit, target actor, sample, context, attitude signal, behavior signal, comparison, bias, limitation, and disconfirming result." ], "must_do": [ "Match the method to the decision uncertainty, separate exploratory from evaluative work, and distinguish attitude, behavior, qualitative meaning, and quantitative frequency. Reference canonical evidence receipts and behavior or subjective signal records instead of copying their contents into the research-validity record." ], "must_not_do": [ "Use synthetic users, simulation, AI summaries, convenience samples, stated preference, or a usability test as substitutes for evidence they cannot produce. Do not duplicate evidence entries, behavior signals, subjective signals, counter-signals, or decision-impact records." ], "evidence_required": [ "A research receipt naming the research question, target actor, method, sample, context, raw source, observed attitude or behavior, limitation, counter-signal, and decision impact." ], "counter_signal": [ "The result changes when context, sample, task, facilitator, metric, interpretation, or comparison changes, or attitude and behavior point in different directions." ], "human_boundary": [ "A named human owns method selection, interpretation, ethical treatment of participants, and any decision to proceed with known evidence limitations." ], "stop_condition": [ "Stop or downgrade the claim when the method cannot answer the research question, the sample misses the target actor, raw evidence is unavailable, or simulation is presented as real-world validation." ], "output_requirement": [ "Emit research_validity_record with research_question, decision_uncertainty, target_actor, method, sample, context, evidence_receipt_ids, behavior_signal_refs, subjective_signal_refs, limitation, counter_signal_refs, decision_impact_ref, and next_method." ], "source": [ "UX3 chapter 1-8: research reduces uncertainty; method choice spans qualitative, quantitative, attitude, behavior, laboratory, and field work.", "UX3 chapter 2-9: task-based prototype testing and contextual observation.", "UX3 chapter 3-7: subjective and objective evidence have different strengths and failure modes.", "UX3 chapter 3-8: usability evaluation is distinct from exploratory user research." ] }, { "rule_id": "ux3.rule.value_market_path", "title": "Value-to-market path", "flow": "business_flow", "strength": "conditional", "trigger": [ "A review proposes a value proposition, product direction, market position, business model, go-to-market path, launch channel, buyer pathway, or pre-fit growth hypothesis." ], "must_inspect": [ "The target actor and job, unmet need, current alternative, differentiated value, user cost, business capture, willingness signal, buyer, channel, retention mechanism, operating model, and failure threshold." ], "must_do": [ "Connect target actor value to a credible exchange and market path: why the actor changes behavior, why the buyer supports it, how the channel reaches them, and what repeated use or retention would mean. This is a pre-fit path review, not a product-market fit verdict." ], "must_not_do": [ "Start from monetization mechanics, feature novelty, total market size, generated traffic, or a preferred channel without proving target value and behavior change. Do not use this rule to validate a product-market fit claim; activate ux3.rule.false_product_market_fit instead." ], "evidence_required": [ "A target-actor receipt showing current alternative, experienced cost, willingness or costly behavior, differentiated value, buyer or budget signal, reachable channel, and retention or repeat-use hypothesis." ], "counter_signal": [ "The current alternative is sufficient, the user and buyer value different outcomes, willingness disappears outside a subsidized channel, acquisition does not lead to retention, or the value can be copied without workflow depth." ], "human_boundary": [ "A named human owns positioning, pricing ethics, strategic market choice, acceptable subsidy, brand promise, and any decision to explore before market evidence is strong." ], "stop_condition": [ "Stop or reframe when no target actor changes meaningful behavior, no credible buyer or channel exists, the exchange hides unacceptable cost, or the proposed retention mechanism lacks a testable cause." ], "output_requirement": [ "Emit value_market_path_record with target_actor, job, current_alternative, unmet_need, differentiated_value, user_cost, business_capture, buyer, willingness_signal, channel, retention_hypothesis, counter_signal, owner, and next_market_test." ], "source": [ "UX3 chapter 1-5: positioning requires wanted, differentiated, and profitable value.", "UX3 chapter 1-9: value proposition connects user need, product promise, and exchange.", "UX3 chapter 2-2: product design decisions depend on the complete business model.", "UX3 chapter 3-1: go-to-market is the activation plan for product-market fit.", "UX3 chapter 3-2: acquisition, activation, retention, referral, revenue, and growth loops." ] }, { "rule_id": "ux3.rule.human_agent_interaction", "title": "Human-agent interaction", "flow": "cross_flow", "strength": "conditional", "trigger": [ "A machine actor interprets intent, proposes or changes a plan, calls a tool, transforms data, makes a recommendation, takes action, or hands work back to a person." ], "must_inspect": [ "User intent, plan visibility, system status, uncertainty, authority, data use, tool action, approval point, interrupt, correct, undo, log, handoff, failure state, recovery path, and accountable owner." ], "must_do": [ "Keep material intent, plan, action, state, and consequence inspectable; provide interrupt, correct, undo, or approve controls in proportion to risk; preserve a readable log and a visible recovery surface. When authority or high-risk rules also trigger, reference their canonical records instead of copying permission, approval, owner, trace, rollback, or operational recovery fields." ], "must_not_do": [ "Hide a material plan or tool action behind conversational fluency, treat generated text as informed consent, or make completion easier than correction, refusal, exit, or recovery. Do not duplicate authority_boundary, high_risk_action_bundle, or recovery_path records inside the interaction contract." ], "evidence_required": [ "A scenario-based interaction test showing that the target actor can predict the next action, inspect the plan, approve or refuse when required, interrupt, correct, undo where feasible, read the log, and recover from failure." ], "counter_signal": [ "The happy path succeeds but the actor cannot see what the agent did, detect a wrong assumption, stop execution, correct state, understand a handoff, or recover without expert support." ], "human_boundary": [ "A named human defines which actions require approval, which consequences are unacceptable, which records must remain legible, and who is responsible when the agent is wrong." ], "stop_condition": [ "Stop or reduce agent authority when material intent, plan, status, approval, interrupt, correction, log, accountability, or recovery is absent or untested." ], "output_requirement": [ "Emit interaction_contract with target_actor, intent, visible_plan, visible_status, approval_surface, interrupt_path, correct_path, undo_path, log_surface, failure_state, recovery_surface, handoff, test_evidence, authority_boundary_ref when minimum authority is triggered, and high_risk_action_bundle_ref when high risk is triggered." ], "source": [ "UX3 chapter 2-3: action, feedback, mapping, visibility, and system-state interaction principles.", "UX3 chapter 2-4: information architecture connects user, content, context, and decision information.", "UX3 chapter 2-6: interface principles reduce learning cost and make feedback understandable.", "UX3 chapter 3-3: touchpoints form one connected journey across channels and devices.", "UX3 chapter 3-4: each touchpoint must align actor, motivation, device, information, persuasion, guidance, and friendliness." ] }, { "rule_id": "ux3.rule.motivation_ethics", "title": "Motivation ethics", "flow": "cross_flow", "strength": "conditional", "trigger": [ "A product uses retention, notification, personalization, recommendation, streaks, rewards, scarcity, social pressure, loss framing, gamification, or adaptive difficulty to change repeated behavior." ], "must_inspect": [ "The target behavior, intrinsic and extrinsic motivation, user benefit, business benefit, friction, frequency, vulnerable actors, personalization inputs, social pressure, loss mechanism, consent, exit, and long-term autonomy." ], "must_do": [ "Make the intended behavior and exchange legible, preserve meaningful choice and exit, limit pressure and personalization, and test whether repeated use still serves the target actor's stated goal." ], "must_not_do": [ "Treat engagement, time spent, return frequency, conversion, or reward response as sufficient when the mechanism exploits vulnerability, obscures cost, weakens autonomy, or makes exit harder." ], "evidence_required": [ "Behavioral and subjective evidence covering benefit, regret, trust, pressure, unintended use, vulnerable-group impact, opt-out or exit behavior, and whether intrinsic motivation survives removal of extrinsic rewards." ], "counter_signal": [ "Engagement rises while trust, goal completion, wellbeing, informed choice, intrinsic motivation, or willingness to continue without pressure declines." ], "human_boundary": [ "A named human owns the ethical limit on manipulation, vulnerable-group protection, acceptable pressure, pricing and reward fairness, personalization depth, and removal or exit rights." ], "stop_condition": [ "Stop or redesign when the mechanism depends on concealed cost, coercive loss, vulnerable-user exploitation, non-consensual personalization, blocked exit, or engagement that conflicts with the actor's goal." ], "output_requirement": [ "Emit motivation_ethics_review with target_behavior, intrinsic_motivation, extrinsic_motivation, user_benefit, business_benefit, vulnerable_groups, manipulation_risk, personalization_scope, pressure_limit, consent, exit_path, counter_signal, owner, and redesign_condition." ], "source": [ "UX3 chapter 3-5: retention depends on motivation, reinforcement, lifetime value, recommendation, and ethical restraint against addiction.", "UX3 chapter 3-6: gamification aligns challenge, ability, trigger, intrinsic and extrinsic motivation, reward, and player type." ] }, { "rule_id": "ux3.rule.human_judgment", "title": "Human judgment", "flow": "cross_flow", "strength": "required", "trigger": [ "A decision depends on taste, ethics, meaning, brand feel, strategic appetite, risk appetite, accountability, or final responsibility." ], "must_inspect": [ "Which part is evidence, which part is interpretation, which part is human taste or responsibility, and who owns the call." ], "must_do": [ "Record human taste and judgment as accountable input, never as an evidence score." ], "must_not_do": [ "Convert taste, ethics, meaning, or final responsibility into a mechanical confidence score or hidden agent decision." ], "evidence_required": [ "Named human owner, decision statement, evidence considered, accountable rationale, bounded action, and reversal condition." ], "counter_signal": [ "The review hides taste inside evidence language, lacks a named owner, or lets a machine decide an accountable human trade-off." ], "human_boundary": [ "Taste, ethics, meaning, strategic appetite, risk appetite, and final responsibility remain owned by a named person." ], "stop_condition": [ "Stop when a human-owned decision is required but no named accountable human decision record exists." ], "output_requirement": [ "Emit human_judgment_record with owner, judgment_type, decision, evidence_considered, bounded_action, reversal_condition, and accountability_note." ], "source": [ "UX3 canonical model: Human taste is accountable input, not an evidence score." ] } ] }
{ "schema_version": "1.0.0", "canonical_language": "en", "name": "UX3 knowledge kernel", "description": "Canonical product judgment terms for machine review and human documentation.", "flows": [ { "id": "user_flow", "name": "User Flow", "definition": "Identifies target populations, affected people, excluded groups, situations, tasks, current workarounds, and the conditions under which the product should create an outcome.", "must_answer": [ "Who is the product for?", "Who is affected by the product decision?", "What are those actors trying to accomplish?", "What cost, friction, risk, or loss of control exists now?" ] }, { "id": "evidence_flow", "name": "Evidence Flow", "definition": "Evidence Flow is the product sensing, learning, and calibration system joining internal and external data, behavior, subjective experience, interpretation, counter-signals, evaluations, and action traces; evidence informs decisions, while taste is recorded separately as an accountable human decision input.", "must_answer": [ "What signal was observed?", "Where did the signal come from?", "What interpretation is being made?", "What counter-signal weakens it?", "What decision impact follows?" ] }, { "id": "business_flow", "name": "Business Flow", "definition": "Identifies the company, project owner, issuer, accountable owner, and stakeholders who create value, receive value, pay, decide, operate, or absorb risk.", "must_answer": [ "Who creates value?", "Who receives value?", "Who pays or decides?", "Who bears cost or risk?", "Can the exchange remain viable and legitimate?" ] } ], "intersections": [ { "id": "user_evidence", "name": "User + Evidence", "label": "Situated understanding", "required_question": "Do behavior, subjective experience, context, and system signals support the same interpretation?" }, { "id": "evidence_business", "name": "Evidence + Business", "label": "Viable learning", "required_question": "Is there sufficient evidence to justify investment, risk, operation, and continued learning?" }, { "id": "user_business", "name": "User + Business", "label": "Sustainable value exchange", "required_question": "Is value created and captured without hiding cost, exclusion, or responsibility?" }, { "id": "ux3_decision_kernel", "name": "User + Evidence + Business", "label": "UX3 Decision Kernel", "required_question": "What bounded, explainable, testable, and accountable action follows?" } ], "actor_roles": [ { "id": "primary_user", "definition": "The target actor expected to operate the product for the main outcome." }, { "id": "secondary_user", "definition": "An actor who uses part of the product or is involved in the workflow without being the primary target." }, { "id": "machine_actor", "definition": "An automated agent, model, workflow, or software component that can sense, decide, call tools, or act on behalf of a person or organization." }, { "id": "beneficiary", "definition": "A person or group expected to receive benefit without necessarily operating the product." }, { "id": "affected_person", "definition": "A person or group changed by the product decision, including those who do not consent to or operate the product." }, { "id": "excluded_group", "definition": "A population intentionally or unintentionally underserved, blocked, misrepresented, or left outside the product boundary." } ], "stakeholder_roles": [ { "id": "company", "definition": "The organization that creates, distributes, and remains accountable for the product." }, { "id": "project_owner", "definition": "The named person or team accountable for the current product decision." }, { "id": "issuer", "definition": "The entity that issues a credential, claim, artifact, decision, or product promise." }, { "id": "customer", "definition": "The person or organization that receives the product's value." }, { "id": "buyer", "definition": "The person or organization that pays, approves purchase, or controls budget." }, { "id": "employee_operator", "definition": "Internal worker or operator who must deliver, support, review, or recover the product." }, { "id": "partner_channel", "definition": "External partner, distributor, integrator, or channel that changes adoption, cost, or accountability." }, { "id": "investor_funder", "definition": "Stakeholder providing capital, grants, or other resources that shape constraints and expectations." }, { "id": "platform_provider", "definition": "Infrastructure, marketplace, model, payment, identity, or distribution provider that can enable or constrain the product." }, { "id": "regulator", "definition": "Authority or rule-setting body that can define compliance, legitimacy, or permitted operation." }, { "id": "externality_bearer", "definition": "Community or group that absorbs cost, risk, confusion, exclusion, or other product externalities." } ], "evidence_terms": [ { "id": "source", "definition": "Where the signal came from." }, { "id": "signal", "definition": "What was observed or reported before interpretation." }, { "id": "interpretation", "definition": "What the reviewer thinks the signal means." }, { "id": "counter_signal", "definition": "Evidence or reasoning that weakens, contradicts, or reframes the interpretation." }, { "id": "decision_impact", "definition": "What changes in the product decision because of the interpreted evidence." }, { "id": "observed_outcome", "definition": "What happened after the bounded action was taken." } ], "human_judgment_terms": [ { "id": "human_taste", "definition": "A person's accountable preference about quality, feel, meaning, taste, or strategic appetite; it is not an evidence score." }, { "id": "human_judgment", "definition": "A named person's accountable decision on taste, ethics, meaning, risk appetite, or final responsibility." }, { "id": "accountable_input", "definition": "A recorded human-owned input that may set a direction, raise a proof bar, or accept a bounded risk without pretending to be observed evidence." } ], "learning_loop": [ "signal", "interpretation", "counter_signal", "decision_impact", "human_judgment", "bounded_action", "observed_outcome", "evidence_update_or_rule_update" ] }
{ "schema_version": "1.0.0", "corpus_id": "ux3-original-curriculum-stage-0-3", "source_document": "UX3 Knowledge System Complete Extraction", "source_sha256": "fabf929c6fe03b67edfd25be8b79991da5056578c7a7fabbd3b709b4a88f50d2", "source_note": "The original corpus has 40 chapter positions; chapter 3-12 has a title but no substantive transcript. This manifest lists only chapters cited by the six newly distilled rules.", "chapters": [ { "chapter_id": "0-2", "title": "UX design thinking and logic", "content_status": "substantive" }, { "chapter_id": "1-3", "title": "User-centered design", "content_status": "substantive" }, { "chapter_id": "1-5", "title": "Market positioning and competitor analysis", "content_status": "substantive" }, { "chapter_id": "1-7", "title": "Human factors and product design", "content_status": "substantive" }, { "chapter_id": "1-8", "title": "User research and needs analysis", "content_status": "substantive" }, { "chapter_id": "1-9", "title": "Product value proposition", "content_status": "substantive" }, { "chapter_id": "2-2", "title": "Product and business model", "content_status": "substantive" }, { "chapter_id": "2-3", "title": "Introduction to human-computer interaction", "content_status": "substantive" }, { "chapter_id": "2-4", "title": "Information architecture and functional design", "content_status": "substantive" }, { "chapter_id": "2-6", "title": "Interface design principles", "content_status": "substantive" }, { "chapter_id": "2-9", "title": "Prototype testing", "content_status": "substantive" }, { "chapter_id": "3-1", "title": "Go-to-market strategy", "content_status": "substantive" }, { "chapter_id": "3-2", "title": "Product growth thinking", "content_status": "substantive" }, { "chapter_id": "3-3", "title": "End-to-end channel thinking", "content_status": "substantive" }, { "chapter_id": "3-4", "title": "First-use experience design", "content_status": "substantive" }, { "chapter_id": "3-5", "title": "Return motivation and loyalty engineering", "content_status": "substantive" }, { "chapter_id": "3-6", "title": "Gamification design", "content_status": "substantive" }, { "chapter_id": "3-7", "title": "Computational design thinking", "content_status": "substantive" }, { "chapter_id": "3-8", "title": "Usability engineering", "content_status": "substantive" } ] }
UX3 Review Council
The council is a disagreement system, not a voting system.
It protects three different product realities:
| Reviewer | Protects |
|---|---|
| User Flow | Real actors, problems, consequences, affected people, and exclusion. |
| Evidence Flow | Provenance, signal strength, counter-signals, measurement, and failure criteria. |
| Business Flow | Value exchange, cost, retention, distribution, and defensibility. |
| Claim Analyst | Testable claims and dependency edges. |
| Uncertainty Reviewer | Evidence tier, risk class, reversibility, and false confidence. |
| Council Facilitator | Weakest flow, trade-off, human decision, and final boundary. |
The machine-readable registry is agents/registry.json.
Fork, Join, Challenge
- The Claim Analyst creates the claim graph.
- User, Evidence, and Business reviewers work in parallel without seeing the other lane verdicts.
- The council waits until all three independent reviews are complete.
- Each lane runs one challenge round against another material claim.
- The Uncertainty Reviewer checks evidence tier, risk, reversibility, and freshness.
- The facilitator synthesizes only after all required contracts are valid.
- Human-owned decisions move to the Human Judgment Gate.
Forced Disagreement
Each challenge-round output must include:
| Field | Requirement |
|---|---|
| objection_to | One lane whose conclusion or premise is challenged, or none. |
| counter_evidence | Evidence or reasoning that could change that lane's verdict. |
| position_change | unchanged, strengthened, weakened, or reversed. |
If objection_to is none, the reviewer must state what counter-evidence was searched and why it did not change the conclusion.
The facilitator must reject council synthesis when:
- a lane review is missing
- challenge fields are missing
- evidence lacks provenance or is expired without downgrade
- two claims contradict each other without an explicit trade-off
- a human-owned decision has no accountable owner
UX3 Intersections
The facilitator reviews the intersections, not only the lanes.
| Intersection | Name | Core question |
|---|---|---|
| User + Evidence | Situated Understanding | What do people say, feel, and do, and how strong is each signal? |
| Evidence + Business | Viable Learning | What evidence shows that value can be sustained? |
| User + Business | Sustainable Value Exchange | Is the exchange valuable and fair to both sides? |
| All three | UX3 Decision Kernel | Which canonical verdict and execution boundary follow from the three lane results? |
Weakest Flow Rule
| Lane state | Combined verdict |
|---|---|
| Any lane is stop_reframe, for any reason. | stop_reframe |
| No lane stops and at least one lane is verify. | verify |
| All three lanes are continue. | continue |
Every stop_reframe lane verdict must name a stop_reason_class
(actor, safety, core_evidence, irreversible_risk, business_viability, other).
The class is reporting metadata. It never downgrades a stop.
The weakest flow is selected deterministically:
- The lane with the most severe verdict (stop_reframe > verify > continue).
- If tied, the tied lane with the lowest lane
evidence_tier(t0 is lowest). - If still tied, fixed priority: evidence, then user, then business.
The weakest flow selects the next action:
- User weakness creates a user-learning step.
- Evidence weakness creates an evidence proof step.
- Business weakness creates a value, retention, cost, or channel test.
Human Judgment Gate
The gate is mandatory for brand-affecting work, vulnerable users, irreversible actions, major risk appetite, ethics, strategy, or meaning.
Taste is handled inside this gate:
| Taste dimension | Question |
|---|---|
| Coherence | Does the product express one clear idea? |
| Restraint | Did the team avoid unnecessary power or scope? |
| Trust | Does the product reveal enough to be believed? |
| Dignity | Does it respect users and affected people? |
| Timing | Is this the right moment to ask for action? |
| Meaning | Is the work worth existing beyond short-term output? |
Record the final call with schemas/human-decision.schema.json.
Final Output
The facilitator returns schemas/review-result.schema.json.
The council should make uncertainty visible. It should not make uncertainty disappear.
Product Design Harness vs Coding Harness
Core Difference
| Question | Harness |
|---|---|
| Should we build this? | Product Design Harness |
| Did we build this correctly? | Coding Harness |
Both are needed.
Product Design Harness should run first.
Comparison
| Dimension | Product Design Harness | Coding Harness |
|---|---|---|
| Main concern | Direction quality. | Execution quality. |
| Primary failure | Wrong product. | Broken implementation. |
| Inputs | Brief, user signal, evidence, constraints, strategy. | Issue, spec, codebase, tests, tools. |
| Outputs | Verdict, gate review, context pack, stop conditions. | Diff, tests, logs, verified change. |
| Review lens | User, evidence, business, taste. | Correctness, security, maintainability, performance. |
| Human role | Judge trade-offs and risk. | Review changes and release readiness. |
| Stop signal | Problem, evidence, risk, or value fails. | Tests, linters, policies, runtime checks fail. |
Sequence
- Product idea
- Product Design Harness
- Context pack
- Coding Harness
- Implementation
- Measurement
- Decision update
Skipping Product Design Harness causes teams to build the wrong work efficiently.
Skipping Coding Harness causes teams to build the right work unreliably.
Where They Meet
The handoff between the two harnesses is the context pack.
The context pack should include:
- goal
- stage
- scope
- non-goals
- assumptions
- user rules
- evidence rules
- business rules
- acceptance criteria
- stop conditions
The coding harness should not invent these.
If they are missing, execution should stop and ask for product judgment.
Anti-Patterns
| Anti-pattern | Correction |
|---|---|
| "The prototype works, so the idea is valid." | Working output is not market proof. |
| "The tests pass, so the product is good." | Tests verify implementation, not value. |
| "The user asked for it, so build it." | Convert requests into testable problems. |
| "It is easy to ship, so ship it." | Easy features still have ownership cost. |
| "We will measure later." | Define evidence before execution. |
Good Handoff Example
| Field | Example |
|---|---|
| Goal | Reduce failed setup for first-time account admins. |
| Scope | Prototype one guided setup path. |
| Non-goals | No billing, permissions redesign, or analytics dashboard. |
| User rule | Admin must understand the next action without reading docs. |
| Evidence rule | Measure setup completion and rescue-click rate. |
| Business rule | Do not add support-heavy customization. |
| Stop condition | Stop if prototype requires changing core account model. |
Rule
Product Design Harness decides what deserves execution.
Coding Harness verifies execution.
Live Coding Workflow
Use this workflow when a builder wants a coding agent to implement product work inside a reviewed boundary.
The rule is simple: review first, code second. A continue verdict plus a
valid context pack authorizes implementation only inside the named boundary.
verify authorizes only the proof step. stop_reframe blocks coding.
Golden Chain
| Artifact | Role |
|---|---|
examples/live-coding-product-brief.json |
Product brief with actors, evidence, assumptions, and execution boundary. |
examples/live-coding-review.json |
Canonical review result with continue verdict. |
examples/live-coding-context-pack.json |
Implementation handoff allowed by the review. |
Validate the chain before coding:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements-dev.txt
.venv/bin/python -m unittest discover -s tests
.venv/bin/python scripts/check_review.py examples/live-coding-review.json
.venv/bin/python scripts/validate.pyCopyable Prompts
1. Select Working Language
Use Product Design Harness for this session.
Set session_config to:
{
"working_language": "<en|zh-TW|zh-CN|ja|ko|es|fr|de|pt>",
"canonical_identifiers": "en",
"fallback_language": "en"
}
Keep JSON property names, enum values, rule IDs, schema IDs, file paths,
evidence IDs, and verdicts in English. Use the selected working language only
for human-readable explanations and free-text fields.2. Pre-Code Review
Before coding, convert this request into a Product Design Harness product brief.
Use schema_version 2.1. Include actor_boundary, including
actor_boundary.target_population, product organization, stakeholder effects,
unresolved assumptions, human judgment boundaries,
evidence receipts, and this exact execution_boundary:
may_do: implement the approved bounded change
must_not_do: expand scope or execute external irreversible actions
must_ask: new stakeholder, data, risk, or scope appears
Then run the smallest responsible review mode. Return only a review result
valid through scripts/check_review.py against schemas/review-result.schema.json.
Do not produce an
implementation plan unless the verdict is continue.3. Validate Review Output
Validate the review before using it.
Run:
.venv/bin/python scripts/check_review.py <path-to-review-result.json>
.venv/bin/python scripts/validate.py
If validation fails, fix the review artifact. Do not code from an invalid
review. If the verdict is verify, run only the proof step. If the verdict is
stop_reframe, return the reframed product question.4. Context-Pack Handoff
The review verdict is continue. Create a context pack valid against
schemas/context-pack.schema.json.
The context pack must copy the review_id, session_config, actor_boundary,
product_organization, stakeholder_effects, unresolved_assumptions,
human_judgment_boundary, evidence IDs, stop conditions, human approval gates,
and exact execution_boundary from the review.
Implementation may begin only after the context pack validates. Implement only
the scope named in the context pack. Do not expand scope.5. Scope Change
Pause implementation and return to Product Design Harness review.
Reason: a new stakeholder, data, risk, or scope appeared.
Summarize:
- what changed
- who is newly affected
- what evidence supports the change
- which boundary item was crossed
- whether the current context pack should continue, verify, or stop_reframe
Do not continue coding until a new valid review and context pack authorize the
changed scope.6. Post-Build Feedback Classification
Classify post-build feedback for the next Product Design Harness iteration.
For each signal, separate:
- raw artifact or source
- signal type: quote, observed behavior, product log, support pattern,
workflow trace, market signal, policy, or derived
- interpretation
- decision impact
- counter-signal
- evidence tier
- unresolved assumption changed by the signal
Return updated evidence receipts. Do not change the product direction unless
the evidence changes the review boundary.Live-Coding Rules
| Situation | Action |
|---|---|
continue and valid context pack |
Code only inside the context-pack scope. |
verify |
Run only the proof step; do not build the feature. |
stop_reframe |
Stop coding and return the reframed product question. |
| Boundary changes | Pause and run a new review. |
| New post-build evidence | Classify it before deciding the next iteration. |
The implementation agent may decide technical details inside the context pack. It may not decide whether the product direction, stakeholder boundary, evidence bar, or human judgment boundary changed.
Autonomous Multi-Agent Alignment & Boundary Governance Protocol
1. Executive Principle: An Alignment Harness for Machine Swarms
In modern software development driven by autonomous multi-agent teams (e.g. 1 Integrator/Admin + N Workers + 1 QC Auditor), Product Design Harness serves as the machine-readable boundary constitution, rather than a bureaucratic form for human developers.
- Human's Role: Sole Judge and Strategic Founder (sets high-level intent, evaluates trade-offs, grants external permissions).
- Integrator / Admin: Deconstructs work packages, enforces path locks, and dispatches tasks bounded by the Harness contract.
- Workers (Autonomous Coding Agents): Execute with maximum speed strictly within the
may_doscope in isolated worktrees; zero scope expansion. - QC Auditor (Independent Review Agent): Read-only auditor validating code diffs against the Harness
must_not_doboundaries and reporting scope violations.
2. Advisory Routing and Validated Execution Boundaries
Use the smallest responsible review mode without turning a heuristic into permission to execute.
- Routing is advisory:
scripts/jev_gate.py routelabels a task as routine, discovery, or commitment. It always returnsbypass: falseandreview_required: true.- Routine words cannot establish actual scope or risk. A scope above five changed files takes priority over routine keywords when context is supplied to the Python classifier.
- Reversibility lowers review mode, not the requirement for review. Reuse a still-valid context pack for an unchanged approved task instead of re-reviewing it.
- Baseline evaluation is advisory:
evaluate --taskaccepts task metadata and produces a local heuristic assessment withadvisory: true. It does not validate evidence truth or authorize implementation.- Missing evidence defaults to
t0; unsupported tiers are rejected. Supported tiers aret0,t1,t2,t3, andt4. At0assessment stops and reframes;t1supports at most verification. - The helper is offline. The unused live API client and ignored
--liveoptions have been removed. No model call or latency guarantee is part of this helper.
- Boundary extraction requires canonical inputs:
boundary --taskrequires a JSON object withreviewcontaining a complete canonical review result. Raw prompts, evidence tiers, filenames, and proposed proof steps cannot create an execution boundary.- For
continue, the same JSON object must also containcontext_pack. The canonical handoff validator checks the review, context pack, identity, evidence references, scope, and controls together. - For
verify, only the reviewed proof boundary andproof_stepare returned. Forstop_reframe, the reviewed boundary andreframed_questionare returned. Neither branch gains implementation permissions from task filenames. - Output preserves
may_do,must_not_do,must_ask,stop_conditions,human_approval_gates, andhigh_risk_actions. A valid handoff does not mean a listed human approval has been granted. - Invalid JSON, missing reviews, invalid evidence tiers, and mismatched handoffs fail with a nonzero exit status and no execution-boundary output. The helper uses
check_review.py; it does not establish a second review contract.
3. Preserve Boundaries Across Handoffs
In long-running autonomous sessions (30~100+ turns), generative chat summaries often dilute or erase negative constraints (e.g. generalizing negative database constraints into broad feature summaries).
The runtime must preserve the original review and context pack while executing a task. The boundary helper copies their controls without rewriting or broadening them. The harness does not control a host agent's context compaction and cannot guarantee lossless retention across arbitrary runtimes. After compaction, restore and validate the original handoff before resuming work.
4. Role Mapping & Boundary Enforcement
| Role | Responsibility | Input Contract | Output Requirement |
|---|---|---|---|
| Integrator / Admin | Package slicing & lock enforcement | Product intent | Task Context Pack with digest locks |
| Worker (Builder) | Atomic implementation & local tests | may_do & must_not_do |
Clean patch + unit test evidence |
| QC Auditor | Defect-first boundary audit | Git diff + Context Pack | PASS or Scope Drift Rejection |
| Advisory Router | Review-mode triage | Task prompt and optional scope | Routine, discovery, or commitment; no review bypass |
| Boundary Helper | Validate and preserve execution scope | Canonical review and matching context pack for continue | Reviewed boundary and unchanged human controls |
5. Verification Scope
The telemetry, authentication, and media-sync cases in tests/test_multi_agent_alignment.py are illustrative local fixtures. They do not establish production deployments, privacy outcomes, collision rates, or latency measurements.
tests/test_gate_boundaries.py exercises the actual repository and installable helper: routine classification cannot bypass review, unsupported evidence tiers fail closed, raw task metadata cannot grant execution permissions, invalid or expanded context packs are rejected, and valid canonical boundaries retain their exact scope and controls. Bundle tests also require every distributed runtime script to match its canonical source.
RFC 0001: The Override Protocol
- Status: Proposal (no schema or contract changes yet)
- Scope: how the weakest-flow rule survives the moment it blocks a pet feature
- Follow-up: implementation tracked in the checklist at the end
The Problem
Community feedback on the harness, paraphrased:
"Weakest flow decides" with no averaging is a bold constraint, because most teams will fight that the second it blocks a pet feature.
The critique is correct, and it is not about the logic of the rule. It is about organizational survival. Every hard governance mechanism (lint gates, review gates, launch checklists) faces the same moment: the rule is most valuable exactly when it is least popular. If the only two outcomes at that moment are "the rule blocks the feature" or "the team disables the rule", the rule eventually loses, because the second outcome is silent and permanent.
Today the harness has one sentence of defense: a human may override
a recommendation only through schemas/human-decision.schema.json,
and an unlogged override does not exist (docs/CONTRACTS.md,
agents/council-facilitator.md). That is the right instinct, but it
is underspecified in five ways:
- There is no dedicated override record.
human-decisioncovers human-owned decision types (taste, risk, strategy, ethics, meaning). Overriding astop_reframeverdict to build anyway is a different act with different required fields, and forcing it throughdecision_typeblurs both records. - An override can silently rewrite history. Nothing prevents a team
from treating an overridden review as if it had returned
continue, which corrupts every downstream artifact that reads the verdict. - Overrides are permanent by default.
reversal_conditionsexist but nothing checks them, so an override taken under deadline pressure quietly becomes policy. - Overrides are invisible in aggregate. One override is judgment; ten active overrides are a broken review culture. Nothing counts them.
- Nothing is machine-enforced. All of the above lives in prose, and this harness's own stated standard is that prose guarantees are not guarantees.
Design Position
The harness should not try to win the fight against the pet feature. A judgment layer that can only say "no" gets uninstalled. The design goal is different:
The verdict is never negotiable. Execution is.
A human with authority may always ship the pet feature. What they may never do is make the harness pretend it agreed. The override protocol converts "fight the rule" into "sign your name", which is a fight most pet features lose on their own.
Proposed Mechanics
1. A dedicated verdict-override record
New contract: schemas/verdict-override.schema.json. Required fields (draft):
| Field | Meaning |
|---|---|
override_id |
Stable identifier, referenced by later reviews. |
review_id |
The review-result being overridden. |
overridden_verdict |
Must equal the review's combined_verdict. |
acknowledged_weakest_flow |
Must equal the review's weakest_flow; the owner restates the gap they are accepting. |
authorized_scope |
Execution scope granted despite the verdict; same shape as execution_boundary. |
accountable_owner |
A named person, not a team. |
rationale |
Why shipping anyway is the right call. |
expires_at |
Every override is time-boxed. No permanent overrides. |
tripwires |
Measurable conditions; any one tripping voids the override immediately. |
renewal_requires |
What evidence a renewal review must present. Renewal is a new review, never an edit. |
2. The verdict is immutable
An override never modifies the review-result. The review stays
stop_reframe in the record; the override is a separate artifact
that authorizes execution despite it. Machine check: any document
that references an overridden review must carry the override_id,
and no tool may report the review's verdict as anything other than
what the reviewers returned. The history stays honest even when the
decision does not follow it.
3. Overrides expire; reviews do not
expires_at is required. When an override lapses, the original
verdict is in force again, and continuing execution requires either
a renewal (a fresh review that must address renewal_requires) or a
new override record with a new rationale. Deadline-pressure
decisions therefore decay back to the evidence by default, instead
of hardening into policy.
4. The override ledger
New template: templates/override-ledger.md. One row per active override: owner, overridden verdict, expiry, tripwire status. Two uses:
- Any new review of a direction with an active override must list that override in its inputs (the reviewers see what was accepted and why).
- The count of active overrides is itself a review input. A
threshold (proposed: three active overrides on one product area)
is a mandatory
verifyon the next review of that area, with the ledger as the cited evidence.
5. Machine enforcement plan
In keeping with the repo standard that every guarantee is either machine-checked or explicitly listed as not enforced:
- scripts/check_override.py: validates the record, checks
overridden_verdictandacknowledged_weakest_flowagainst the referenced review file, rejects expired records, rejectsauthorized_scopeentries that appear in the review'smust_not_do. - Golden example: examples/verdict-override.json plus a walkthrough
showing a
stop_reframereview, the override, and the follow-up review that cites it. - Docs: a short "When the harness blocks your pet feature" section
in
docs/HARNESS.md, written for the person who is angry at the gate, explaining that the exit exists and what it costs.
What This Does Not Do
- It does not make the harness able to stop a determined owner. Nothing can, and claiming otherwise would violate the repo's honesty rules.
- It does not soften the weakest-flow rule. Averaging remains banned; the verdict computation is untouched.
- It does not add an approval hierarchy. One named owner and one signed record is the entire ceremony.
Implementation Checklist (follow-up PRs)
- schemas/verdict-override.schema.json with the fields above
- scripts/check_override.py plus CI wiring
- examples/verdict-override.json golden pair (record plus walkthrough)
- templates/override-ledger.md
-
docs/HARNESS.mdsection: when the harness blocks your pet feature - Cross-references from
docs/CONTRACTS.mdandagents/council-facilitator.mdreplacing the current prose-only override sentences - Tests: override record round-trip, expiry rejection, scope conflict rejection, ledger-threshold review input
Anti-Patterns And Anti-Gaming
A structured review can still become a rubber stamp. The harness therefore requires decision receipts, not checklist completion.
Common Failure Modes
| Anti-pattern | Detection signal | Required correction |
|---|---|---|
| Rubber-stamp review | Every lane says continue and no counter-evidence appears. | Run the challenge round. |
| Evidence inflation | Quotes, opinions, logs, and payments are treated as equal proof. | Assign evidence tier and signal type. |
| Consensus theater | Reviewers repeat the same argument in different words. | Require objection_to and counter_evidence. |
| False precision | Confidence labels are averaged or treated as scores. | Use evidence tiers and the decision matrix. |
| Checklist substitution | All fields are filled but no decision changes. | State decision impact for every evidence receipt. |
| Context-pack leakage | A verify result becomes a broad build brief. | Allow only the proof step. |
| Tool authority | A connector or search result gives the verdict. | External tools return evidence receipts only. |
| Taste avoidance | Brand, dignity, or meaning is hidden inside a score. | Route to Human Judgment Gate. |
| Stale proof | Old evidence is reused after context changes. | Check freshness and re-verify expired sources. |
Continue Receipt
A continue verdict is invalid unless it contains:
- one disconfirming signal per lane
- one stop condition per lane
- evidence provenance and freshness
- a completed challenge round for council mode
- one bounded execution scope
- a named human owner when taste, risk, strategy, ethics, or meaning is involved
Review The Review
Before final synthesis, ask:
| Question | Failure it exposes |
|---|---|
| What answer would this format make easy to fake? | Checklist compliance. |
| Which claim changed because of evidence? | Decorative research. |
| Which reviewer challenged another reviewer? | Parallel summaries. |
| What would make us reverse this decision? | Irreversible commitment. |
| Who is accountable for the non-mechanical judgment? | Hidden responsibility. |
Product Design Harness Manual
1. Definition
Product Design Harness is a repeatable decision system for product work.
It runs before execution.
Execution can mean design, code, prototype, launch, growth, automation, or investment. The harness asks whether the work deserves to happen, what evidence is required, and what constraints must shape the next step.
2. Why It Exists
Modern teams can produce product artifacts quickly:
- briefs
- prototypes
- screens
- code
- dashboards
- launch plans
- experiments
- summaries
Speed creates a new risk.
A weak assumption can become a polished artifact before anyone has proven the problem is real.
Product Design Harness slows down the wrong things and accelerates the right things.
| Accelerate | Slow down |
|---|---|
| Learning from real behavior. | Building from vague assumptions. |
| Explicit trade-offs. | False certainty. |
| Small proof steps. | Large unvalidated builds. |
| Reversible experiments. | Irreversible high-risk actions. |
| Clear handoffs. | Ambiguous requests. |
3. UX3 Model
3.1 User Flow
User Flow checks whether the actor, problem, situation, and affected people are real.
It can simulate the user's path through the product, but simulation is not validation.
Use the walkthrough to find assumptions. Use quotes, behavior, context, and consequences to validate them.
Required questions:
| Question | Why it matters |
|---|---|
| Who directly operates the product? | Avoids vague "users". |
| Who benefits from the outcome? | Operator and beneficiary can differ. |
| Who is affected without operating it? | Surfaces hidden risk. |
| Who is excluded? | Prevents accessibility and market blind spots. |
| What current workaround exists? | Workarounds connect stated pain to real cost. |
| What would prove the problem is not real? | Prevents confirmation-only reviews. |
3.2 Evidence Flow
Evidence Flow checks whether the team has proof strong enough for the next decision.
Evidence may come from internal sources, external sources, or direct user learning.
The harness must keep source, signal, interpretation, counter-signal, and decision separate.
Required questions:
| Question | Why it matters |
|---|---|
| What is data, and what is interpretation? | Keeps raw signals separate from narrative. |
| What decision does each metric change? | Rejects vanity metrics. |
| What would stop or reframe this work? | Makes failure useful. |
| What must be measured before scaling? | Prevents blind expansion. |
| What logs or traces are needed? | Makes decisions reviewable. |
| What repeated failure should become a rule? | Turns mistakes into harness improvements. |
| Which evidence is internal and which is external? | Prevents treating market research and product telemetry as the same kind of proof. |
3.3 Business Flow
Business Flow checks whether the direction is worth sustaining.
Business Flow starts from the user side: value, switching behavior, urgency, trust, and willingness to return.
The business model should be inferred from the user's workflow, not imposed on top of it.
Required questions:
| Question | Why it matters |
|---|---|
| What value is created? | Useful work still needs a value argument. |
| Who pays, adopts, returns, or recommends? | Separates curiosity from pull. |
| What does this cost to maintain? | Build cost is not total cost. |
| What channel can distribute it? | Products need routes to adoption. |
| What makes users return? | Novelty is not retention. |
| What becomes hard to copy? | Generic features do not defend a product. |
3.4 UX3 Intersections
UX3 is not a set of independent checklists.
It is a set of intersections.
| Intersection | Name | Review question |
|---|---|---|
| User Flow + Business Flow | Sustainable Value Exchange | What value does the user receive, and what value can the product capture? |
| User Flow + Evidence Flow | Situated Understanding | What do people say, feel, and do, and how strong is each signal? |
| Evidence Flow + Business Flow | Viable Learning | What evidence shows this can become sustainable value? |
| User Flow + Evidence Flow + Business Flow | UX3 Decision Kernel | Which canonical verdict and execution boundary follow from the three lane results? |
4. Stages
Use stage to choose the right evidence bar.
| Stage | Main question | Required proof |
|---|---|---|
| Idea | Is the problem real and specific? | Actor, situation, frequency, cost, workaround. |
| Prototype | What behavior should be observed? | One riskiest assumption and a focused test. |
| Launch | Is there enough pull and reliability? | Repeated use, adoption, willingness, recovery path. |
| Scale | Can this compound safely? | Retention, cost, governance, distribution, defensibility. |
For multi-review work, use OPERATING-PROTOCOL.md.
UX3 adds six gates: Stage, User Flow, Evidence Flow, Business Flow, Council, and Human Judgment.
It should be used when the decision requires external evidence, multiple reviewers, claim analysis, uncertainty review, or human-owned trade-offs.
5. Verdicts
| Verdict | Meaning | Required behavior |
|---|---|---|
| Continue | Evidence and risk are sufficient for the next step. | Proceed with explicit scope, non-goals, and acceptance criteria. |
| Verify | Direction may be valid but evidence is incomplete. | Run the smallest validation step before expanding work. |
| Stop/Reframe | Core problem, evidence, risk, or viability fails. | Stop execution or redefine the problem. |
Do not turn Verify or Stop/Reframe into a build plan.
6. Evidence Tiers
Evidence tier limits the size of the next action. Confidence cannot upgrade a weak tier.
| Tier | Examples | Use |
|---|---|---|
| t0 | No traceable signal. | Reframe or define research. |
| t1 | Opinions, quotes, generic trends, internal preference. | Generate hypotheses only. |
| t2 | Contextual interviews, support patterns, observed workarounds, small tests. | Run a focused reversible prototype. |
| t3 | Repeated behavior, payment, retention, referral, adoption, logs. | Consider bounded launch or expansion. |
| t4 | Durable retention, workflow dependency, sustainable economics, governance proof. | Consider scale. |
7. Trade-Off Logic
Product decisions are trade-offs, not isolated scores.
| If this is high | And this is low | Default verdict |
|---|---|---|
| User pain | Evidence strength | Verify |
| User pain | Business value | Verify or Reframe |
| Business value | User clarity | Stop/Reframe |
| Build speed | Evidence quality | Verify |
| Automation power | Human control | Stop/Reframe |
| Growth potential | Trust design | Verify |
| Revenue potential | Access fairness | Verify |
| Strategic value | Reversibility | Human judgment required |
8. Human Judgment Gate
Taste is not decoration.
Taste is the human ability to judge fit, restraint, coherence, trust, and meaning.
Run the Human Judgment Gate when taste, risk appetite, strategy, ethics, meaning, vulnerable users, brand, or irreversible action is involved.
| Taste dimension | Review question |
|---|---|
| Coherence | Does the product feel like one clear idea? |
| Restraint | Did the team avoid building everything it could build? |
| Trust | Does the product reveal enough to be believed? |
| Dignity | Does it respect users and affected people? |
| Timing | Is this the right moment to ask the user to act? |
| Meaning | Is the work worth existing beyond short-term output? |
Taste is one part of Human Judgment Gate, not a seventh mechanical score.
The gate can raise the proof bar or stop a mechanical continue verdict. If no accountable owner responds, the work pauses; it never defaults to execution.
When The Harness Blocks Your Pet Feature
Sooner or later a verdict blocks something the team loves. The exit exists,
and here is what it costs. Anyone with authority may execute despite a
verify or stop_reframe verdict by signing a verdict override
(schemas/verdict-override.schema.json): one named owner, the weakest flow
restated in their own record, an explicit scope, an expiry, and tripwires
that void it. The review itself is never edited - the harness will not
pretend it agreed. When the override lapses, the original verdict is in
force again; renewal is a fresh review with new evidence, never an
extension. Active overrides accumulate in templates/override-ledger.md,
and three on one product area force a verify on the next review. In
short: the feature can ship, but it ships with your name on it.
9. Council Process
For council work:
- Run Claim Analyst.
- Retrieve only missing evidence.
- Fork User, Evidence, and Business reviewers in parallel.
- Wait for all three independent reviews.
- Run one challenge round per lane.
- Run Uncertainty Reviewer.
- Run Council Facilitator.
- Route accountable decisions to Human Judgment Gate.
The facilitator must:
- list disagreements
- identify the weakest flow
- name the trade-off
- call out the human-owned decision
- produce the next smallest action
The council must complete the challenge round before converging.
The goal is not agreement.
The goal is to expose the weakest claim and the trade-off that humans must own.
10. Stop Conditions
Stop or downgrade when:
- the user is undefined
- the problem cannot be tested
- evidence has only unweighted opinion or simulation
- the requested work starts with output before proof
- the product hides powerful actions behind friendly wording
- the team cannot name who is affected
- there is no failure condition
- there is no reason to return
- the value depends only on being easy to build
- the next action creates irreversible risk without human review
11. Handoff To Execution
If the verdict is Continue, create a context pack before execution.
The context pack must include:
| Field | Purpose |
|---|---|
| Goal | What outcome matters. |
| Stage | Current maturity. |
| Scope | What to do now. |
| Non-goals | What not to do. |
| Assumptions | What remains unproven. |
| User rules | Actor, mental model, affected people, accessibility. |
| Evidence rules | Measurements, logs, failure criteria. |
| Business rules | Value, cost, retention, distribution. |
| Acceptance criteria | What done means. |
| Stop conditions | When execution must return to human judgment. |
12. Harness Improvement Loop
Every review should improve the harness.
| Event | Convert into |
|---|---|
| Repeated confusion | Principle or glossary entry. |
| Bad decision | Stop condition. |
| Weak handoff | Template field. |
| Misleading metric | Evidence rule. |
| Failed prototype | Test case. |
| Hidden stakeholder | User Flow rule. |
| Scope creep | Trade-off rule. |
| Trust incident | Human Judgment Gate rule. |
The harness should become harder to misuse over time.
Adoption Guide
How an agent team installs UX3 Product Design Harness, and what "installed" means for a repository.
The goal is not more process. The goal is fewer polished artifacts built on weak assumptions.
1. Install
| Step | Action |
|---|---|
| 1 | Clone or vendor this repository. It is prompts, schemas, and agent definitions; there is no runtime service to deploy. |
| 2 | Confirm the copy is intact: python3 -m venv .venv, then .venv/bin/python -m pip install -r requirements-dev.txt, .venv/bin/python -m unittest discover -s tests, .venv/bin/python scripts/validate.py, and .venv/bin/python scripts/check_review.py examples/quick-gate-review.json. |
| 3 | Install with npx skills add cis2042/ux3-product-design-harness -g -y, or copy skills/product-design-harness/SKILL.md together with its resources/ directory into the agent configuration. |
| 4 | Wire prompts/start-review.md from a full clone, or resources/prompts/start-review.md from an installed skill, as the entry prompt for every product review. It selects Quick Gate, Standard Gate, or UX3 Council. |
| 5 | Register the reviewer agents from agents/registry.json in a full clone, or resources/agents/registry.json from an installed skill. Each entry names its instruction file, input schema, and output schema, so any agent runtime can load them. |
| 6 | Validate every review output with scripts/check_review.py in a full clone, or resources/scripts/check_review.py from an installed skill, and reject anything invalid. JSON Schema checks shape and conditional branches; check_review.py also enforces worst-verdict, weakest-flow, and headline-tier semantics. |
2. Continuous Validation In CI
- Add a CI job that validates stored review results with
scripts/check_review.pybefore anyone acts on them. - Reuse this repository's workflow as a template:
.github/workflows/validate.ymlruns the test suite plusscripts/validate.pyon every push and pull request. - Use the golden examples as fixtures:
examples/quick-gate-review.json,examples/standard-gate-review.json,examples/ux3-council-review.json. - Record human decisions with
schemas/human-decision.schema.jsonso every review links to an accountable decision record and back, with reversal conditions.
3. First Integration: Standard Gate On One Feature
Do not roll the harness out everywhere at once. Run one real feature through Standard Gate:
- Pick one upcoming feature.
- Fill
templates/product-brief.md. - Run
prompts/gate-review.mdin Standard Gate mode. - Validate the result with
scripts/check_review.py. - Record the human decision in
templates/decision-log.md(machine form:schemas/human-decision.schema.json). - If the verdict is
continue, createtemplates/context-pack.mdand hand it to execution.
Then widen: Quick Gate before small reversible changes, UX3 Council for high-uncertainty or expensive decisions.
4. Live Coding Adoption
Live coding teams should use docs/LIVE-CODING.md as the operating guide.
The shortest safe path is:
| Step | Action |
|---|---|
| 1 | Select the working language and keep identifiers in English. |
| 2 | Convert the request into a product brief before coding. |
| 3 | Run the smallest responsible review mode. |
| 4 | Validate the review with scripts/check_review.py. |
| 5 | If the verdict is continue, create and validate a context pack. |
| 6 | Implement only inside the context-pack execution boundary. |
| 7 | If scope, data, risk, or affected people change, pause and run review again. |
| 8 | Classify post-build feedback as evidence for the next iteration. |
Use the golden chain as the first fixture:
examples/live-coding-product-brief.json,
examples/live-coding-review.json, and
examples/live-coding-context-pack.json.
5. What "Installed" Means
A repository has installed the harness when all of the following are true:
| Check | Evidence |
|---|---|
| Entry prompt wired | Agent configuration references resources/prompts/start-review.md, directly or via the installed skill. |
| Outputs validated | Every review result is validated with scripts/check_review.py before it is acted on. |
| CI rejects invalid results | A CI job fails on invalid review results, including semantic weakest-flow and headline-tier mismatches. |
| Decisions traceable | Human decisions are recorded against schemas/human-decision.schema.json with the review id, an accountable owner, and reversal conditions. |
| Context packs gated | Context packs are created only after a continue verdict. |
| Live coding bounded | Coding begins only from a validated schemas/context-pack.schema.json artifact. |
6. Team Ritual
| Moment | Harness action |
|---|---|
| Before writing requirements | Fill product brief. |
| Before prototype or build | Run gate review. |
| Before launch | Run uncertainty review. |
| After learning | Update decision log and evidence ledger. |
| Before scaling | Run UX3 Council. |
7. Common Anti-Patterns
| Anti-pattern | Correction |
|---|---|
| Building because it is easy. | Run Business Flow and Evidence Flow. |
| Treating a quote as proof. | Separate quote, behavior, log, and counter-signal. |
| Averaging reviewer verdicts. | Let the weakest flow control the next step. |
| Skipping human judgment. | Route taste, risk, strategy, ethics, and meaning to humans. |
| Creating broad context packs. | Narrow scope and add stop conditions. |
| Treating live-coding prompts as approval. | Require a valid review and context pack before implementation. |
8. For Product Designers And PMs
You adopt this harness by instructing your agent, not by learning the
contracts. Paste the repository URL to your agent and ask it to review a
product decision; the agent installs the harness, runs the review, and
returns one of three verdicts: continue, verify, or stop_reframe.
Your job is to supply the decision, the evidence you actually have, and
the human judgment calls the agent routes back to you. You never run the
scripts, write JSON, or read schemas by hand - if an integration step on
this page looks technical, it is your agent's job, not yours.
Agent Orchestration
Run a single-pass three-lane review for small reversible work. Run a council when the direction needs external evidence, claim analysis, disagreement, or human judgment. Every mode reviews all three lanes; modes differ in depth, not in lane coverage.
Before any review, load schemas/session-config.schema.json,
knowledge/ontology.json, triggered entries from knowledge/rules.json, and
prompts/start-review.md in that order. Use working_language for prose and
English canonical identifiers for schemas, Flow IDs, and rule IDs.
Mode Selection
| Situation | Action |
|---|---|
| Small reversible change with bounded impact. | Quick Gate. |
| New feature, workflow, or experiment. | Standard Gate. |
| High uncertainty, high cost, low reversibility, or affected stakeholders. | UX3 Council. |
| Existing continue result with a valid context pack. | Handoff: reuse the context pack; no new review. |
Reversibility lowers mode, not the review requirement.
Evidence Retrieval Contract
External tools provide evidence, not verdicts.
- Send schemas/evidence-request.schema.json.
- Retrieve only the evidence needed for named claims.
- Require schemas/evidence-response.schema.json.
- Reject receipts without provenance, freshness, counter-signal, or raw artifact location.
- Let the Evidence Flow Reviewer interpret decision impact.
This contract applies to internal connectors, external search, product data, documents, logs, tickets, and workflow traces.
Council Fork And Join
- Intake the product direction and identify stage.
- Run Claim Analyst and create the claim dependency graph.
- Retrieve missing evidence through the evidence contract.
- Fork User, Evidence, and Business reviewers in parallel.
- Wait for all three independent reviews.
Two execution paths, either is compliant:
- Parallel dispatch: if the runtime has a task or subagent tool, dispatch the three lane reviewers concurrently. Assemble each reviewer's input as the product brief plus claim analysis plus the relevant knowledge rules, and collect each reviewer's output as one reviewer-verdict JSON object.
- Single-context rotation (fallback): one agent plays each reviewer in sequence. Blind-round discipline still applies: write each lane's complete reviewer-verdict JSON before reading the next lane's brief, and never revise an earlier lane after seeing a later one.
Unanimous-continue red flag: if all three independent lane reviews return continue in a council-tier decision, treat agreement as a signal to probe, not to relax. Run prompts/red-team.md before synthesis and attach its valid schemas/red-team-review.schema.json output as council_input.red_team_review. The output must name the challenged claims, evidence receipts, five failure modes, disconfirming tests, and a stop condition. The facilitator may downgrade the combined verdict to verify on red-team findings alone. 6. Run one challenge round per lane. 7. Run Uncertainty Reviewer on evidence tier, risk, reversibility, and freshness. 8. Run Council Facilitator. 9. Route accountable decisions to Human Judgment Gate. 10. Create a context pack only after continue.
The facilitator must not synthesize before the join barrier.
Product organization, issuer, stakeholder effects, and accountable owner are required before handoff. Taste remains human-owned and is recorded through Human Judgment Gate, not scored by reviewers.
Challenge Round
Each reviewer returns schemas/reviewer-verdict.schema.json with:
- review_round set to challenge
- objection_to
- counter_evidence
- position_change
No objection is acceptable only when the reviewer records the counter-evidence search that failed to change the conclusion.
Idea Generation
Idea generation creates alternatives, not execution.
| Step | Rule |
|---|---|
| Generate | Produce directions that differ in user mechanism, evidence need, or business logic. |
| Separate | Reject cosmetic variants of the same direction. |
| Decompose | Run claim analysis for each viable direction. |
| Stress-test | Search for counter-signals and dependency failures. |
| Select | Choose the direction with the best confidence-to-cost ratio. |
Semantic distance is a diagnostic, not a target score. Useful divergence means the options would fail for different reasons.
Trade-Off Defaults
| Trade-off | Protect by default |
|---|---|
| Speed vs confidence | Confidence when risk is high. |
| Automation vs control | Human override and accountability. |
| Growth vs trust | Trust. |
| Revenue vs access | Fairness and long-term value. |
| Novelty vs comprehension | User mental model. |
| Scope vs learning | The smallest proof step. |
Output Discipline
The council returns one canonical result:
- continue with a context pack
- verify with one proof step
- stop_reframe with a better product question
Use schemas/review-result.schema.json.
verify authorizes only the exact proof_step and never general coding.
continue plus a valid context pack authorizes implementation.
Every result must state may_do, must_not_do, and must_ask.
Post-build feedback is routed through ux3.rule.feedback_classification before
it changes scope, priority, or rules.
Glossary
| Term | Meaning |
|---|---|
| Product Design Harness | A product judgment system that runs across direction, build, launch, and feedback. |
| UX3 | User Flow, Evidence Flow, and Business Flow reviewed together. |
| Operating protocol | Six gates that apply UX3 before execution. |
| UX3 Decision Kernel | The deterministic center of UX3: Validate, Reduce, Gate, and Emit one canonical review result. |
| User Flow | The target population, actor situation, current workaround, friction, affected people, and excluded groups. |
| Evidence Flow | The sensing, learning, and calibration system that separates source, signal, interpretation, counter-signal, and decision impact; human judgment is recorded separately as accountable input. |
| Business Flow | The company, project owner, issuer, value exchange, cost, authority, stakeholders, viability, and accountability. |
| Primary user | The target actor expected to operate the product for the main outcome. |
| Secondary user | An actor involved in the workflow without being the primary target. |
| Machine actor | An automated agent, model, workflow, or software component that can sense, decide, call tools, or act. |
| Beneficiary | A person or group expected to receive benefit without necessarily operating the product. |
| Affected person | A person or group changed by the product decision, including those who do not operate it. |
| Excluded group | A population intentionally or unintentionally underserved, blocked, misrepresented, or left outside the product boundary. |
| Accountable owner | The named person or team responsible for a product decision, machine actor, claim, or execution boundary. |
| Issuer | The entity that issues a credential, claim, artifact, decision, or product promise. |
| Externality bearer | A community or group that absorbs cost, risk, confusion, exclusion, or other product externalities. |
| Gate | A decision point with input, output, and escalation rules. |
| Claim | A testable statement that must hold for the product direction to proceed. |
| Claim status | assumption or verified; a verified claim must cite at least one evidence receipt id. |
| Signal | What was observed or reported before interpretation. |
| Interpretation | What the reviewer thinks the signal means. |
| Counter-signal | Evidence or reasoning that weakens a claim. |
| Decision impact | What changes in the product decision because of the interpreted evidence. |
| Observed outcome | What happened after a bounded action was taken. |
| Evidence receipt | A traceable source, signal, interpretation, freshness record, and decision impact. |
| Evidence tier | t0-t4 operational proof level that limits the size of the next action. |
| Lane evidence tier | The t0-t4 tier each lane review reports; the tie-break in weakest flow selection when lane verdicts match. |
| Proof bar | The evidence level required before the next stage. |
| Confidence level | A human-readable judgment about trust in the current interpretation. |
| Challenge round | The council round where each lane tests another lane's material premise. |
| Context pack | The handoff package that constrains execution after a Continue verdict. |
| Human Judgment Gate | The place where taste, risk, strategy, ethics, or meaning stays human-owned. |
| Human taste | A person's accountable preference about quality, feel, meaning, taste, or strategic appetite; it is not an evidence score. |
| Human judgment | A named person's accountable decision on taste, ethics, meaning, risk appetite, or final responsibility. |
| Accountable input | A recorded human-owned input that may set direction, raise a proof bar, or accept bounded risk without pretending to be observed evidence. |
| Bounded action | A next step limited by evidence tier, risk, reversibility, scope, owner, and stop conditions. |
| Stop condition | A clear condition that blocks or downgrades execution. |
| Stop reason class | The reason class (actor, safety, core_evidence, irreversible_risk, business_viability, other) required with every stop_reframe verdict. |
| Decision rule | An operational UX3 constraint with observable triggers, evidence, counter-signals, human boundary, stop conditions, and output requirements. |
| Learning loop | signal -> interpretation -> counter-signal -> decision impact -> human judgment -> bounded action -> observed outcome -> evidence update or rule update. |
Learning Loop
UX3 learning converts product feedback and failure into stronger judgment. The loop keeps machine evidence, human interpretation, and accountable choice separate.
signal -> interpretation -> counter-signal -> decision impact
-> human judgment -> bounded action -> observed outcome
-> evidence update or rule updateSteps
| Step | Required separation |
|---|---|
| Signal | Record what was observed before explaining it. |
| Interpretation | State what the reviewer thinks the signal means. |
| Counter-signal | Name what weakens, contradicts, or reframes the interpretation. |
| Decision impact | State what changes because of the evidence. |
| Human judgment | Record taste, ethics, meaning, strategy, or risk appetite as accountable human input. |
| Bounded action | Limit the next action by evidence tier, risk, reversibility, and recovery capacity. |
| Observed outcome | Capture what happened after action. |
| Evidence update or rule update | Update the evidence record, add a test or evaluation, create a rule, or record an accepted risk. |
Failure Becomes System Memory
A repeated failure is not complete learning until it becomes one of:
| Artifact | Use |
|---|---|
| Reproducible case | The failure can be observed again. |
| Test | The failure is prevented by automation. |
| Evaluation | The failure is measured in a recurring review. |
| Decision rule | The failure changes future product judgment. |
| Accepted risk | A named human records why the risk is tolerated and when to revisit it. |
Stop Conditions
Stop or reframe when:
- source, signal, interpretation, or decision impact is missing;
- counter-signals have not been inspected for a material decision;
- human-owned judgment is hidden inside evidence language;
- the next action is larger than the current evidence can justify;
- a repeated failure has no test, evaluation, rule, or accepted-risk record.
The loop is complete only when the observed outcome changes evidence, changes a rule, or explicitly preserves the current rule with a recorded reason.
UX3 Operating Protocol
UX3 is the judgment model: User Flow, Evidence Flow, and Business Flow.
Its operating protocol decides when to inspect each dimension, what must leave each gate, and when work must escalate.
The protocol turns product judgment into repeatable action. It does not add more product dimensions.
Session startup order is fixed: load schemas/session-config.schema.json,
then knowledge/ontology.json, then triggered knowledge/rules.json, then
prompts/start-review.md. Use working_language for human-facing prose while
keeping canonical Flow identifiers and rule IDs in English.
The Six Gates
| Gate | Trigger | Required input | Required output | Escalation |
|---|---|---|---|---|
| Stage Gate | Any new or materially changed direction. | Product direction, proposed next step, constraints. | Stage and proof bar. | Unknown stage becomes standard_gate. |
| User Flow Gate | The direction changes behavior, access, control, or outcomes. | Actor boundary, workflow, experience signals. | Lane verdict, affected people, disconfirming evidence, stop condition. | Vague actor or untestable problem becomes stop_reframe. |
| Evidence Flow Gate | A claim is used to justify action. | Claims and evidence receipts. | Lane verdict, evidence tier, freshness status, missing proof. | Expired, untraceable, or t0 evidence becomes verify or stop_reframe. |
| Business Flow Gate | Work consumes ownership, distribution, support, or trust. | User value, cost boundary, retention and channel assumptions. | Lane verdict, value exchange, viability proof, stop condition. | No durable value path becomes verify or stop_reframe. |
| Council Gate | Risk, uncertainty, cost, or disagreement exceeds Quick Gate. | Claim graph and three independent lane reviews. | Challenge round, weakest flow, trade-off, proposed verdict. | Missing objection or unresolved contradiction blocks synthesis. |
| Human Judgment Gate | Taste, risk appetite, strategy, ethics, meaning, vulnerable users, brand, or irreversible action is involved. | Council result, options, evidence, reversal conditions. | Accountable decision record and final boundary. | No accountable owner means no continue verdict. |
The Human Judgment Gate includes taste. Taste is not a seventh mechanical score. It is a human decision about coherence, restraint, trust, dignity, timing, and meaning.
Product organization, issuer, stakeholder effects, and accountable owner are required before a handoff can authorize execution.
Stage-Specific Logic
| Stage | Main uncertainty | Minimum useful proof |
|---|---|---|
| Idea | Is the problem real and specific? | Named actor, situation, frequency, consequence, workaround. |
| Prototype | What behavior should be tested? | One riskiest claim, one focused test, one stop condition. |
| Launch | Is there enough pull and reliability? | Repeated behavior, adoption path, recovery path, bounded support cost. |
| Scale | Can this compound safely? | Retention, unit cost, governance, distribution, defensibility. |
Stage raises the proof bar. It never upgrades weak evidence by itself. Reversibility lowers mode, not the review requirement.
Claim Analysis
Break attractive directions into user, evidence, business, risk, and taste claims. Add dependencies so the council can see which false claim collapses the rest.
Use docs/CLAIMS.md and schemas/claim.schema.json.
Council Logic
The three lane reviewers work independently before seeing one another's conclusions. After the synchronization barrier, each reviewer must challenge one material claim or state that no objection remains and show the counter-evidence search performed.
The facilitator then applies the weakest flow rule:
| Lane state | Final action |
|---|---|
| Any lane stop_reframe, for any reason | Stop and rewrite the product question. |
| At least one verify and no stop_reframe | Run one proof step for the weakest flow. |
| All continue | Create a bounded context pack. |
The weakest flow is the lane with the most severe verdict (stop_reframe > verify > continue); ties break to the lowest lane evidence_tier, then to the fixed priority evidence, user, business.
Do not average reviewers. Do not trade away safety or actor clarity because another lane looks strong.
verify authorizes only the exact proof_step and never general coding.
continue plus a valid context pack authorizes implementation. stop_reframe
authorizes no execution work. Each branch must preserve may_do,
must_not_do, and must_ask.
Human In The Loop
Humans do not approve every detail. They own decisions that cannot be delegated without losing accountability.
| Decision | Human responsibility |
|---|---|
| Taste | Choose coherence, restraint, dignity, and timing. |
| Risk | Choose acceptable exposure and recovery obligations. |
| Strategy | Decide whether a locally valid move fits the company direction. |
| Ethics | Decide whether a useful system should exist or act. |
| Meaning | Decide what value the product should stand for. |
Record the decision with schemas/human-decision.schema.json.
Post-build feedback enters the learning loop only after classification: evidence, noise, incident, drift, or not_applicable. Classification records the source, actor role, severity, repeatability, decision impact, and next action.
Output Rule
All modes return schemas/review-result.schema.json.
- continue creates a context pack
- verify creates one proof step
- stop_reframe creates a better product question
UX3 Model
UX3 is the product decision model behind Product Design Harness. Its canonical
machine kernel is knowledge/ontology.json and knowledge/rules.json; this
document is the human-readable projection.
The original UX3 curriculum is the knowledge source, not a file to copy into
the kernel. It teaches methods, examples, professional judgment, and the
reasoning behind the model. A decision rule distills only the part an agent can
apply as an observable trigger, evidence requirement, counter-signal, human
boundary, stop condition, and bounded output. Chapter-level sources remain in
knowledge/rules.json so the projection is traceable without pretending that
one rule represents a whole chapter.
It has three connected dimensions:
| Dimension | Question |
|---|---|
| User Flow | Who is the target population, who is affected, and under what conditions should the product create an outcome? |
| Evidence Flow | What source, signal, interpretation, counter-signal, and decision impact support the next step? |
| Business Flow | Who creates value, receives value, pays, decides, operates, or absorbs risk? |
The center is not a fourth flow and not a score. It is the UX3 Decision Kernel: a deterministic reduction process that turns three lane reviews into one canonical verdict and execution boundary.
User Flow
User Flow identifies the future target population for the product and the conditions under which the product should create an outcome.
It includes:
- primary users;
- secondary users;
- machine or agent operators;
- beneficiaries who do not operate the product;
- people affected by a product decision;
- excluded or underserved groups.
The reviewer determines who the product is for, what those actors are trying to accomplish, what they currently do, and what cost, friction, risk, or loss of control they experience. A simulated walkthrough can expose assumptions, but it is not validation until compared with quotes, observed behavior, logs, and business consequence.
Evidence Flow
Evidence Flow is the product's sensing, learning, and calibration system. It helps machines and humans understand why a decision is justified and what must be learned next.
Evidence can be internal, external, behavioral, subjective, or evaluative. Evidence informs decisions; taste and judgment are separately recorded as a human decision input.
| Source | Examples | Risk |
|---|---|---|
| Internal evidence | Usage logs, support tickets, retention, sales notes, search queries, interviews. | Can overfit to current customers. |
| External evidence | Market reports, public reviews, competitor behavior, community posts, benchmark data. | Can be generic or detached from the product. |
| Direct learning | Prototype test, workflow observation, willingness test, concierge test. | Can be small but highly relevant. |
Evidence Flow keeps these layers separate:
| Layer | Meaning |
|---|---|
| Source | Where the signal came from. |
| Signal | What was observed. |
| Interpretation | What the reviewer thinks it means. |
| Counter-signal | What weakens or contradicts the interpretation. |
| Decision impact | What changes because of it. |
Human taste and judgment are separately recorded as accountable input when a decision depends on ethics, meaning, strategy, risk appetite, brand feel, or final responsibility. They are not an evidence source and are not converted into an evidence score.
Business Flow
Business Flow represents the company, project owner, issuer, or organization that creates, distributes, and remains accountable for the product.
It also includes customers and buyers, employees and operators, partners and channels, investors and funders, platforms and infrastructure providers, regulators, and communities or groups that absorb product externalities.
Business Flow asks who creates value, who receives value, who pays, who bears cost and risk, who has decision authority, and whether the exchange can remain viable and legitimate. It should infer the model from user value, workflow fit, and evidence rather than starting from monetization mechanics.
Intersections
UX3 is strongest at the intersections.
User Flow + Evidence Flow = Situated Understanding
Situated Understanding asks:
| Question | Meaning |
|---|---|
| What did users say or feel? | Subjective opinion is useful when its context and intensity are captured. |
| What did users actually do? | Behavior shows whether the opinion changes action. |
| What workaround already exists? | Workarounds reveal urgency and cost. |
| What interaction did the reviewer simulate? | Simulation exposes assumptions. |
| What still needs stronger evidence? | Quotes, behavior, logs, and payment signals must not be mixed into one undifferentiated claim. |
Evidence Flow + Business Flow = Viable Learning
Viable Learning asks:
| Question | Meaning |
|---|---|
| What signal supports value? | Evidence must connect to business consequence. |
| What cost is hidden? | Build cost is not ownership cost. |
| What signal predicts retention? | Adoption is not enough. |
| What would make the model fail? | Business assumptions need failure criteria. |
User Flow + Business Flow = Sustainable Value Exchange
Sustainable Value Exchange asks:
| Question | Meaning |
|---|---|
| What does the user gain? | The product must create clear value. |
| What does the user give up? | Time, money, data, attention, trust, workflow change. |
| What does the business capture? | Revenue, retention, distribution, trust, or depth. |
| Is the exchange fair? | Growth that damages trust is not durable. |
UX3 Decision Kernel
The kernel does not average lane scores or invent a fourth opinion. It applies the same four operations to every submitted review:
| Step | Operation | Result |
|---|---|---|
| Validate | Reject malformed contracts, missing evidence references, and contradictory fields. | Three valid lane verdicts. |
| Reduce | Select the worst verdict; break ties by evidence tier, then fixed lane priority: evidence, then user, then business. This is the order enforced by scripts/check_review.py. |
One weakest flow. |
| Gate | Compare uncertainty, risk, and reversibility. Route taste, strategy, ethics, meaning, and risk appetite to the Human Judgment Gate. | A bounded proof step or accountable human decision. |
| Emit | Produce schemas/review-result.schema.json. |
Verdict, next action, execution boundary, and stop conditions. |
The output is continue, verify, or stop_reframe. The weakest flow
controls the next action. A named-person decision may raise the proof bar or
reverse a recommendation only through an accountable decision record with
reversal conditions.
Learning Loop
Every product decision should preserve this chain:
signal -> interpretation -> counter-signal -> decision impact
-> human judgment -> bounded action -> observed outcome
-> evidence update or rule updateSignals do not decide by themselves. Human taste does not become a data score. The next action is bounded by evidence, risk, reversibility, and accountability.
Docs
| File | Purpose |
|---|---|
HARNESS.md |
Complete manual. |
UX3.md |
UX3 model, intersections, and the integrated center. |
OPERATING-PROTOCOL.md |
Six-gate operating system for staged product decisions. |
ORCHESTRATION.md |
MCP, connector, subagent, council, and debate workflow. |
UNCERTAINTY.md |
Confidence, proof bar, and uncertainty handling. |
CLAIMS.md |
Claim decomposition and dependency edges. |
CONTRACTS.md |
Canonical output contract and verdict branches. |
ANTI-PATTERNS.md |
Anti-gaming rules and review failure modes. |
GLOSSARY.md |
Shared vocabulary. |
ADOPTION.md |
Team adoption and anti-pattern guide. |
PRINCIPLES.md |
Stable decision principles. |
COUNCIL.md |
UX3 council process. |
CODING-HARNESS-COMPARISON.md |
Product Design Harness vs Coding Harness. |
See ../assets/ for book-style diagrams used across the handbook.
Review Contracts
JSON Schema defines the artifact shape and conditional branches. Prose explains
it but does not redefine it. scripts/check_review.py is the required
canonical validator for complete review results because weakest-flow and
headline-tier selection are semantic checks.
The canonical final output is schemas/review-result.schema.json. Quick Gate, Standard Gate, and UX3 Council all return this shape.
Canonical Final Result
| Machine field | Human meaning |
|---|---|
| schema_version | Contract version. |
| review_id | Stable identifier for traceability. |
| product_direction | Direction under review. |
| mode | quick_gate, standard_gate, or ux3_council. |
| stage | idea, prototype, launch, or scale. |
| actor_boundary | Target population, operator, beneficiary, machine actor, affected people, and excluded groups. actor_boundary.target_population is the single target population source. |
| combined_verdict | continue, verify, or stop_reframe. |
| weakest_flow | user, evidence, or business. |
| strongest_signal | Best current support. |
| riskiest_claim | Claim most likely to break the direction. |
| main_uncertainty | Unknown that matters most. |
| confidence_level | Human-readable confidence judgment. |
| evidence_tier | Operational proof level from t0 to t4. |
| main_trade_off | What is sacrificed to protect what matters. |
| human_owned_decision | Taste, risk, strategy, ethics, meaning, or none. |
| human_decision_record_id | Link to the accountable decision record, or null. |
| evidence_receipt_ids | Evidence receipts used by the final decision. |
| reviews | User, Evidence, and Business lane verdicts. |
| next_smallest_action | One action only. |
| execution_boundary | What may and must not be done. |
| stop_conditions | Conditions that block or downgrade work. |
| context_pack_required | True only for continue. |
Council mode also requires council_record with independent review identifiers, three challenge receipts, and unresolved conflicts.
Outcome Branches
| Verdict | Required output | Execution |
|---|---|---|
| continue | context_pack_required is true. | Create a context pack within the stated boundary. |
| verify | proof_step is required. | Run only that proof step. |
| stop_reframe | reframed_question is required. | Do not create execution work. |
Weakest Flow Rule
The weakest flow controls the next action, not every future decision.
| Lane state | Combined verdict |
|---|---|
| Any lane is stop_reframe, for any reason. | stop_reframe |
| No lane stops and at least one lane is verify. | verify |
| All three lanes are continue. | continue |
The weakest flow is the lane with the most severe verdict (stop_reframe > verify > continue); ties break to the lowest lane evidence_tier, then to the fixed priority evidence, user, business.
The headline evidence_tier equals the lowest lane evidence_tier. Use
scripts/check_review.py to validate any review-result against both the JSON
Schema shape and these semantic rules.
Human-owned decisions (taste, risk, strategy, ethics, meaning) are recorded
through schemas/human-decision.schema.json. Overriding a verify or
stop_reframe verdict to execute anyway is a different act with its own
contract: schemas/verdict-override.schema.json, checked by
scripts/check_override.py against the review it overrides. An override
never modifies the review-result - the verdict stays on record. It must name
one accountable owner, restate the weakest flow, grant an explicit scope
that cannot repeat the review's must_not_do, and carry an expiry and
tripwires. Active overrides are tracked in templates/override-ledger.md; an
unlogged override does not exist.
Reviewer Contract
Each independent reviewer and challenge-round reviewer returns schemas/reviewer-verdict.schema.json.
The challenge round requires:
- the reviewer being challenged
- counter-evidence
- whether the reviewer's position changed
This prevents a council from producing three parallel summaries and calling them debate.
Decision Rules
UX3 decision rules are operational constraints for product judgment. They tell a reviewer when a rule activates, what to inspect, what evidence can change the decision, what counter-signal can invalidate the claim, what remains human-owned, when to stop, and what bounded output must be emitted.
The canonical machine source is knowledge/rules.json. This document paraphrases the same kernel for human readers.
Rule Contract
Every rule answers the same questions:
| Field | Meaning |
|---|---|
| Trigger | The observable condition that activates the rule. |
| Must inspect | The inputs, actors, risks, or evidence the reviewer must examine. |
| Must do | Required review behavior. |
| Must not do | Behavior that makes the review invalid or misleading. |
| Evidence required | The decision-changing proof needed for the rule. |
| Counter-signal | What could weaken, invalidate, or reframe the claim. |
| Human boundary | What remains owned by a named person. |
| Stop condition | The condition that blocks, downgrades, or reframes execution. |
| Output requirement | The bounded machine-readable result the reviewer must emit. |
Rule Families
| Rule ID | Family | Operational test |
|---|---|---|
| ux3.rule.actor_boundary | Actor boundary | Separate operator, beneficiary, affected person, machine actor, buyer, issuer, and accountable owner before deciding. |
| ux3.rule.problem_hypothesis | Problem hypothesis | Treat requests as hypotheses until situation, workaround, cost, and falsification criteria are known. |
| ux3.rule.behavior_subjective_separation | Behavior and subjective experience | Keep observed behavior and stated experience as separate signals. |
| ux3.rule.disconfirm_first | Disconfirm first | Present material counter-evidence before support. |
| ux3.rule.evidence_separation | Evidence separation | Keep source, signal, interpretation, counter-signal, and decision impact distinct. |
| ux3.rule.evidence_sized_action | Evidence-sized action | Limit the next action by evidence tier, risk, reversibility, and recovery capacity. |
| ux3.rule.minimum_authority | Minimum authority | Give automated actors only the authority needed for the current proof step. |
| ux3.rule.high_risk_action_bundle | High-risk action bundle | External or irreversible actions need owner, approval, limit, trace, failure handling, and recovery path. |
| ux3.rule.minimum_validated_proof | Minimum Validated Proof | Test the riskiest assumption, not the smallest feature list. |
| ux3.rule.feedback_classification | Feedback classification | Classify feedback as evidence, noise, incident, or drift before changing direction. |
| ux3.rule.false_product_market_fit | False product-market fit | Rank repeated use, workflow dependence, payment, and reputation-bearing referral above praise or novelty. |
| ux3.rule.whole_ownership_cost | Whole ownership cost | Include support, trust, measurement, maintenance, confusion, governance, and opportunity cost. |
| ux3.rule.depth_accumulation | Depth accumulation | Identify durable depth from domain terms, edge cases, failure history, workflow rules, evaluations, and expert judgment. |
| ux3.rule.failure_to_rule_learning | Failure-to-rule learning | Turn repeated failure into a case, test, evaluation, rule, or explicit accepted risk. |
| ux3.rule.human_judgment | Human judgment | Record taste, ethics, meaning, strategy, risk appetite, and final responsibility as accountable human input. |
| ux3.rule.mental_model_alignment | Mental model alignment | Test whether target actors can predict material behavior, consequence, data or authority use, and intervention. |
| ux3.rule.human_factors_load | Human factors load | Review human, task, tool, and environment together; expose state and preserve recovery under real cognitive load. |
| ux3.rule.research_validity | Research validity | Match method to uncertainty and keep attitude, behavior, simulation, qualitative meaning, and quantitative frequency distinct. |
| ux3.rule.value_market_path | Value-to-market path | Connect target-actor value to a credible buyer, exchange, channel, willingness signal, and pre-fit retention hypothesis. PMF claims stay with ux3.rule.false_product_market_fit. |
| ux3.rule.human_agent_interaction | Human-agent interaction | Make intent, plan, status, action, approval, interruption, correction, logs, handoff, and recovery inspectable. |
| ux3.rule.motivation_ethics | Motivation ethics | Prevent retention, personalization, rewards, scarcity, or social pressure from overriding autonomy, consent, or exit. |
Source Curriculum Boundary
Operationalization is narrower than the source curriculum. A rule card does not claim to replace a chapter, method, case, or teaching sequence. It extracts only the judgment that an agent must be able to trigger, test, challenge, stop, and emit in a bounded form.
Every newly distilled rule cites its source as UX3 chapter X-Y inside
knowledge/rules.json; knowledge/source-chapters.json resolves those chapter
IDs through a checked-in source manifest and checksum. The chapter remains the
human teaching source; the rule is the machine-operable projection. Agent-era controls such as minimum
authority, deterministic verdict reduction, and machine-readable handoff may be
new extensions rather than claims copied from the original curriculum.
When multiple rules trigger, outputs compose rather than overwrite one another.
ux3.rule.value_market_path covers the pre-fit value, buyer, channel, and
learning path; ux3.rule.false_product_market_fit remains canonical for fit or
traction claims. ux3.rule.human_agent_interaction covers interaction
visibility and control surfaces; permission, approval records, authority, trace,
rollback, and the operational recovery_path remain canonical in
authority_boundary and high_risk_action_bundle, referenced by ID. The
interaction contract records only the user-visible recovery_surface.
ux3.rule.research_validity owns method fitness, sample, context, and
limitations. It references canonical evidence receipts plus behavior,
subjective, counter-signal, and decision-impact records instead of duplicating
their contents.
Strength
| Strength | Meaning |
|---|---|
| Required | Violating the rule makes the review invalid or blocks execution. |
| Conditional | Required when the observable trigger is true. |
| Advisory | Improves judgment but needs human interpretation. |
Quick reviews should still obey required rules. Standard and Council reviews activate more conditional rules when risk, uncertainty, external action, sensitive data, stakeholder conflict, or low reversibility appears.
Human Boundary
Rules do not remove human judgment. They make it explicit.
Human taste remains an accountable input, never an evidence score. A person may raise the proof bar, accept bounded risk, or choose a strategic direction, but the review must record the owner, rationale, bounded action, and reversal condition.
Principles
1. Build The Right Thing Before Building It Right
Execution quality does not rescue a bad direction.
Before execution, name:
- the user
- the problem
- the evidence
- the trade-off
- the risk
- the next smallest action
2. A Feature Request Is Not A Problem
Convert requests into problem hypotheses.
| Request | Better hypothesis |
|---|---|
| Add dashboard export. | Analysts need weekly reports without manual screenshots. |
| Add chat. | New users cannot find the next action during setup. |
| Add automation. | Operators repeat a low-risk task often enough to justify delegation. |
3. Proof Beats Polish
A polished prototype is not validation.
Use prototypes to observe behavior, not to impress stakeholders.
4. Data Provides Evidence, Not Decisions
Data becomes useful only when it changes a decision.
Reject metrics that cannot change:
- scope
- priority
- risk
- launch timing
- investment
- stop conditions
5. Disconfirm First
Every review must ask what would prove the direction wrong.
If no failure condition exists, the work is not ready.
6. Use The Least Power Needed
For any product action:
| Level | Meaning |
|---|---|
| Suggest | The system recommends. |
| Draft | The system prepares. |
| Preview | The human reviews. |
| Approve | The human authorizes. |
| Execute | The system acts. |
| Recover | The human can undo or repair. |
Do not grant more power than the task requires.
7. Cheap Features Still Carry Cost
Every feature can add:
- support burden
- user confusion
- trust risk
- measurement noise
- maintenance
- onboarding complexity
- opportunity cost
Cheap to build is not cheap to own.
8. Taste Is A Product Control
Taste checks whether the product is coherent, restrained, trustworthy, and worth using.
Taste is not subjective decoration. It is a quality control for decisions that metrics cannot fully resolve.
9. Retention Comes From Depth
Novelty fades.
Durable products create depth through:
- workflow fit
- saved context
- team process
- trust
- community
- domain expertise
- hard-won edge cases
10. Every Failure Should Strengthen The Harness
Do not only fix the case.
Update:
- a rule
- a prompt
- a template
- a schema
- a gate
- a stop condition
- an example
Claim Decomposition
A product direction is a bundle of claims. Review the claims before reviewing the solution.
Claim Types
| Type | Required question |
|---|---|
| User | What must be true about the actor, situation, problem, or consequence? |
| Evidence | What signal must be trustworthy for the decision to hold? |
| Business | What value, cost, retention, or distribution logic must be true? |
| Risk | Who can be harmed, excluded, misled, or made accountable? |
| Taste | What judgment about coherence, restraint, trust, or meaning is implied? |
Decomposition Method
- Rewrite the direction as one observable outcome.
- Split every hidden "and" into a separate claim.
- Give each claim an identifier.
- Add current support and a counter-signal.
- Link depends_on and breaks_if_false edges.
- Name the smallest proof step and stop condition.
- Mark the claim that can collapse the most downstream claims.
Use schemas/claim.schema.json for each claim.
Claim Status
- Every claim carries a status: assumption or verified.
- A claim stays an assumption until evidence receipts support it.
- A verified claim must list at least one evidence receipt id in evidence_ids.
- breaks_if_false must name at least one dependent decision or claim.
Example
Broad statement:
An autonomous assistant will save time and improve retention.
Decomposed:
| ID | Claim | Depends on | Breaks if false |
|---|---|---|---|
| U1 | Operators repeatedly perform a costly workflow. | None | E1, B1 |
| E1 | Draft assistance reduces cycle time without increasing corrections. | U1 | B1 |
| R1 | Customer-facing mistakes can be detected and reversed. | E1 | B1 |
| B1 | Time saved exceeds review, support, and recovery cost. | U1, E1, R1 | Direction |
The riskiest claim is not automatically the least supported claim. It is the claim whose failure produces the largest decision change.
Claim Review Rules
- A claim without a counter-signal is advocacy, not analysis.
- A claim without a stop condition cannot control execution.
- A derived claim cannot have stronger evidence than its weakest dependency.
- External retrieval may support a claim but cannot decide its verdict.
- Taste claims require a named human owner when they affect the final verdict.
Uncertainty, Evidence Tiers, And Confidence
Uncertainty is not a defect. Hidden uncertainty is.
The harness uses two separate ideas:
| Concept | Use |
|---|---|
| Evidence tier | Operational limit on what action is allowed. |
| Confidence level | Human-readable judgment about how much trust to place in the current interpretation. |
Never average confidence labels. Never use confidence to upgrade weak evidence.
Evidence Tiers
| Tier | Evidence pattern | Maximum default action |
|---|---|---|
| t0 | Internal belief, invented actor, generic trend, no traceable source. | Reframe the question. |
| t1 | Stated opinion, isolated quote, second-hand report, public signal. | Form a hypothesis or run discovery. |
| t2 | Contextual interview, observed workaround, support pattern, small test. | Run a focused reversible prototype. |
| t3 | Repeated behavior, adoption, payment, retention, product logs, recovery proof. | Launch or expand within a bounded scope. |
| t4 | Durable retention, workflow dependency, sustainable economics, governance proof. | Consider scale. |
Subjective evidence matters. A quote or opinion can reveal language, motivation, fear, and mental model. Its tier depends on context, repetition, and decision relevance; it should not be mistaken for observed behavior.
Confidence Rubric
| Level | Interpretation |
|---|---|
| Very low | The source, meaning, or actor is mostly unknown. |
| Low | A plausible signal exists but alternatives remain equally credible. |
| Medium | Multiple contextual signals agree and a focused next step is reversible. |
| High | Repeated direct evidence supports the claim and counter-signals are bounded. |
| Very high | Durable evidence survives time, segments, failure cases, and operating reality. |
Risk Classes
| Class | Typical effect |
|---|---|
| R1 | Reversible, low cost, no meaningful user harm. |
| R2 | Recoverable user or business impact with bounded cost. |
| R3 | Brand, legal, financial, vulnerable-user, or partially irreversible impact. |
| R4 | Safety-critical, rights-affecting, or irreversible external action. |
Decision Matrix
| Evidence tier | R1 reversible | R2 bounded | R3 high impact | R4 irreversible |
|---|---|---|---|---|
| t0 | stop_reframe | stop_reframe | stop_reframe | stop_reframe |
| t1 | verify | verify | stop_reframe | stop_reframe |
| t2 | continue narrowly | verify | verify + human gate | stop_reframe |
| t3 | continue | continue narrowly | verify + human gate | human gate |
| t4 | continue | continue | continue + human gate | human gate |
"Continue narrowly" means the execution boundary must preserve reversibility. The matrix is a default. Human judgment may raise the bar but cannot erase missing provenance, actor clarity, or safety constraints.
Freshness And Decay
Evidence expires when the market, workflow, population, policy, or product has changed enough to alter interpretation.
Every evidence receipt records:
- when it was collected
- when the source was last verified
- maximum staleness in days
- the raw artifact location
- a counter-signal
Expired evidence is not deleted. It is downgraded until re-verified.
Confidence-To-Cost Rule
Choose the smallest action that creates the largest decision-relevant increase in evidence tier for the least cost and risk.
Before handoff, ask:
- What is known?
- What is assumed?
- What evidence has expired?
- What would change the verdict?
- What decision must stay human-owned?
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/review-result.schema.json", "title": "Product Design Harness Canonical Review Result", "type": "object", "additionalProperties": false, "required": [ "schema_version", "session_config", "review_id", "product_direction", "mode", "stage", "actor_boundary", "product_organization", "stakeholder_effects", "human_judgment_boundary", "unresolved_assumptions", "combined_verdict", "weakest_flow", "strongest_signal", "riskiest_claim", "main_uncertainty", "confidence_level", "evidence_tier", "main_trade_off", "human_owned_decision", "human_decision_record_id", "evidence_receipt_ids", "reviews", "next_smallest_action", "execution_boundary", "human_approval_gates", "high_risk_actions", "stop_conditions", "context_pack_required" ], "properties": { "schema_version": { "const": "2.1" }, "session_config": { "$ref": "session-config.schema.json" }, "review_id": { "type": "string", "minLength": 1 }, "product_direction": { "type": "string", "minLength": 1 }, "mode": { "type": "string", "enum": [ "quick_gate", "standard_gate", "ux3_council" ] }, "stage": { "type": "string", "enum": [ "idea", "prototype", "launch", "scale" ] }, "actor_boundary": { "$ref": "actor-boundary.schema.json" }, "product_organization": { "type": "object", "additionalProperties": false, "required": [ "organization", "project_owner", "issuer" ], "properties": { "organization": { "type": "string", "minLength": 1 }, "project_owner": { "type": "string", "minLength": 1 }, "issuer": { "type": "string", "minLength": 1 } } }, "stakeholder_effects": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": [ "stakeholder", "effect" ], "properties": { "stakeholder": { "type": "string", "minLength": 1 }, "effect": { "type": "string", "minLength": 1 } } }, "minItems": 1 }, "human_judgment_boundary": { "type": "object", "additionalProperties": false, "required": [ "human_owned_decisions", "machine_supported_inputs", "not_mechanized", "approval_gates" ], "properties": { "human_owned_decisions": { "$ref": "#/$defs/string_list" }, "machine_supported_inputs": { "$ref": "#/$defs/string_list" }, "not_mechanized": { "$ref": "#/$defs/string_list" }, "approval_gates": { "$ref": "#/$defs/named_human_gates" } } }, "unresolved_assumptions": { "$ref": "#/$defs/non_empty_string_list" }, "combined_verdict": { "type": "string", "enum": [ "continue", "verify", "stop_reframe" ] }, "weakest_flow": { "type": "string", "enum": [ "user", "evidence", "business" ] }, "strongest_signal": { "type": "string", "minLength": 1 }, "riskiest_claim": { "type": "string", "minLength": 1 }, "main_uncertainty": { "type": "string", "minLength": 1 }, "confidence_level": { "type": "string", "enum": [ "very_low", "low", "medium", "high", "very_high" ] }, "evidence_tier": { "type": "string", "enum": [ "t0", "t1", "t2", "t3", "t4" ] }, "main_trade_off": { "type": "string", "minLength": 1 }, "human_owned_decision": { "type": "string", "enum": [ "taste", "risk", "strategy", "ethics", "meaning", "none" ] }, "human_decision_record_id": { "type": [ "string", "null" ] }, "evidence_receipt_ids": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1, "uniqueItems": true }, "reviews": { "type": "object", "additionalProperties": false, "required": [ "user", "evidence", "business" ], "properties": { "user": { "$ref": "#/$defs/lane_review" }, "evidence": { "$ref": "#/$defs/lane_review" }, "business": { "$ref": "#/$defs/lane_review" } } }, "next_smallest_action": { "type": "string", "minLength": 1 }, "execution_boundary": { "type": "object", "additionalProperties": false, "required": [ "may_do", "must_not_do", "must_ask" ], "properties": { "may_do": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "must_not_do": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "must_ask": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 } } }, "human_approval_gates": { "$ref": "#/$defs/named_human_gates" }, "high_risk_actions": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": [ "action", "approval_gate", "rollback_plan" ], "properties": { "action": { "type": "string", "minLength": 1 }, "approval_gate": { "$ref": "#/$defs/named_human_gate" }, "rollback_plan": { "type": "string", "minLength": 1 } } } }, "stop_conditions": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "context_pack_required": { "type": "boolean" }, "council_record": { "type": "object", "additionalProperties": false, "required": [ "independent_review_ids", "challenges", "unresolved_conflicts" ], "properties": { "independent_review_ids": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 3, "uniqueItems": true }, "challenges": { "type": "array", "items": { "$ref": "#/$defs/challenge" }, "minItems": 3 }, "unresolved_conflicts": { "type": "array", "items": { "type": "string", "minLength": 1 } } } }, "proof_step": { "type": "string", "minLength": 1 }, "reframed_question": { "type": "string", "minLength": 1 } }, "allOf": [ { "if": { "properties": { "mode": { "const": "ux3_council" } }, "required": [ "mode" ] }, "then": { "required": [ "council_record" ] } }, { "if": { "properties": { "human_owned_decision": { "const": "none" } }, "required": [ "human_owned_decision" ] }, "then": { "properties": { "human_decision_record_id": { "const": null } } }, "else": { "properties": { "human_decision_record_id": { "type": "string", "minLength": 1 } } } }, { "if": { "properties": { "combined_verdict": { "const": "continue" } }, "required": [ "combined_verdict" ] }, "then": { "properties": { "context_pack_required": { "const": true } }, "not": { "anyOf": [ { "required": [ "proof_step" ] }, { "required": [ "reframed_question" ] } ] } } }, { "if": { "properties": { "combined_verdict": { "const": "verify" } }, "required": [ "combined_verdict" ] }, "then": { "required": [ "proof_step" ], "properties": { "context_pack_required": { "const": false } }, "not": { "required": [ "reframed_question" ] } } }, { "if": { "properties": { "combined_verdict": { "const": "stop_reframe" } }, "required": [ "combined_verdict" ] }, "then": { "required": [ "reframed_question" ], "properties": { "context_pack_required": { "const": false } }, "not": { "required": [ "proof_step" ] } } }, { "if": { "properties": { "reviews": { "properties": { "user": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] } }, "required": [ "user" ] } }, "required": [ "reviews" ] }, "then": { "properties": { "combined_verdict": { "const": "stop_reframe" } } } }, { "if": { "properties": { "reviews": { "properties": { "evidence": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] } }, "required": [ "evidence" ] } }, "required": [ "reviews" ] }, "then": { "properties": { "combined_verdict": { "const": "stop_reframe" } } } }, { "if": { "properties": { "reviews": { "properties": { "business": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] } }, "required": [ "business" ] } }, "required": [ "reviews" ] }, "then": { "properties": { "combined_verdict": { "const": "stop_reframe" } } } }, { "if": { "properties": { "combined_verdict": { "const": "continue" } }, "required": [ "combined_verdict" ] }, "then": { "properties": { "reviews": { "properties": { "user": { "properties": { "verdict": { "const": "continue" } } }, "evidence": { "properties": { "verdict": { "const": "continue" } } }, "business": { "properties": { "verdict": { "const": "continue" } } } } } } } }, { "if": { "properties": { "combined_verdict": { "const": "verify" } }, "required": [ "combined_verdict" ] }, "then": { "properties": { "reviews": { "anyOf": [ { "properties": { "user": { "properties": { "verdict": { "const": "verify" } }, "required": [ "verdict" ] } }, "required": [ "user" ] }, { "properties": { "evidence": { "properties": { "verdict": { "const": "verify" } }, "required": [ "verdict" ] } }, "required": [ "evidence" ] }, { "properties": { "business": { "properties": { "verdict": { "const": "verify" } }, "required": [ "verdict" ] } }, "required": [ "business" ] } ] } } } }, { "if": { "properties": { "mode": { "enum": [ "quick_gate", "standard_gate" ] } }, "required": [ "mode" ] }, "then": { "not": { "required": [ "council_record" ] } } }, { "if": { "properties": { "combined_verdict": { "const": "stop_reframe" } }, "required": [ "combined_verdict" ] }, "then": { "properties": { "reviews": { "anyOf": [ { "properties": { "user": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] } }, "required": [ "user" ] }, { "properties": { "evidence": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] } }, "required": [ "evidence" ] }, { "properties": { "business": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] } }, "required": [ "business" ] } ] } } } }, { "if": { "properties": { "execution_boundary": { "properties": { "may_do": { "contains": { "type": "string", "pattern": "([Cc]ustomer-facing|[Pp]ermissions|[Dd]ata handling|[Pp]roduction schema|[Ee]xternal action|[Rr]emove human approval|[Aa]utonomous)" } } }, "required": [ "may_do" ] } }, "required": [ "execution_boundary" ] }, "then": { "properties": { "high_risk_actions": { "minItems": 1 } }, "required": [ "high_risk_actions" ] } } ], "$defs": { "string_list": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "non_empty_string_list": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "named_human_gates": { "type": "array", "items": { "$ref": "#/$defs/named_human_gate" } }, "named_human_gate": { "type": "object", "additionalProperties": false, "required": [ "gate_id", "accountable_owner", "condition" ], "properties": { "gate_id": { "type": "string", "minLength": 1 }, "accountable_owner": { "type": "string", "minLength": 1 }, "condition": { "type": "string", "minLength": 1 } } }, "challenge": { "type": "object", "additionalProperties": false, "required": [ "reviewer", "objection_to", "counter_evidence", "position_change" ], "properties": { "reviewer": { "type": "string", "enum": [ "user_flow", "evidence_flow", "business_flow" ] }, "objection_to": { "type": "string", "enum": [ "user_flow", "evidence_flow", "business_flow", "none" ] }, "counter_evidence": { "type": "string", "minLength": 1 }, "position_change": { "type": "string", "enum": [ "unchanged", "strengthened", "weakened", "reversed" ] } }, "allOf": [ { "not": { "properties": { "reviewer": { "const": "user_flow" }, "objection_to": { "const": "user_flow" } }, "required": [ "reviewer", "objection_to" ] } }, { "not": { "properties": { "reviewer": { "const": "evidence_flow" }, "objection_to": { "const": "evidence_flow" } }, "required": [ "reviewer", "objection_to" ] } }, { "not": { "properties": { "reviewer": { "const": "business_flow" }, "objection_to": { "const": "business_flow" } }, "required": [ "reviewer", "objection_to" ] } }, { "if": { "properties": { "objection_to": { "const": "none" } }, "required": [ "objection_to" ] }, "then": { "properties": { "position_change": { "const": "unchanged" } } } } ] }, "lane_review": { "type": "object", "additionalProperties": false, "required": [ "verdict", "evidence_tier", "strongest_signal", "weakest_assumption", "missing_evidence", "disconfirming_evidence", "stop_condition" ], "properties": { "verdict": { "type": "string", "enum": [ "continue", "verify", "stop_reframe" ] }, "stop_reason_class": { "type": "string", "enum": [ "actor", "safety", "core_evidence", "irreversible_risk", "business_viability", "other" ] }, "evidence_tier": { "type": "string", "enum": [ "t0", "t1", "t2", "t3", "t4" ] }, "strongest_signal": { "type": "string", "minLength": 1 }, "weakest_assumption": { "type": "string", "minLength": 1 }, "missing_evidence": { "type": "string", "minLength": 1 }, "disconfirming_evidence": { "type": "string", "minLength": 1 }, "stop_condition": { "type": "string", "minLength": 1 } }, "allOf": [ { "if": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] }, "then": { "required": [ "stop_reason_class" ] }, "else": { "not": { "required": [ "stop_reason_class" ] } } } ] } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/actor-boundary.schema.json", "title": "Product Design Harness Actor Boundary", "type": "object", "additionalProperties": false, "required": [ "target_population", "operator", "beneficiary", "machine_actor", "affected_people", "excluded_groups" ], "properties": { "target_population": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "operator": { "type": "string", "minLength": 1 }, "beneficiary": { "type": "string", "minLength": 1 }, "machine_actor": { "type": "string", "minLength": 1 }, "affected_people": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "excluded_groups": { "type": "array", "items": { "type": "string", "minLength": 1 } } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/session-config.schema.json", "title": "UX3 Session Config", "type": "object", "additionalProperties": false, "required": [ "working_language", "canonical_identifiers", "fallback_language" ], "properties": { "working_language": { "type": "string", "enum": ["en", "zh-TW", "zh-CN", "ja", "ko", "es", "fr", "de", "pt"] }, "canonical_identifiers": { "type": "string", "const": "en" }, "fallback_language": { "type": "string", "const": "en" } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/context-pack.schema.json", "title": "Product Design Harness Context Pack", "type": "object", "additionalProperties": false, "required": [ "schema_version", "session_config", "review_id", "goal", "stage", "combined_verdict", "actor_boundary", "product_organization", "stakeholder_effects", "human_judgment_boundary", "unresolved_assumptions", "scope", "non_goals", "acceptance_criteria", "measurement_hooks", "evidence_snapshot_ids", "rollback_plan", "human_approval_gates", "high_risk_actions", "stop_conditions", "execution_boundary" ], "properties": { "schema_version": { "const": "2.1" }, "session_config": { "$ref": "session-config.schema.json" }, "review_id": { "type": "string", "minLength": 1 }, "goal": { "type": "string", "minLength": 1 }, "stage": { "type": "string", "enum": [ "idea", "prototype", "launch", "scale" ] }, "combined_verdict": { "type": "string", "const": "continue" }, "actor_boundary": { "$ref": "actor-boundary.schema.json" }, "product_organization": { "type": "object", "additionalProperties": false, "required": [ "organization", "project_owner", "issuer" ], "properties": { "organization": { "type": "string", "minLength": 1 }, "project_owner": { "type": "string", "minLength": 1 }, "issuer": { "type": "string", "minLength": 1 } } }, "stakeholder_effects": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": [ "stakeholder", "effect" ], "properties": { "stakeholder": { "type": "string", "minLength": 1 }, "effect": { "type": "string", "minLength": 1 } } }, "minItems": 1 }, "unresolved_assumptions": { "$ref": "#/$defs/non_empty_string_list" }, "human_judgment_boundary": { "type": "object", "additionalProperties": false, "required": [ "human_owned_decisions", "machine_supported_inputs", "not_mechanized", "approval_gates" ], "properties": { "human_owned_decisions": { "$ref": "#/$defs/string_list" }, "machine_supported_inputs": { "$ref": "#/$defs/string_list" }, "not_mechanized": { "$ref": "#/$defs/string_list" }, "approval_gates": { "$ref": "#/$defs/named_human_gates" } } }, "scope": { "$ref": "#/$defs/non_empty_string_list" }, "non_goals": { "$ref": "#/$defs/string_list" }, "acceptance_criteria": { "$ref": "#/$defs/non_empty_string_list" }, "measurement_hooks": { "$ref": "#/$defs/string_list" }, "evidence_snapshot_ids": { "$ref": "#/$defs/string_list" }, "rollback_plan": { "type": "string", "minLength": 1 }, "human_approval_gates": { "$ref": "#/$defs/named_human_gates" }, "high_risk_actions": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": [ "action", "approval_gate", "rollback_plan" ], "properties": { "action": { "type": "string", "minLength": 1 }, "approval_gate": { "$ref": "#/$defs/named_human_gate" }, "rollback_plan": { "type": "string", "minLength": 1 } } } }, "stop_conditions": { "$ref": "#/$defs/non_empty_string_list" }, "execution_boundary": { "type": "object", "additionalProperties": false, "required": [ "may_do", "must_not_do", "must_ask" ], "properties": { "may_do": { "$ref": "#/$defs/non_empty_string_list" }, "must_not_do": { "$ref": "#/$defs/non_empty_string_list" }, "must_ask": { "$ref": "#/$defs/non_empty_string_list" } } } }, "allOf": [ { "if": { "properties": { "execution_boundary": { "properties": { "may_do": { "contains": { "type": "string", "pattern": "([Cc]ustomer-facing|[Pp]ermissions|[Dd]ata handling|[Pp]roduction schema|[Ee]xternal action|[Rr]emove human approval|[Aa]utonomous)" } } }, "required": [ "may_do" ] } }, "required": [ "execution_boundary" ] }, "then": { "properties": { "high_risk_actions": { "minItems": 1 } }, "required": [ "high_risk_actions" ] } } ], "$defs": { "string_list": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "non_empty_string_list": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "named_human_gates": { "type": "array", "items": { "$ref": "#/$defs/named_human_gate" } }, "named_human_gate": { "type": "object", "additionalProperties": false, "required": [ "gate_id", "accountable_owner", "condition" ], "properties": { "gate_id": { "type": "string", "minLength": 1 }, "accountable_owner": { "type": "string", "minLength": 1 }, "condition": { "type": "string", "minLength": 1 } } } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/claim-analysis.schema.json", "title": "Product Design Harness Claim Analysis", "type": "object", "additionalProperties": false, "required": [ "claims", "riskiest_claim_id", "critical_path", "highest_leverage_proof_step", "human_owned_decision" ], "properties": { "claims": { "type": "array", "items": { "$ref": "claim.schema.json" }, "minItems": 1 }, "riskiest_claim_id": { "type": "string", "minLength": 1 }, "critical_path": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "highest_leverage_proof_step": { "type": "string", "minLength": 1 }, "human_owned_decision": { "type": "string", "enum": ["taste", "risk", "strategy", "ethics", "meaning", "none"] } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/uncertainty-review.schema.json", "title": "Product Design Harness Uncertainty Review", "type": "object", "additionalProperties": false, "required": [ "evidence_tier", "confidence_level", "risk_class", "reversibility", "main_uncertainty", "false_confidence_risk", "stale_evidence_ids", "proof_bar", "verdict_impact", "human_owned_decision" ], "properties": { "evidence_tier": { "type": "string", "enum": ["t0", "t1", "t2", "t3", "t4"] }, "confidence_level": { "type": "string", "enum": ["very_low", "low", "medium", "high", "very_high"] }, "risk_class": { "type": "string", "enum": ["r1", "r2", "r3", "r4"] }, "reversibility": { "type": "string", "enum": ["low", "medium", "high"] }, "main_uncertainty": { "type": "string", "minLength": 1 }, "false_confidence_risk": { "type": "string" }, "stale_evidence_ids": { "type": "array", "items": { "type": "string" } }, "proof_bar": { "type": "string", "minLength": 1 }, "verdict_impact": { "type": "string", "enum": ["continue", "verify", "stop_reframe"] }, "human_owned_decision": { "type": "string", "enum": ["taste", "risk", "strategy", "ethics", "meaning", "none"] } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/evidence-request.schema.json", "title": "Product Design Harness Evidence Request", "type": "object", "additionalProperties": false, "required": [ "request_id", "decision_question", "claim_ids", "allowed_source_types", "required_signal_types", "freshness_limit_days", "return_counter_signals" ], "properties": { "request_id": { "type": "string", "minLength": 1 }, "decision_question": { "type": "string", "minLength": 1 }, "claim_ids": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "allowed_source_types": { "type": "array", "items": { "type": "string", "enum": [ "internal", "external", "workflow", "risk", "direct_learning" ] }, "minItems": 1 }, "required_signal_types": { "type": "array", "items": { "type": "string", "enum": [ "stated_opinion", "quote", "observed_behavior", "workflow_trace", "product_log", "transaction", "market_signal", "policy", "derived" ] } }, "freshness_limit_days": { "type": "integer", "minimum": 0 }, "return_counter_signals": { "const": true } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/evidence-response.schema.json", "title": "Product Design Harness Evidence Response", "type": "object", "additionalProperties": false, "required": [ "request_id", "source_connector", "retrieved_at", "receipts", "coverage_gaps" ], "properties": { "request_id": { "type": "string", "minLength": 1 }, "source_connector": { "type": "string", "minLength": 1 }, "retrieved_at": { "type": "string", "format": "date-time" }, "receipts": { "type": "array", "items": { "$ref": "evidence.schema.json" } }, "coverage_gaps": { "type": "array", "items": { "type": "string" } } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/ontology.schema.json", "title": "UX3 Ontology", "type": "object", "additionalProperties": false, "required": [ "schema_version", "canonical_language", "name", "description", "flows", "intersections", "actor_roles", "stakeholder_roles", "evidence_terms", "human_judgment_terms", "learning_loop" ], "properties": { "schema_version": { "type": "string", "pattern": "^[0-9]+\.[0-9]+\.[0-9]+$" }, "canonical_language": { "const": "en" }, "name": { "type": "string", "minLength": 1 }, "description": { "type": "string", "minLength": 1 }, "flows": { "type": "array", "minItems": 3, "maxItems": 3, "items": { "$ref": "#/$defs/flow" } }, "intersections": { "type": "array", "minItems": 4, "maxItems": 4, "items": { "$ref": "#/$defs/intersection" } }, "actor_roles": { "type": "array", "minItems": 6, "items": { "$ref": "#/$defs/term" } }, "stakeholder_roles": { "type": "array", "minItems": 11, "items": { "$ref": "#/$defs/term" } }, "evidence_terms": { "type": "array", "minItems": 6, "items": { "$ref": "#/$defs/term" } }, "human_judgment_terms": { "type": "array", "minItems": 3, "items": { "$ref": "#/$defs/term" } }, "learning_loop": { "type": "array", "minItems": 8, "items": { "type": "string", "minLength": 1 } } }, "$defs": { "flow": { "type": "object", "additionalProperties": false, "required": [ "id", "name", "definition", "must_answer" ], "properties": { "id": { "enum": [ "user_flow", "evidence_flow", "business_flow" ] }, "name": { "enum": [ "User Flow", "Evidence Flow", "Business Flow" ] }, "definition": { "type": "string", "minLength": 1 }, "must_answer": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } } } }, "intersection": { "type": "object", "additionalProperties": false, "required": [ "id", "name", "label", "required_question" ], "properties": { "id": { "enum": [ "user_evidence", "evidence_business", "user_business", "ux3_decision_kernel" ] }, "name": { "enum": [ "User + Evidence", "Evidence + Business", "User + Business", "User + Evidence + Business" ] }, "label": { "type": "string", "minLength": 1 }, "required_question": { "type": "string", "minLength": 1 } } }, "term": { "type": "object", "additionalProperties": false, "required": [ "id", "definition" ], "properties": { "id": { "type": "string", "pattern": "^[a-z0-9_]+$" }, "definition": { "type": "string", "minLength": 1 } } } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/red-team-review.schema.json", "title": "Product Design Harness Red-Team Review", "type": "object", "additionalProperties": false, "required": [ "review_id", "claim_ids", "evidence_receipt_ids", "failure_modes", "disconfirming_tests", "hidden_affected_people", "current_workaround", "substitute_threats", "trust_risk", "stop_condition", "verdict" ], "properties": { "review_id": { "type": "string", "minLength": 1 }, "claim_ids": { "$ref": "#/$defs/non_empty_string_list" }, "evidence_receipt_ids": { "$ref": "#/$defs/non_empty_string_list" }, "failure_modes": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 5, "uniqueItems": true }, "disconfirming_tests": { "$ref": "#/$defs/non_empty_string_list" }, "hidden_affected_people": { "$ref": "#/$defs/non_empty_string_list" }, "current_workaround": { "type": "string", "minLength": 1 }, "substitute_threats": { "type": "object", "additionalProperties": false, "required": [ "direct", "indirect", "platform", "workflow", "doing_nothing" ], "properties": { "direct": { "type": "string", "minLength": 1 }, "indirect": { "type": "string", "minLength": 1 }, "platform": { "type": "string", "minLength": 1 }, "workflow": { "type": "string", "minLength": 1 }, "doing_nothing": { "type": "string", "minLength": 1 } } }, "trust_risk": { "type": "string", "minLength": 1 }, "stop_condition": { "type": "string", "minLength": 1 }, "verdict": { "type": "string", "enum": [ "continue", "verify", "stop_reframe" ] } }, "$defs": { "non_empty_string_list": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1, "uniqueItems": true } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/product-brief.schema.json", "title": "Product Design Harness Product Brief", "type": "object", "additionalProperties": false, "required": [ "schema_version", "session_config", "product_direction", "accountable_owner", "stage", "actor_boundary", "business_boundary", "human_judgment_boundary", "unresolved_assumptions", "execution_boundary", "problem_hypothesis", "current_evidence", "business_goal", "constraints", "proposed_next_step", "known_risks" ], "properties": { "schema_version": { "const": "2.1" }, "session_config": { "$ref": "session-config.schema.json" }, "product_direction": { "type": "string", "minLength": 1 }, "accountable_owner": { "type": "string", "minLength": 1 }, "stage": { "type": "string", "enum": [ "idea", "prototype", "launch", "scale" ] }, "actor_boundary": { "$ref": "actor-boundary.schema.json" }, "business_boundary": { "type": "object", "required": [ "product_organization", "project_owner", "issuer", "customers", "buyers", "operators", "partners", "funders", "platforms", "regulators", "externality_bearers", "decision_authority", "value_exchange" ], "properties": { "product_organization": { "type": "string", "minLength": 1 }, "project_owner": { "type": "string", "minLength": 1 }, "issuer": { "type": "string", "minLength": 1 }, "customers": { "$ref": "#/$defs/string_list" }, "buyers": { "$ref": "#/$defs/string_list" }, "operators": { "$ref": "#/$defs/string_list" }, "partners": { "$ref": "#/$defs/string_list" }, "funders": { "$ref": "#/$defs/string_list" }, "platforms": { "$ref": "#/$defs/string_list" }, "regulators": { "$ref": "#/$defs/string_list" }, "externality_bearers": { "$ref": "#/$defs/string_list" }, "decision_authority": { "type": "string", "minLength": 1 }, "value_exchange": { "type": "string", "minLength": 1 } }, "additionalProperties": false }, "human_judgment_boundary": { "type": "object", "required": [ "human_owned_decisions", "machine_supported_inputs", "not_mechanized", "approval_gates" ], "properties": { "human_owned_decisions": { "$ref": "#/$defs/string_list" }, "machine_supported_inputs": { "$ref": "#/$defs/string_list" }, "not_mechanized": { "$ref": "#/$defs/string_list" }, "approval_gates": { "$ref": "#/$defs/named_human_gates" } }, "additionalProperties": false }, "unresolved_assumptions": { "$ref": "#/$defs/non_empty_string_list" }, "execution_boundary": { "$ref": "#/$defs/execution_boundary" }, "problem_hypothesis": { "type": "string", "minLength": 1 }, "current_evidence": { "type": "array", "items": { "$ref": "evidence.schema.json" } }, "business_goal": { "type": "string", "minLength": 1 }, "constraints": { "$ref": "#/$defs/string_list" }, "proposed_next_step": { "type": "string", "minLength": 1 }, "known_risks": { "$ref": "#/$defs/string_list" } }, "$defs": { "string_list": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "non_empty_string_list": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "execution_boundary": { "type": "object", "additionalProperties": false, "required": [ "may_do", "must_not_do", "must_ask" ], "properties": { "may_do": { "$ref": "#/$defs/non_empty_string_list" }, "must_not_do": { "$ref": "#/$defs/non_empty_string_list" }, "must_ask": { "$ref": "#/$defs/non_empty_string_list" } } }, "named_human_gates": { "type": "array", "items": { "$ref": "#/$defs/named_human_gate" } }, "named_human_gate": { "type": "object", "additionalProperties": false, "required": [ "gate_id", "accountable_owner", "condition" ], "properties": { "gate_id": { "type": "string", "minLength": 1 }, "accountable_owner": { "type": "string", "minLength": 1 }, "condition": { "type": "string", "minLength": 1 } } } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/decision-rule.schema.json", "title": "UX3 Decision Rule", "type": "object", "additionalProperties": false, "required": [ "rule_id", "title", "flow", "strength", "trigger", "must_inspect", "must_do", "must_not_do", "evidence_required", "counter_signal", "human_boundary", "stop_condition", "output_requirement", "source" ], "properties": { "rule_id": { "type": "string", "pattern": "^ux3\.[A-Za-z0-9_.-]+$" }, "title": { "type": "string", "minLength": 1 }, "flow": { "type": "string", "minLength": 1 }, "strength": { "type": "string", "minLength": 1 }, "trigger": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "must_inspect": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "must_do": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "must_not_do": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "evidence_required": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "counter_signal": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "human_boundary": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "stop_condition": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "output_requirement": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "source": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } } } }
Schemas
These schemas define machine-checkable Product Design Harness outputs.
| File | Use |
|---|---|
actor-boundary.schema.json |
Shared actor boundary reused by product brief, review result, and context pack. |
claim-analysis.schema.json |
Claim graph and critical path. |
claim.schema.json |
Claim analysis item. |
context-pack.schema.json |
Handoff after Continue. |
council-input.schema.json |
Join-barrier input for council synthesis. |
decision-rule.schema.json |
Machine-readable UX3 decision rule. |
evidence-request.schema.json |
Request contract for external evidence retrieval. |
evidence-response.schema.json |
Response contract for external evidence retrieval. |
evidence.schema.json |
Evidence receipt with provenance and freshness. |
human-decision.schema.json |
Human-owned decision record. |
verdict-override.schema.json |
Authorizes execution despite a verdict; never edits the review. |
ontology.schema.json |
Machine-readable UX3 ontology. |
product-brief.schema.json |
Machine-readable intake. |
red-team-review.schema.json |
Structured counter-case required when every independent Council lane continues. |
review-result.schema.json |
Canonical final result for every review mode. |
reviewer-verdict.schema.json |
Individual reviewer output per round; summarized into the canonical result's lane reviews. |
session-config.schema.json |
Working-language session configuration. |
uncertainty-review.schema.json |
Evidence tier, risk, reversibility, and proof bar. |
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/claim.schema.json", "title": "Product Design Harness Claim", "type": "object", "additionalProperties": false, "required": [ "id", "type", "claim", "status", "support", "counter_signal", "confidence_level", "depends_on", "breaks_if_false", "proof_step", "stop_condition" ], "properties": { "id": { "type": "string", "minLength": 1 }, "type": { "type": "string", "enum": [ "user", "evidence", "business", "risk", "taste" ] }, "claim": { "type": "string", "minLength": 1 }, "status": { "type": "string", "enum": [ "assumption", "verified" ], "description": "Whether this claim is still an assumption or verified by evidence." }, "support": { "type": "string" }, "evidence_ids": { "type": "array", "items": { "type": "string", "minLength": 1 }, "description": "Evidence receipt ids that support this claim." }, "counter_signal": { "type": "string" }, "confidence_level": { "type": "string", "enum": [ "very_low", "low", "medium", "high", "very_high" ] }, "depends_on": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "breaks_if_false": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "proof_step": { "type": "string" }, "stop_condition": { "type": "string" } }, "allOf": [ { "if": { "properties": { "status": { "const": "verified" } }, "required": [ "status" ] }, "then": { "required": [ "evidence_ids" ], "properties": { "evidence_ids": { "minItems": 1 } } } } ] }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/reviewer-verdict.schema.json", "title": "Product Design Harness Reviewer Verdict", "type": "object", "additionalProperties": false, "required": [ "reviewer", "review_round", "verdict", "strongest_signal", "weakest_assumption", "missing_evidence", "disconfirming_evidence", "evidence_tier", "confidence_level", "stop_condition", "next_smallest_action" ], "properties": { "reviewer": { "type": "string", "enum": [ "user_flow", "evidence_flow", "business_flow" ] }, "review_round": { "type": "string", "enum": [ "independent", "challenge" ] }, "verdict": { "type": "string", "enum": [ "continue", "verify", "stop_reframe" ] }, "strongest_signal": { "type": "string", "minLength": 1 }, "weakest_assumption": { "type": "string", "minLength": 1 }, "missing_evidence": { "type": "string", "minLength": 1 }, "disconfirming_evidence": { "type": "string", "minLength": 1 }, "evidence_tier": { "type": "string", "enum": [ "t0", "t1", "t2", "t3", "t4" ] }, "confidence_level": { "type": "string", "enum": [ "very_low", "low", "medium", "high", "very_high" ] }, "objection_to": { "type": "string", "enum": [ "user_flow", "evidence_flow", "business_flow", "none" ] }, "counter_evidence": { "type": "string", "minLength": 1 }, "position_change": { "type": "string", "enum": [ "unchanged", "strengthened", "weakened", "reversed" ] }, "stop_condition": { "type": "string", "minLength": 1 }, "next_smallest_action": { "type": "string", "minLength": 1 }, "stop_reason_class": { "type": "string", "enum": [ "actor", "safety", "core_evidence", "irreversible_risk", "business_viability", "other" ] } }, "allOf": [ { "if": { "properties": { "review_round": { "const": "challenge" } }, "required": [ "review_round" ] }, "then": { "required": [ "objection_to", "counter_evidence", "position_change" ] }, "else": { "not": { "anyOf": [ { "required": [ "objection_to" ] }, { "required": [ "counter_evidence" ] }, { "required": [ "position_change" ] } ] } } }, { "if": { "properties": { "verdict": { "const": "stop_reframe" } }, "required": [ "verdict" ] }, "then": { "required": [ "stop_reason_class" ] }, "else": { "not": { "required": [ "stop_reason_class" ] } } } ] }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/evidence.schema.json", "title": "Product Design Harness Evidence Receipt", "type": "object", "additionalProperties": false, "required": [ "evidence_id", "source_id", "source_type", "raw_artifact_uri", "signal_type", "signal", "interpretation", "decision_impact", "evidence_tier", "confidence_level", "counter_signal", "collected_at", "source_last_verified_at", "max_staleness_days" ], "properties": { "evidence_id": { "type": "string", "minLength": 1 }, "source_id": { "type": "string", "minLength": 1 }, "source_type": { "type": "string", "enum": [ "internal", "external", "workflow", "risk", "direct_learning" ] }, "raw_artifact_uri": { "type": "string", "minLength": 1 }, "signal_type": { "type": "string", "enum": [ "stated_opinion", "quote", "observed_behavior", "workflow_trace", "product_log", "transaction", "market_signal", "policy", "derived" ] }, "signal": { "type": "string", "minLength": 1 }, "interpretation": { "type": "string", "minLength": 1 }, "decision_impact": { "type": "string", "minLength": 1 }, "evidence_tier": { "type": "string", "enum": [ "t0", "t1", "t2", "t3", "t4" ] }, "confidence_level": { "type": "string", "enum": [ "very_low", "low", "medium", "high", "very_high" ] }, "counter_signal": { "type": "string", "minLength": 1 }, "collected_at": { "type": "string", "format": "date-time" }, "source_last_verified_at": { "type": "string", "format": "date-time" }, "max_staleness_days": { "type": "integer", "minimum": 0 } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/verdict-override.schema.json", "title": "Product Design Harness Verdict Override", "description": "Authorizes execution despite a verify or stop_reframe verdict. An override never modifies the review-result: the review's verdict stays on record, and this artifact records who chose to execute anyway, within what scope, until when, and what voids the authorization. Validate with scripts/check_override.py, which also cross-checks the referenced review.", "type": "object", "additionalProperties": false, "required": [ "override_id", "review_id", "overridden_verdict", "acknowledged_weakest_flow", "authorized_scope", "accountable_owner", "rationale", "expires_at", "tripwires", "renewal_requires" ], "properties": { "override_id": { "type": "string", "minLength": 1, "description": "Stable identifier; any document that references the overridden review must carry it." }, "review_id": { "type": "string", "minLength": 1, "description": "The review_id of the review-result being overridden." }, "overridden_verdict": { "type": "string", "enum": ["verify", "stop_reframe"], "description": "Must equal the review's combined_verdict. A continue verdict needs no override." }, "acknowledged_weakest_flow": { "type": "string", "enum": ["user", "evidence", "business"], "description": "Must equal the review's weakest_flow; the owner restates the gap they are accepting." }, "authorized_scope": { "type": "object", "additionalProperties": false, "required": ["may_do", "must_not_do"], "description": "Execution scope granted despite the verdict. No may_do entry may repeat an entry from the review's must_not_do.", "properties": { "may_do": { "type": "array", "items": {"type": "string", "minLength": 1}, "minItems": 1 }, "must_not_do": { "type": "array", "items": {"type": "string", "minLength": 1}, "minItems": 1 }, "must_ask": { "type": "array", "items": {"type": "string", "minLength": 1}, "minItems": 1 } } }, "accountable_owner": { "type": "string", "minLength": 1, "description": "A named person, not a team." }, "rationale": { "type": "string", "minLength": 1, "description": "Why executing despite the verdict is the right call." }, "expires_at": { "type": "string", "format": "date-time", "pattern": "^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$", "description": "Every override is time-boxed. When it lapses, the original verdict is in force again." }, "tripwires": { "type": "array", "items": {"type": "string", "minLength": 1}, "minItems": 1, "description": "Measurable conditions; any one tripping voids the override immediately." }, "renewal_requires": { "type": "array", "items": {"type": "string", "minLength": 1}, "minItems": 1, "description": "Evidence a renewal review must present. Renewal is a new review, never an edit." } } }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/council-input.schema.json", "title": "Product Design Harness Council Input", "type": "object", "additionalProperties": false, "required": [ "product_brief", "claim_analysis", "independent_reviews", "challenge_reviews", "uncertainty_review" ], "properties": { "product_brief": { "$ref": "product-brief.schema.json" }, "claim_analysis": { "$ref": "claim-analysis.schema.json" }, "independent_reviews": { "type": "array", "items": { "$ref": "reviewer-verdict.schema.json" }, "minItems": 3, "maxItems": 3 }, "challenge_reviews": { "type": "array", "items": { "$ref": "reviewer-verdict.schema.json" }, "minItems": 3, "maxItems": 3 }, "uncertainty_review": { "$ref": "uncertainty-review.schema.json" }, "red_team_review": { "$ref": "red-team-review.schema.json" } }, "allOf": [ { "if": { "required": ["independent_reviews"], "properties": { "independent_reviews": { "contains": { "type": "object", "required": ["verdict"], "properties": { "verdict": { "const": "continue" } } }, "minContains": 3 } } }, "then": { "required": ["red_team_review"] } } ] }
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cis2042.github.io/ux3-product-design-harness/schemas/human-decision.schema.json", "title": "Product Design Harness Human Decision", "type": "object", "additionalProperties": false, "required": [ "decision_id", "review_id", "decision_type", "decision", "options_considered", "rationale", "accountable_owner", "decided_at", "reversal_conditions" ], "properties": { "decision_id": { "type": "string", "minLength": 1 }, "review_id": { "type": "string", "minLength": 1, "description": "The review_id of the review-result this decision belongs to." }, "decision_type": { "type": "string", "enum": [ "taste", "risk", "strategy", "ethics", "meaning" ] }, "decision": { "type": "string", "minLength": 1 }, "options_considered": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 2 }, "rationale": { "type": "string", "minLength": 1 }, "accountable_owner": { "type": "string", "minLength": 1 }, "decided_at": { "type": "string", "format": "date-time", "pattern": "^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$" }, "reversal_conditions": { "type": "array", "items": { "type": "string" }, "minItems": 1 } } }