Develop worthwhile products, challenge existing ideas and experiences, or advise builders on product, leadership, team, business, and career decisions using contextual principles from Tony Fadell's Build.
npx skills add Reactive-Skills/skills --skill build-advisornpx -y @reactive-skills/axi invoke build-advisor22
Hierarchical nodes
INIT
Bootstrap entrypoint
0
Whitelisted for safety
2
Automated projections
Visual state machine topology parsed directly from the official STATECHART.md in Reactive-Skills/skills:
Each state is an isolated operational slice. Transitions occur only when typed signals satisfy programmatic guard conditions.
Select a compatible runtime
Outgoing Transitions
payload.compatible === true && payload.contextUpdates?.selected_runtime?.compatible === true && payload.contextUpdates.selected_runtime.parent_dispatch_verified === truepayload.compatible === falseShared situation and evidence; global changes bubble from any route
Outgoing Transitions
["develop","challenge","advise"].includes(payload.contextUpdates?.route) && typeof payload.reason === "string" && payload.reason.trim().length > 0Number.isInteger(payload.contextUpdates?.basis_version) && payload.contextUpdates.basis_version === context.basis_version + 1 && typeof payload.reason === "string" && payload.reason.trim().length > 0typeof payload.reason === "string" && payload.reason.trim().length > 0Capture the decision question, stage, constraints, evidence, and requested route
Outgoing Transitions
payload.contextUpdates?.route === "develop" && payload.contextUpdates?.situation != null && typeof payload.contextUpdates.situation.question === "string" && payload.contextUpdates.situation.question.trim().length > 0 && ["product","leadership","business","team","career"].includes(payload.contextUpdates.situation.domain) && typeof payload.contextUpdates.situation.stage === "string" && payload.contextUpdates.situation.stage.trim().length > 0 && typeof payload.contextUpdates.situation.decision_owner === "string" && payload.contextUpdates.situation.decision_owner.trim().length > 0 && Array.isArray(payload.contextUpdates.situation.constraints) && Array.isArray(payload.contextUpdates.evidence) && payload.contextUpdates.evidence.every(e => e && typeof e.id === "string" && e.id.trim().length > 0 && typeof e.claim === "string" && e.claim.trim().length > 0 && ["observed","interpretation","assumption","conviction"].includes(e.kind) && typeof e.source === "string" && e.source.trim().length > 0)payload.contextUpdates?.route === "challenge" && payload.contextUpdates?.situation != null && typeof payload.contextUpdates.situation.question === "string" && payload.contextUpdates.situation.question.trim().length > 0 && ["product","leadership","business","team","career"].includes(payload.contextUpdates.situation.domain) && typeof payload.contextUpdates.situation.stage === "string" && payload.contextUpdates.situation.stage.trim().length > 0 && typeof payload.contextUpdates.situation.decision_owner === "string" && payload.contextUpdates.situation.decision_owner.trim().length > 0 && Array.isArray(payload.contextUpdates.situation.constraints) && Array.isArray(payload.contextUpdates.evidence) && payload.contextUpdates.evidence.every(e => e && typeof e.id === "string" && e.id.trim().length > 0 && typeof e.claim === "string" && e.claim.trim().length > 0 && ["observed","interpretation","assumption","conviction"].includes(e.kind) && typeof e.source === "string" && e.source.trim().length > 0)payload.contextUpdates?.route === "advise" && payload.contextUpdates?.situation != null && typeof payload.contextUpdates.situation.question === "string" && payload.contextUpdates.situation.question.trim().length > 0 && ["product","leadership","business","team","career"].includes(payload.contextUpdates.situation.domain) && typeof payload.contextUpdates.situation.stage === "string" && payload.contextUpdates.situation.stage.trim().length > 0 && typeof payload.contextUpdates.situation.decision_owner === "string" && payload.contextUpdates.situation.decision_owner.trim().length > 0 && Array.isArray(payload.contextUpdates.situation.constraints) && Array.isArray(payload.contextUpdates.evidence) && payload.contextUpdates.evidence.every(e => e && typeof e.id === "string" && e.id.trim().length > 0 && typeof e.claim === "string" && e.claim.trim().length > 0 && ["observed","interpretation","assumption","conviction"].includes(e.kind) && typeof e.source === "string" && e.source.trim().length > 0)Make a worthwhile direction and prototype the whole customer experience
Outgoing Transitions
typeof payload.reason === "string" && payload.reason.trim().length > 0Frame recurring customer pain and existing alternatives
Outgoing Transitions
payload.contextUpdates?.problem?.basis_version === context.basis_version && typeof payload.contextUpdates.problem.customer === "string" && payload.contextUpdates.problem.customer.trim().length > 0 && typeof payload.contextUpdates.problem.pain === "string" && payload.contextUpdates.problem.pain.trim().length > 0 && typeof payload.contextUpdates.problem.why_now === "string" && payload.contextUpdates.problem.why_now.trim().length > 0 && Array.isArray(payload.contextUpdates.problem.alternatives) && payload.contextUpdates.problem.alternatives.length > 0Explain why the product should exist and what it promises
Outgoing Transitions
payload.contextUpdates?.story?.basis_version === context.basis_version && typeof payload.contextUpdates.story.narrative === "string" && payload.contextUpdates.story.narrative.trim().length > 0 && typeof payload.contextUpdates.story.promise === "string" && payload.contextUpdates.story.promise.trim().length > 0 && Array.isArray(payload.contextUpdates.story.claims)Map and prototype every applicable journey stage
Outgoing Transitions
payload.contextUpdates?.experience?.basis_version === context.basis_version && Array.isArray(payload.contextUpdates.experience.touchpoints) && ["discovery","evaluation","acquisition","onboarding","use","support","retention","exit"].every(stage => payload.contextUpdates.experience.touchpoints.some(t => t?.stage === stage && ["mapped","needs_test","not_applicable"].includes(t.status) && typeof t.detail === "string" && t.detail.trim().length > 0))typeof payload.reason === "string" && payload.reason.trim().length > 0Define constraints, experiments, launch readiness, and later learning
Outgoing Transitions
payload.contextUpdates?.learning_plan?.basis_version === context.basis_version && Array.isArray(payload.contextUpdates.learning_plan.experiments) && Array.isArray(payload.contextUpdates.learning_plan.milestones) && payload.contextUpdates.learning_plan.milestones.length > 0 && typeof payload.contextUpdates.learning_plan.launch_criteria === "string" && payload.contextUpdates.learning_plan.launch_criteria.trim().length > 0 && typeof payload.contextUpdates.learning_plan.next_generation === "string" && payload.contextUpdates.learning_plan.next_generation.trim().length > 0 && payload.contextUpdates?.recommendation?.basis_version === context.basis_version && payload.contextUpdates.recommendation.route === context.route && ["proceed","revise","investigate","defer","stop"].includes(payload.contextUpdates.recommendation.direction) && typeof payload.contextUpdates.recommendation.rationale === "string" && payload.contextUpdates.recommendation.rationale.trim().length > 0 && Array.isArray(payload.contextUpdates.recommendation.limitations)Stress-test an existing proposal without inventing defects
Outgoing Transitions
typeof payload.reason === "string" && payload.reason.trim().length > 0Inspect the actual proposal or experience and its promises
Outgoing Transitions
payload.contextUpdates?.assessment?.basis_version === context.basis_version && typeof payload.contextUpdates.assessment.artifact === "string" && payload.contextUpdates.assessment.artifact.trim().length > 0 && typeof payload.contextUpdates.assessment.summary === "string" && payload.contextUpdates.assessment.summary.trim().length > 0 && Array.isArray(payload.contextUpdates.assessment.findings)Design bounded tests for consequential unknowns
Outgoing Transitions
payload.contextUpdates?.uncertainty_plan?.basis_version === context.basis_version && Array.isArray(payload.contextUpdates.uncertainty_plan.tests) && (payload.contextUpdates.uncertainty_plan.tests.length > 0 || (typeof payload.contextUpdates.uncertainty_plan.no_test_reason === "string" && payload.contextUpdates.uncertainty_plan.no_test_reason.trim().length > 0)) && payload.contextUpdates.uncertainty_plan.tests.every(t => t && typeof t.question === "string" && t.question.trim().length > 0 && typeof t.method === "string" && t.method.trim().length > 0 && typeof t.measure === "string" && t.measure.trim().length > 0 && typeof t.deadline === "string" && t.deadline.trim().length > 0 && ["planned","observed"].includes(t.status) && Array.isArray(t.evidence_refs) && (t.status === "planned" || (t.evidence_refs.length > 0 && t.evidence_refs.every(id => context.evidence.some(e => e.id === id && e.kind === "observed")))))Recommend pursue, revise, investigate, defer, or stop with uncertainty
Outgoing Transitions
payload.contextUpdates?.recommendation?.basis_version === context.basis_version && payload.contextUpdates.recommendation.route === context.route && ["proceed","revise","investigate","defer","stop"].includes(payload.contextUpdates.recommendation.direction) && typeof payload.contextUpdates.recommendation.rationale === "string" && payload.contextUpdates.recommendation.rationale.trim().length > 0 && Array.isArray(payload.contextUpdates.recommendation.limitations)Diagnose a concrete builder decision and compare tradeoffs
Outgoing Transitions
typeof payload.reason === "string" && payload.reason.trim().length > 0Identify the underlying builder decision and relevant principles
Outgoing Transitions
payload.contextUpdates?.diagnosis?.basis_version === context.basis_version && typeof payload.contextUpdates.diagnosis.issue === "string" && payload.contextUpdates.diagnosis.issue.trim().length > 0 && typeof payload.contextUpdates.diagnosis.decision_type === "string" && payload.contextUpdates.diagnosis.decision_type.trim().length > 0 && Array.isArray(payload.contextUpdates.diagnosis.principles) && payload.contextUpdates.diagnosis.principles.length > 0Compare feasible options and their consequences
Outgoing Transitions
payload.contextUpdates?.options?.basis_version === context.basis_version && Array.isArray(payload.contextUpdates.options.choices) && payload.contextUpdates.options.choices.length >= 2 && payload.contextUpdates.options.choices.every(o => o && typeof o.choice === "string" && o.choice.trim().length > 0 && typeof o.consequences === "string" && o.consequences.trim().length > 0)Recommend a direction, responsible owner, and communication
Outgoing Transitions
payload.contextUpdates?.recommendation?.basis_version === context.basis_version && payload.contextUpdates.recommendation.route === context.route && ["proceed","revise","investigate","defer","stop"].includes(payload.contextUpdates.recommendation.direction) && typeof payload.contextUpdates.recommendation.rationale === "string" && payload.contextUpdates.recommendation.rationale.trim().length > 0 && Array.isArray(payload.contextUpdates.recommendation.limitations)Present the recommendation and obtain an explicit human decision
Outgoing Transitions
payload.approved === true && typeof payload.approval_source === "string" && payload.approval_source.trim().length > 0 && payload.contextUpdates?.decision?.basis_version === context.basis_version && context.recommendation?.basis_version === context.basis_version && context.recommendation?.route === context.route && ["proceed","revise","investigate","defer","stop"].includes(payload.contextUpdates.decision.direction) && typeof payload.contextUpdates.decision.rationale === "string" && payload.contextUpdates.decision.rationale.trim().length > 0 && typeof payload.contextUpdates.decision.owner === "string" && payload.contextUpdates.decision.owner.trim().length > 0typeof payload.feedback === "string" && payload.feedback.trim().length > 0Assign the next action and define when to revisit the decision
Outgoing Transitions
payload.contextUpdates?.action?.basis_version === context.basis_version && typeof payload.contextUpdates.action.owner === "string" && payload.contextUpdates.action.owner.trim().length > 0 && typeof payload.contextUpdates.action.next_step === "string" && payload.contextUpdates.action.next_step.trim().length > 0 && typeof payload.contextUpdates.action.review_trigger === "string" && payload.contextUpdates.action.review_trigger.trim().length > 0 && context.decision?.basis_version === context.basis_version && ["experiment","review"].includes(payload.contextUpdates.action.type)payload.contextUpdates?.action?.basis_version === context.basis_version && typeof payload.contextUpdates.action.owner === "string" && payload.contextUpdates.action.owner.trim().length > 0 && typeof payload.contextUpdates.action.next_step === "string" && payload.contextUpdates.action.next_step.trim().length > 0 && typeof payload.contextUpdates.action.review_trigger === "string" && payload.contextUpdates.action.review_trigger.trim().length > 0 && context.decision?.basis_version === context.basis_version && ["handoff","stop"].includes(payload.contextUpdates.action.type) && payload.handoff_delivered === trueWait for actual external results without manufacturing progress
Outgoing Transitions
Number.isInteger(payload.contextUpdates?.basis_version) && payload.contextUpdates.basis_version === context.basis_version + 1 && Array.isArray(payload.contextUpdates.evidence) && Array.isArray(payload.result_refs) && payload.result_refs.length > 0 && payload.result_refs.every(id => payload.contextUpdates.evidence.some(e => e?.id === id && e.kind === "observed" && typeof e.claim === "string" && e.claim.trim().length > 0 && typeof e.source === "string" && e.source.trim().length > 0) && !context.evidence.some(e => e.id === id))Decision and handoff delivered
User cancelled this advisory run
Stop and recover when runtime compatibility or signal contract fails
Inspect or drive this state machine directly via the token-efficient AXI CLI:
Check state:
Inspect hierarchy:
Tail events:
Runtime variables persisted across state transitions:
selected_runtimebasis_versionroutesituationevidenceproblemstoryexperiencelearning_planassessmentuncertainty_plandiagnosisoptionsrecommendationdecisionactionRead models automatically rendered upon transition:
Add to your Claude Desktop, Cursor, or VS Code settings:
{
"mcpServers": {
"reactive-skills": {
"command": "npx",
"args": [
"-y",
"@reactive-skills/axi",
"mcp"
]
}
}
}