// Pair invite, pairwise cohesion, pair development reports.
// PairCohesionScreen uses real scores for participant A via getKalibrScores().
// MOCK_PARTNER remains mock until the partner completes the assessment.
function PairComingSoonBanner() {
return (
Coming soonPairwise reports launch after individual assessments are live. Preview only — interactions disabled.
);
}
function PairInviteScreen({ onEnter }) {
return (
Pair invite
Invite your co-founder, partner, or manager.
When they complete the assessment, you unlock the Pairwise Cohesion Report and the Pair Development Report — with Joint, Private, and Facilitator blocks.
Send invite
Privacy: Neither of you will see the other's individual blind-spot report. You'll see shared dimension scores, complementarity analysis, and the joint facilitator block.
);
}
function PairCohesionScreen({ onEnter }) {
// Use real scores for participant A; MOCK_PARTNER stays until partner completes.
const live = getKalibrScores();
const participantA = live
? { ...MOCK_PARTICIPANT, dimensions: live.dimensions }
: MOCK_PARTICIPANT;
const isLive = !!live;
const pair = computePair(participantA, MOCK_PARTNER);
const aRadar = DIMS.map(d => ({ short: d.label.split(' ').map(w => w[0]).join(''), value: participantA.dimensions[d.id] || 0 }));
const bRadar = DIMS.map(d => ({ short: d.label.split(' ').map(w => w[0]).join(''), value: MOCK_PARTNER.dimensions[d.id] }));
const gapRows = [...pair.rows].sort((a, b) => (b.type === 'similarity' ? b.diff - a.diff : -1) - (a.type === 'similarity' ? a.diff - b.diff : -1));
// Find the two largest-gap dimensions for the risk strip
const riskDims = [...pair.rows].sort((a, b) => b.diff - a.diff).slice(0, 2);
const riskStr = riskDims.map(r => `${r.id} (${r.av} vs ${r.bv})`).join(' and ');
return (
{pair.cohesion >= 70
? 'Strong complementary partnership with potential friction areas in high-gap dimensions.'
: pair.cohesion >= 45
? 'Moderate compatibility with meaningful friction areas that warrant active management.'
: 'Significant friction areas — this pair will need structured processes to work well together.'}
{participantA.name}
{MOCK_PARTNER.name}
Role classification: Peer × Peer. Context: Growth stage.
{/* symmetry risk strip */}
Risk concentration line · You differ most on {riskStr}. Both are silent friction areas in co-founder partnerships: they produce conflict that neither party sees as personality, just "being right."
);
}
function PairDevelopmentScreen() {
const [block, setBlock] = React.useState('joint');
const content = {
joint: {
title: 'What you talk about together',
subtitle: 'For a joint 30-min conversation. Facilitator optional.',
agreements: [
['Decision tempo', "When one of you says 'let's go' and the other says 'let me think', default to a 48-hour clock. Neither of you is wrong — the clock is the contract."],
['Directness lane', 'Both partners can be direct by name. Neither reads the other\'s mode as a personal statement.'],
['Silent friction signal', "If either of you feels the other is moving at the wrong speed three times in a week, that's the signal to calendar a 20-min check-in. Not a fight. A re-sync."],
],
},
private: {
title: 'What each of you reads alone',
subtitle: 'Specific to your profile. Not shared with your partner.',
agreements: [
["For the high-drive partner", "Your partner's deliberation is not resistance. It is the feature that prevents the company from making a reversible mistake that looks irreversible to them. Budget for it in timelines."],
["For the high-drive partner", "Your bondingIndex is reading as transactional. One sentence of relational framing before directive messages closes most of that gap."],
["For the deliberative partner", "Your partner's speed is not impulsiveness. High volatilityVector paired with high temporalOrientation means they're fast because they've already run the long-term model. Ask for the model."],
],
},
facilitator: {
title: 'For your coach or facilitator',
subtitle: 'Classified context — not shown to the pair.',
agreements: [
['Read this first', "Both are peers; neither should default to deferring. Watch for the more directive partner's force dominating air-time even when the other is the domain owner."],
['Dimension to probe live', 'Feedback orientation gap: if large, when critical input comes from the lower-assertiveness partner, the higher-assertiveness one may appear to dismiss before absorbing. Slow the room down for 60 seconds.'],
['Do not disclose', 'Individual blind-spot codes. SD3 adminOnly block. Signature pattern labels.'],
],
},
}[block];
return (
Pair development · Prompt 4
How to work together, starting tomorrow.
Three blocks derived from your pairwise analysis. Joint for the conversation you have together. Private for the one you have with yourself. Facilitator for the one your coach has with both.
Kalibr accepts pre-scored output from eight psychometric instruments. Blend formulas convert your existing subscales into Kalibr's 17 internal scales. All crosswalk-derived scores carry a ±5 point confidence band, surfaced throughout your report.
1 · Select your source instrument
{instruments.map(n => (
))}
2 · Upload scored output
⇪
Drop your {instrument} subscale export
CSV, XLSX, or JSON · up to 500 respondents
Quality flags will apply. A112 (bondingIndex) and A174 (energyResilience) are single-item anchors — when absent, Kalibr substitutes blended means and marks both as APPROXIMATION. Grit, BRCS, and Work Ethic will appear as proxy estimates if not separately supplied. AI preferences cannot be derived from {instrument} — you'll be asked to answer those 25 items directly (~4 min).
);
}
function PairReportScreen({ onEnter }) {
const [tab, setTab] = React.useState('cohesion');
const live = getKalibrScores();
const participantA = live ? { ...MOCK_PARTICIPANT, dimensions: live.dimensions } : MOCK_PARTICIPANT;
const isLive = !!live;
const pair = computePair(participantA, MOCK_PARTNER);
const aRadar = DIMS.map(d => ({ short: d.label.split(' ').map(w => w[0]).join(''), value: participantA.dimensions[d.id] || 0 }));
const bRadar = DIMS.map(d => ({ short: d.label.split(' ').map(w => w[0]).join(''), value: MOCK_PARTNER.dimensions[d.id] }));
const gapRows = [...pair.rows].sort((a, b) => b.diff - a.diff);
const riskDims = [...pair.rows].sort((a, b) => b.diff - a.diff).slice(0, 2);
const riskStr = riskDims.map(r => `${r.id} (${r.av} vs ${r.bv})`).join(' and ');
const [block, setBlock] = React.useState('joint');
const devContent = {
joint: {
title: 'What you talk about together',
subtitle: 'For a joint 30-min conversation. Facilitator optional.',
agreements: [
['Decision tempo', "When one of you says 'let\'s go' and the other says 'let me think', default to a 48-hour clock. Neither of you is wrong — the clock is the contract."],
['Directness lane', "Both partners can be direct by name. Neither reads the other's mode as a personal statement."],
['Silent friction signal', "If either of you feels the other is moving at the wrong speed three times in a week, that's the signal to calendar a 20-min check-in. Not a fight. A re-sync."],
],
},
private: {
title: 'What each of you reads alone',
subtitle: 'Specific to your profile. Not shared with your partner.',
agreements: [
["For the high-drive partner", "Your partner's deliberation is not resistance. It is the feature that prevents the company from making a reversible mistake that looks irreversible to them. Budget for it in timelines."],
["For the high-drive partner", "Your bondingIndex is reading as transactional. One sentence of relational framing before directive messages closes most of that gap."],
["For the deliberative partner", "Your partner's speed is not impulsiveness. High volatilityVector paired with high temporalOrientation means they're fast because they've already run the long-term model. Ask for the model."],
],
},
facilitator: {
title: 'For your coach or facilitator',
subtitle: 'Classified context — not shown to the pair.',
agreements: [
['Read this first', "Both are peers; neither should default to deferring. Watch for the more directive partner's force dominating air-time even when the other is the domain owner."],
['Dimension to probe live', 'Feedback orientation gap: if large, when critical input comes from the lower-assertiveness partner, the higher-assertiveness one may appear to dismiss before absorbing. Slow the room down for 60 seconds.'],
['Do not disclose', 'Individual blind-spot codes. SD3 adminOnly block. Signature pattern labels.'],
],
},
}[block];
return (
{pair.cohesion >= 70 ? 'Strong complementary partnership with potential friction areas in high-gap dimensions.'
: pair.cohesion >= 45 ? 'Moderate compatibility with meaningful friction areas that warrant active management.'
: 'Significant friction areas — this pair will need structured processes to work well together.'}
{participantA.name}
{MOCK_PARTNER.name}
Role: Peer × Peer. Context: Growth stage.
Risk concentration · You differ most on {riskStr}. Both are silent friction areas in co-founder partnerships.
Three blocks derived from your pairwise analysis. Joint for the conversation you have together. Private for the one you have with yourself. Facilitator for your coach.