> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# GitHub on Vortex IQ

> Monitor GitHub health, cost and reliability signals, and catch incidents and runaway spend early.

export const CapabilityPage = ({data}) => {
  const d = data || ({});
  const [tab, setTab] = useState('overview');
  const [sel, setSel] = useState(null);
  const [q, setQ] = useState('');
  const [outcome, setOutcome] = useState('');
  const [status, setStatus] = useState('');
  const [limit, setLimit] = useState(8);
  const monitor = d.monitor || [];
  const audits = d.audits || [];
  const autos = d.autos || [];
  const outcomes = useMemo(() => {
    const s = new Set();
    monitor.forEach(m => s.add(m.o));
    audits.forEach(a => s.add(a.o));
    return [...s].sort();
  }, [monitor, audits]);
  const rows = useMemo(() => {
    const t = q.trim().toLowerCase();
    if (tab === 'monitor') {
      return monitor.filter(m => (!t || (m.n + ' ' + (m.d || '')).toLowerCase().includes(t)) && (!outcome || m.o === outcome));
    }
    if (tab === 'audit') {
      return audits.filter(a => (!t || (a.n + ' ' + (a.why || '')).toLowerCase().includes(t)) && (!outcome || a.o === outcome) && (!status || a.s === status));
    }
    if (tab === 'automate') {
      return autos.filter(w => !t || (w.n + ' ' + (w.d || '')).toLowerCase().includes(t));
    }
    return [];
  }, [tab, q, outcome, status, monitor, audits, autos]);
  const pill = (text, kind) => {
    const tone = kind === 'good' ? {
      color: '#1f9e54',
      borderColor: '#1f9e54',
      background: '#ecf8f110'
    } : kind === 'warn' ? {
      color: '#c07a17',
      borderColor: '#c07a17',
      background: '#fdf6e910'
    } : kind === 'bad' ? {
      color: '#c53527',
      borderColor: '#c53527',
      background: '#fdf0ee10'
    } : kind === 'brand' ? {
      color: '#5529d6',
      borderColor: '#5529d6'
    } : {
      color: 'inherit',
      borderColor: 'currentColor',
      opacity: 0.65
    };
    return <span key={text} style={{
      fontSize: '10.5px',
      fontFamily: 'ui-monospace, monospace',
      border: '1px solid',
      borderRadius: '999px',
      padding: '2px 8px',
      whiteSpace: 'nowrap',
      ...tone
    }}>
        {text}
      </span>;
  };
  const sevKind = s => s === 'critical' ? 'bad' : s === 'high' ? 'warn' : 'muted';
  const fixKind = s => s === 'Prepared fix' ? 'good' : s === 'Candidate remediation' ? 'warn' : 'muted';
  const card = (item, kind) => {
    const title = item.n;
    const badges = kind === 'monitor' ? [pill(item.o, 'brand'), pill(item.a === 'Watch only' || item.a === 'Merchant rule' ? item.a : `Alert ${item.a}`, 'muted')] : kind === 'audit' ? [pill(item.sev, sevKind(item.sev)), pill(item.s, fixKind(item.s))] : [pill(item.role, 'brand'), pill(item.ready, 'good')];
    const body = kind === 'monitor' ? item.nc ? 'Description pending editorial review; the signal is live.' : item.d : kind === 'audit' ? item.why : item.d;
    return <button key={title} onClick={() => setSel({
      kind,
      item
    })} style={{
      display: 'block',
      width: '100%',
      textAlign: 'left',
      border: '1px solid rgba(128,128,128,.28)',
      borderRadius: '10px',
      padding: '12px 14px',
      marginBottom: '8px',
      background: 'transparent',
      cursor: 'pointer',
      font: 'inherit',
      color: 'inherit'
    }}>
        <div style={{
      display: 'flex',
      gap: '10px',
      justifyContent: 'space-between',
      alignItems: 'flex-start',
      flexWrap: 'wrap'
    }}>
          <strong style={{
      fontSize: '14px'
    }}>{title}</strong>
          <span style={{
      display: 'flex',
      gap: '5px',
      flexWrap: 'wrap'
    }}>{badges}</span>
        </div>
        {body ? <div style={{
      fontSize: '12.5px',
      opacity: 0.72,
      marginTop: '4px'
    }}>{body}</div> : null}
      </button>;
  };
  const tabBtn = (id, label) => <button key={id} onClick={() => {
    setTab(id);
    setLimit(8);
    setQ('');
  }} style={{
    border: 0,
    background: 'none',
    font: 'inherit',
    fontWeight: 600,
    fontSize: '14px',
    padding: '9px 14px',
    cursor: 'pointer',
    color: tab === id ? '#5529d6' : 'inherit',
    opacity: tab === id ? 1 : 0.65,
    borderBottom: tab === id ? '2px solid #5529d6' : '2px solid transparent'
  }}>
      {label}
    </button>;
  const inputStyle = {
    border: '1px solid rgba(128,128,128,.3)',
    borderRadius: '999px',
    padding: '7px 13px',
    font: 'inherit',
    fontSize: '13px',
    background: 'transparent',
    color: 'inherit'
  };
  return <div style={{
    position: 'relative'
  }}>
      {}
      <div style={{
    display: 'grid',
    gridTemplateColumns: 'repeat(auto-fit,minmax(120px,1fr))',
    gap: '10px',
    margin: '18px 0'
  }}>
        {(d.stats || []).map(([v, l]) => <div key={l} style={{
    border: '1px solid rgba(128,128,128,.28)',
    borderRadius: '10px',
    padding: '11px 13px'
  }}>
            <div style={{
    fontSize: v.length > 6 ? '15px' : '21px',
    fontWeight: 700,
    letterSpacing: '-.02em',
    color: v.length > 6 ? '#5529d6' : 'inherit'
  }}>{v}</div>
            <div style={{
    fontSize: '11px',
    opacity: 0.66
  }}>{l}</div>
          </div>)}
      </div>

      <div style={{
    display: 'flex',
    gap: '4px',
    borderBottom: '1px solid rgba(128,128,128,.25)',
    marginBottom: '16px',
    flexWrap: 'wrap'
  }}>
        {tabBtn('overview', 'Overview')}
        {tabBtn('monitor', `Monitor (${monitor.length})`)}
        {tabBtn('audit', `Audit (${audits.length})`)}
        {tabBtn('automate', 'Automate')}
      </div>

      {tab === 'overview' && <div>
          <div style={{
    display: 'grid',
    gridTemplateColumns: 'repeat(auto-fit,minmax(240px,1fr))',
    gap: '10px'
  }}>
            {outcomes.map(o => <div key={o} style={{
    border: '1px solid rgba(128,128,128,.28)',
    borderLeft: '3px solid #5529d6',
    borderRadius: '10px',
    padding: '11px 14px'
  }}>
                <strong style={{
    fontSize: '13.5px'
  }}>{o}</strong>
              </div>)}
          </div>
          <p style={{
    fontSize: '13px',
    opacity: 0.75,
    marginTop: '16px'
  }}>
            Every capability follows the same controlled sequence: connect, monitor, detect, recommend,
            approve, execute, verify. Nothing changes a connected system without the approval step.
          </p>
        </div>}

      {tab !== 'overview' && <div>
          <div style={{
    display: 'flex',
    gap: '8px',
    marginBottom: '12px',
    flexWrap: 'wrap'
  }}>
            <input style={{
    ...inputStyle,
    flex: 1,
    minWidth: '170px'
  }} placeholder={`Search ${tab === 'monitor' ? 'signals' : tab === 'audit' ? 'checks' : 'workflows'}...`} value={q} onChange={e => {
    setQ(e.target.value);
    setLimit(8);
  }} />
            {tab !== 'automate' && <select style={inputStyle} value={outcome} onChange={e => {
    setOutcome(e.target.value);
    setLimit(8);
  }}>
                <option value="">All outcomes</option>
                {outcomes.map(o => <option key={o} value={o}>{o}</option>)}
              </select>}
            {tab === 'audit' && <select style={inputStyle} value={status} onChange={e => {
    setStatus(e.target.value);
    setLimit(8);
  }}>
                <option value="">All fix statuses</option>
                <option>Prepared fix</option>
                <option>Candidate remediation</option>
                <option>Report only</option>
              </select>}
          </div>

          {rows.length === 0 && tab === 'automate' && <div style={{
    border: '1px dashed #5529d6',
    borderRadius: '10px',
    padding: '15px'
  }}>
              <strong style={{
    fontSize: '14px'
  }}>Ready to build your first {d.name} workflow</strong>
              <p style={{
    fontSize: '12.5px',
    opacity: 0.75,
    margin: '6px 0 0'
  }}>
                Vortex IQ is integrated with {d.reads} read and {d.writes} write operations on {d.name}.
                Pick a trigger, add them as steps, and every step that changes data pauses for approval.
              </p>
            </div>}
          {rows.length === 0 && tab !== 'automate' && <div style={{
    opacity: 0.6,
    fontSize: '13px'
  }}>Nothing matches this search or filter.</div>}

          {rows.slice(0, limit).map(r => card(r, tab))}

          {rows.length > limit && <button onClick={() => setLimit(rows.length)} style={{
    ...inputStyle,
    display: 'block',
    margin: '10px auto 0',
    cursor: 'pointer'
  }}>
              View all {rows.length}
            </button>}
        </div>}

      {}
      {sel && <>
          <div onClick={() => setSel(null)} style={{
    position: 'fixed',
    inset: 0,
    background: 'rgba(10,6,26,.45)',
    zIndex: 40
  }} />
          <aside style={{
    position: 'fixed',
    top: 0,
    right: 0,
    width: 'min(430px, 94vw)',
    height: '100vh',
    overflowY: 'auto',
    background: 'var(--background, #fff)',
    backgroundColor: 'light-dark(#fff, #0c061f)',
    borderLeft: '1px solid rgba(128,128,128,.3)',
    padding: '20px 22px',
    zIndex: 50
  }}>
            <button onClick={() => setSel(null)} style={{
    float: 'right',
    border: '1px solid rgba(128,128,128,.3)',
    background: 'transparent',
    color: 'inherit',
    borderRadius: '999px',
    width: '30px',
    height: '30px',
    cursor: 'pointer'
  }}>
              ×
            </button>
            <DetailBody sel={sel} d={d} pill={pill} sevKind={sevKind} fixKind={fixKind} />
          </aside>
        </>}
    </div>;
};

Monitor GitHub health, cost and reliability signals, and catch incidents and runaway spend early.

No changes are made without the configured approval policy. Read-only operations do not modify the connected system; schedules, access scopes, API usage and data handling remain governed by Vortex IQ controls.

[Connect or manage this source](https://app.vortexiq.ai/workbench/settings/sources) · [How connecting works](/integrations/connector-catalogue) · [Create a workflow](https://app.vortexiq.ai/workbench/flows/create?connector=github)

<CapabilityPage data={{"name": "GitHub", "reads": 637, "writes": 584, "stats": [["20", "performance signals"], ["3", "automated checks"], ["0", "prepared fixes"], ["35", "proven workflows"], ["1,221", "API operations"]], "resRows": [{"n": "gists", "r": 3, "w": 3}, {"n": "repoissuecomments", "r": 3, "w": 3}, {"n": "repopullcomments", "r": 3, "w": 3}, {"n": "userfollowings", "r": 4, "w": 2}, {"n": "userpackages", "r": 4, "w": 2}, {"n": "userpackageversions", "r": 4, "w": 2}, {"n": "enterpriscodesecurityconfigurations", "r": 2, "w": 3}, {"n": "enterpristeams", "r": 2, "w": 3}], "opsPhrase": "over 13,000", "connPhrase": "more than 200", "monitor": [{"n": "CI Pass Rate (30d)", "o": "Run operations", "a": "95 / 80", "d": "workflow_runs with conclusion=success / all completed runs (conclusion not null) created within 30d, x100, across the top 10 repos.", "nc": false}, {"n": "Commits (30d)", "o": "Grow revenue", "a": "0 / -50", "d": "Count of commits from /repos/{owner}/{repo}/commits (author date within 30d) summed across the top 10 repos; change_pct vs the prior 30d drives vc_deploy_cadence.", "nc": false}, {"n": "Median Open PR Age", "o": "Run operations", "a": "3 / 14", "d": "Median of (now - created_at) in days across all open PRs; drives vc_pr_age_days (lower is better).", "nc": false}, {"n": "Active Repos (30d)", "o": "Run operations", "a": "Watch only", "d": "Count of repos with pushed_at within the last 30d and archived=false.", "nc": false}, {"n": "Avg Commits / Active Repo (30d)", "o": "Run operations", "a": "Watch only", "d": "30d commit count / active-repos-30d; concentration of delivery across the fleet.", "nc": false}, {"n": "Daily Commits Trend", "o": "Control risk and change", "a": "Watch only", "d": "Commits grouped by day over the last 30d (author date), summed across the top 10 repos.", "nc": false}, {"n": "Deploy Cadence Trend", "o": "Grow revenue", "a": "0 / -50", "d": "Daily count of delivery events (commits + releases) over 30d; value = 30d total, change_pct vs the prior 30d drives vc_deploy_cadence.", "nc": false}, {"n": "Deploy Stall Alert", "o": "Grow revenue", "a": "0 / -50", "d": "Delivery-event (commits + releases) change_pct vs the prior 30d; fires on a stall per the vc_deploy_cadence band.", "nc": false}, {"n": "Languages by Repo Count", "o": "Run operations", "a": "Watch only", "d": "Repos grouped by their primary language field (nulls skipped), top 10 by count.", "nc": false}, {"n": "Merged PRs (30d)", "o": "Run operations", "a": "Watch only", "d": "Count of closed PRs with merged_at within the last 30d (state=closed&sort=updated) across the top 10 repos.", "nc": false}, {"n": "Most Active Repo (30d)", "o": "Run operations", "a": "Watch only", "d": "The repo with the most commits in the last 30d; value = commit count, detail = repo full_name.", "nc": false}, {"n": "Open Issues", "o": "Control risk and change", "a": "Watch only", "d": "Sum of open_issues_count across all repos (the field counts issues plus open PRs per the REST API).", "nc": false}, {"n": "Open Pull Requests", "o": "Run operations", "a": "Watch only", "d": "Count of open PRs from /repos/{owner}/{repo}/pulls?state=open across the top 10 repos.", "nc": false}, {"n": "PR Age Alert", "o": "Run operations", "a": "3 / 14", "d": "Median open-PR age in days; fires when it crosses the vc_pr_age_days band (bad at \u003e14d).", "nc": false}, {"n": "Pipeline Health Score", "o": "Grow revenue", "a": "90 / 70", "d": "0-100 composite = 0.4 x CI pass rate + 0.3 x PR-age score (100 at \u003c=3d, 0 at \u003e=14d) + 0.3 x deploy-cadence score (100 + cadence change_pct, clamped 0-100).", "nc": false}, {"n": "Releases (30d)", "o": "Run operations", "a": "Watch only", "d": "Count of releases with published_at within the last 30d from /repos/{owner}/{repo}/releases across the top 10 repos.", "nc": false}, {"n": "Repositories", "o": "Run operations", "a": "Watch only", "d": "Count of repos returned by /user/repos (affiliation=owner,organization_member).", "nc": false}, {"n": "Stale PRs (\u003e14d)", "o": "Run operations", "a": "Watch only", "d": "Count of open PRs whose age (now - created_at) exceeds 14 days.", "nc": false}, {"n": "Total Stars", "o": "Run operations", "a": "Watch only", "d": "Sum of stargazers_count across all repos.", "nc": false}, {"n": "Workflow Runs (30d)", "o": "Run operations", "a": "Watch only", "d": "Count of Actions workflow_runs created within the last 30d across the top 10 repos.", "nc": false}], "audits": [{"n": "CI pass rate below 80%", "o": "Run operations", "sev": "high", "s": "Report only", "why": "More than 1 in 5 CI runs is failing. At this rate, a genuinely broken change is more likely to slip through unnoticed (lost in the normal noise of failures) and developers waste time re-running or diagnosing failures that have nothing to do with their own change, slowing the whole team down.", "codes": ["VC-CI-001"]}, {"n": "Delivery cadence dropped more than 50% vs the prior period", "o": "Grow revenue", "sev": "medium", "s": "Report only", "why": "Deploys or merges have dropped by more than half compared to the prior period. That usually means fixes and improvements, including fixes for issues this same audit has flagged elsewhere, are not shipping, which slows the whole team's ability to respond to anything urgent.", "codes": ["VC-CADENCE-001"]}, {"n": "Median open pull-request age above 14 days", "o": "Run operations", "sev": "medium", "s": "Report only", "why": "Half of open pull requests have been waiting more than two weeks. Work that is done but not merged is not delivering any value yet, and the longer a PR sits open, the more it tends to drift from the main branch, making it harder to merge later than it would have been today.", "codes": ["VC-PR-001"]}], "autos": [{"n": "API Contract Drift Watch", "role": "Developer", "d": "detects connector or internal schema changes before production failure.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Actionable Incident Triage", "role": "Developer", "d": "correlates errors, deploys and affected journeys and opens a pre-filled engineering ticket.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Connector Auth Failure Triage", "role": "Developer", "d": "distinguishes expiry, scope, rate limit and upstream outage causes.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Dependency Risk Queue", "role": "Developer", "d": "surfaces relevant security/end-of-life updates with compatibility and test guidance.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Failed Job Replay Assistant", "role": "Developer", "d": "diagnoses and safely retries idempotent work while escalating unsafe cases.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Flaky Test Investigator", "role": "Developer", "d": "clusters intermittent failures and ranks likely ownership and root cause.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "PR Risk Summary", "role": "Developer", "d": "reports affected services, missing tests, operational risk and required approvers.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Performance Regression Bisect", "role": "Developer", "d": "correlates release changes with latency and frontend performance shifts.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Safe Fix Branch", "role": "Developer", "d": "creates a scoped branch/PR with evidence, tests and rollback notes for an approved issue.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Technical SEO Ticket Builder", "role": "Developer", "d": "translates crawl/indexation evidence into reproducible developer work.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro"]}, {"n": "Auto-apply Guardrail Approval", "role": "Security manager", "d": "requires security sign-off when an automation gains broader write authority.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Blocked Work Escalator", "role": "Engineering manager", "d": "detects ageing PRs/tickets and identifies the missing decision or dependency.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Change Failure Rate Watch", "role": "Engineering manager", "d": "tracks failed deploys and highlights teams/services with worsening patterns.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Cloud Exposure Watch", "role": "Security manager", "d": "detects risky DNS, firewall, storage or edge configuration changes.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Connector Access Review", "role": "Security manager", "d": "inventories credentials, scopes, owners, use and age; routes unnecessary access for revocation.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Engineering Dependency Watch", "role": "Engineering manager", "d": "tracks vulnerable, unsupported or risky platform dependencies.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Executive Technology Pack", "role": "Engineering manager", "d": "translates technical risk and delivery evidence into commercial impact.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Incident Containment Pack", "role": "Security manager", "d": "prepares reversible, scoped containment actions for human approval.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Incident Learning Loop", "role": "Engineering manager", "d": "creates the timeline, contributing factors, actions and follow-up ownership.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Monthly Security Evidence Pack", "role": "Security manager", "d": "retains what changed, who approved it, results and rollback availability.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Privilege Drift Monitor", "role": "Security manager", "d": "alerts when repository, cloud or connector permissions exceed policy.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Release Risk Gate", "role": "Engineering manager", "d": "scores change size, test evidence, service health and rollback readiness before approval.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Rollback Audit", "role": "Engineering manager", "d": "verifies that rollbacks completed and downstream state returned to expected values.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Suspicious Change Correlator", "role": "Security manager", "d": "links identity, code, infrastructure and automation audit events.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Third-party Integration Risk Review", "role": "Security manager", "d": "assesses new connectors before activation and on material permission change.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Vulnerability Remediation Queue", "role": "Security manager", "d": "ranks findings by exploitability, exposure and affected revenue paths.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Cloudflare", "StagingPro", "Jira Cloud", "Microsoft Teams"]}, {"n": "Weekly Delivery and Reliability Brief", "role": "Engineering manager", "d": "combines throughput, failed changes, incidents, rollbacks and ageing work.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["Jira Cloud", "Cloudflare", "StagingPro", "Microsoft Teams"]}, {"n": "Accessibility Regression Sweep", "role": "Web / digital product manager", "d": "monitors high-value templates for newly introduced violations.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}, {"n": "Broken Experience Prioritiser", "role": "Web / digital product manager", "d": "combines errors, traffic and revenue impact into a ranked product backlog.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}, {"n": "Conversion Journey Sentinel", "role": "Web / digital product manager", "d": "repeatedly tests priority journeys and captures actionable failure evidence.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}, {"n": "Core Web Performance Guard", "role": "Web / digital product manager", "d": "detects page/template regressions and routes them to the owning team.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}, {"n": "Post-release Regression Watch", "role": "Web / digital product manager", "d": "compares critical KPIs and technical signals before/after deploy.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}, {"n": "Release Readiness Gate", "role": "Web / digital product manager", "d": "checks staging journeys, accessibility, analytics, SEO, performance and rollback readiness.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}, {"n": "Rollback Recommendation Pack", "role": "Web / digital product manager", "d": "assembles evidence and prepares a reversible action when guardrails fail.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}, {"n": "Third-party Script Risk Watch", "role": "Web / digital product manager", "d": "flags new, slow, failing or unapproved scripts and tags.", "ready": "Ready to test", "also": ["Azure DevOps", "Bitbucket", "GitLab"], "tested": ["StagingPro", "Cloudflare", "Jira Cloud", "BigCommerce", "Shopify"]}], "inValidation": 5}} />
