[{"data":1,"prerenderedAt":1304},["ShallowReactive",2],{"navigation":3,"external-navigation":214,"docs:\u002Feos\u002Fharbourmaster\u002Freference\u002Freview-behavior":443},[4,8,201],{"title":5,"path":6,"stem":7},"Documentation","\u002F","README",{"title":9,"path":10,"stem":11,"children":12},"EOS","\u002Feos","eos\u002FREADME",[13,44,121,181],{"title":14,"collapsed":15,"path":16,"stem":17,"children":18,"page":43},"Adrs",true,"\u002Feos\u002Fadrs","eos\u002Fadrs",[19,23,27,31,35,39],{"title":20,"path":21,"stem":22},"Use Turborepo for the EOS monorepo","\u002Feos\u002Fadrs\u002F0001-use-turborepo-for-eos","eos\u002Fadrs\u002F0001-use-turborepo-for-eos",{"title":24,"path":25,"stem":26},"Use Oxc for linting and formatting","\u002Feos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting","eos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting",{"title":28,"path":29,"stem":30},"Lint Markdown and validate links in CI","\u002Feos\u002Fadrs\u002F0004-lint-markdown-in-ci","eos\u002Fadrs\u002F0004-lint-markdown-in-ci",{"title":32,"path":33,"stem":34},"Use Lefthook for repository-managed Git hooks","\u002Feos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks","eos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks",{"title":36,"path":37,"stem":38},"Use Commitlint's conventional configuration","\u002Feos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration","eos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration",{"title":40,"path":41,"stem":42},"Use Nx for EOS task execution","\u002Feos\u002Fadrs\u002F0007-use-nx-for-eos","eos\u002Fadrs\u002F0007-use-nx-for-eos",false,{"title":45,"path":46,"stem":47,"children":48},"Harbourmaster","\u002Feos\u002Fharbourmaster","eos\u002Fharbourmaster\u002FREADME",[49,58,71,96],{"title":50,"path":51,"stem":52,"children":53,"page":43},"Decisions","\u002Feos\u002Fharbourmaster\u002Fdecisions","eos\u002Fharbourmaster\u002Fdecisions",[54],{"title":55,"path":56,"stem":57},"AI-50: GitHub auth and fork pull request policy","\u002Feos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy","eos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy",{"title":59,"path":60,"stem":61,"children":62,"page":43},"Explanation","\u002Feos\u002Fharbourmaster\u002Fexplanation","eos\u002Fharbourmaster\u002Fexplanation",[63,67],{"title":64,"path":65,"stem":66},"The Harbourmaster review pipeline","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline","eos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline",{"title":68,"path":69,"stem":70},"The Harbourmaster shared-action trust boundary","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary","eos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary",{"title":72,"path":73,"stem":74,"children":75,"page":43},"How To","\u002Feos\u002Fharbourmaster\u002Fhow-to","eos\u002Fharbourmaster\u002Fhow-to",[76,80,84,88,92],{"title":77,"path":78,"stem":79},"How to add Harbourmaster reviews to a repository","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository","eos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository",{"title":81,"path":82,"stem":83},"How to build a pilot dashboard","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard","eos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard",{"title":85,"path":86,"stem":87},"How to configure model routing","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing","eos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing",{"title":89,"path":90,"stem":91},"How to request a Harbourmaster review","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review",{"title":93,"path":94,"stem":95},"How to diagnose a Harbourmaster review failure","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review",{"title":97,"path":98,"stem":99,"children":100,"page":43},"Reference","\u002Feos\u002Fharbourmaster\u002Freference","eos\u002Fharbourmaster\u002Freference",[101,105,109,113,117],{"title":102,"path":103,"stem":104},"Harbourmaster command-line interface","\u002Feos\u002Fharbourmaster\u002Freference\u002Fcli","eos\u002Fharbourmaster\u002Freference\u002Fcli",{"title":106,"path":107,"stem":108},"Harbourmaster configuration","\u002Feos\u002Fharbourmaster\u002Freference\u002Fconfiguration","eos\u002Fharbourmaster\u002Freference\u002Fconfiguration",{"title":110,"path":111,"stem":112},"Harbourmaster GitHub Action","\u002Feos\u002Fharbourmaster\u002Freference\u002Fgithub-action","eos\u002Fharbourmaster\u002Freference\u002Fgithub-action",{"title":114,"path":115,"stem":116},"Harbourmaster review behavior","\u002Feos\u002Fharbourmaster\u002Freference\u002Freview-behavior","eos\u002Fharbourmaster\u002Freference\u002Freview-behavior",{"title":118,"path":119,"stem":120},"Harbourmaster telemetry","\u002Feos\u002Fharbourmaster\u002Freference\u002Ftelemetry","eos\u002Fharbourmaster\u002Freference\u002Ftelemetry",{"title":72,"path":122,"stem":123,"children":124,"page":43},"\u002Feos\u002Fhow-to","eos\u002Fhow-to",[125,129,133,137,141,145,149,153,157,161,165,169,173,177],{"title":126,"path":127,"stem":128},"How to add an external documentation source","\u002Feos\u002Fhow-to\u002Fadd-external-documentation-source","eos\u002Fhow-to\u002Fadd-external-documentation-source",{"title":130,"path":131,"stem":132},"How to connect SDLC integrations","\u002Feos\u002Fhow-to\u002Fconnect-sdlc-integrations","eos\u002Fhow-to\u002Fconnect-sdlc-integrations",{"title":134,"path":135,"stem":136},"How to consume the EOS plugin marketplace","\u002Feos\u002Fhow-to\u002Fconsume-eos-marketplace","eos\u002Fhow-to\u002Fconsume-eos-marketplace",{"title":138,"path":139,"stem":140},"How to create a spike ticket","\u002Feos\u002Fhow-to\u002Fcreate-spike-ticket","eos\u002Fhow-to\u002Fcreate-spike-ticket",{"title":142,"path":143,"stem":144},"How to finalise a repository change","\u002Feos\u002Fhow-to\u002Ffinalise-change","eos\u002Fhow-to\u002Ffinalise-change",{"title":146,"path":147,"stem":148},"How to install the EOS Docs MCP server","\u002Feos\u002Fhow-to\u002Finstall-eos-docs-mcp","eos\u002Fhow-to\u002Finstall-eos-docs-mcp",{"title":150,"path":151,"stem":152},"How to resolve a spike ticket","\u002Feos\u002Fhow-to\u002Fresolve-spike-ticket","eos\u002Fhow-to\u002Fresolve-spike-ticket",{"title":154,"path":155,"stem":156},"How to run Git hook checks","\u002Feos\u002Fhow-to\u002Frun-git-hook-checks","eos\u002Fhow-to\u002Frun-git-hook-checks",{"title":158,"path":159,"stem":160},"How to use the AI-enabled SDLC","\u002Feos\u002Fhow-to\u002Fuse-ai-enabled-sdlc","eos\u002Fhow-to\u002Fuse-ai-enabled-sdlc",{"title":162,"path":163,"stem":164},"Use the Aikido plugin","\u002Feos\u002Fhow-to\u002Fuse-aikido-plugin","eos\u002Fhow-to\u002Fuse-aikido-plugin",{"title":166,"path":167,"stem":168},"How to use Compass","\u002Feos\u002Fhow-to\u002Fuse-compass","eos\u002Fhow-to\u002Fuse-compass",{"title":170,"path":171,"stem":172},"How to use Fallow","\u002Feos\u002Fhow-to\u002Fuse-fallow","eos\u002Fhow-to\u002Fuse-fallow",{"title":174,"path":175,"stem":176},"How to use incremental mutation tests","\u002Feos\u002Fhow-to\u002Fuse-incremental-mutation-tests","eos\u002Fhow-to\u002Fuse-incremental-mutation-tests",{"title":178,"path":179,"stem":180},"How to use Scout","\u002Feos\u002Fhow-to\u002Fuse-scout","eos\u002Fhow-to\u002Fuse-scout",{"title":97,"path":182,"stem":183,"children":184,"page":43},"\u002Feos\u002Freference","eos\u002Freference",[185,189,193,197],{"title":186,"path":187,"stem":188},"Compass CLI","\u002Feos\u002Freference\u002Fcompass-cli","eos\u002Freference\u002Fcompass-cli",{"title":190,"path":191,"stem":192},"EOS marketplace skills","\u002Feos\u002Freference\u002Fmarketplace-skills","eos\u002Freference\u002Fmarketplace-skills",{"title":194,"path":195,"stem":196},"Nx task execution and cache","\u002Feos\u002Freference\u002Fnx-task-execution","eos\u002Freference\u002Fnx-task-execution",{"title":198,"path":199,"stem":200},"Scout CLI","\u002Feos\u002Freference\u002Fscout-cli","eos\u002Freference\u002Fscout-cli",{"title":202,"path":203,"stem":204,"children":205},"Product engineering","\u002Fproduct-engineering","product-engineering\u002FREADME",[206],{"title":14,"collapsed":15,"path":207,"stem":208,"children":209,"page":43},"\u002Fproduct-engineering\u002Fadrs","product-engineering\u002Fadrs",[210],{"title":211,"path":212,"stem":213},"Codify Engineering Standards as Skills","\u002Fproduct-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills","product-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills",[215,268],{"nav":216,"source":265},[217],{"title":218,"path":219,"stem":220,"children":221},"Ember","\u002Fember","ember",[222,225,257,261],{"title":223,"path":219,"stem":224},"StoreFront Documentation","ember\u002Findex",{"title":14,"path":226,"stem":227,"children":228,"page":43},"\u002Fember\u002Fadrs","ember\u002Fadrs",[229,233,237,241,245,249,253],{"title":230,"path":231,"stem":232},"Add Infection as a non-blocking mutation testing tool for Ember","\u002Fember\u002Fadrs\u002F0001-infection-mutation-testing","ember\u002Fadrs\u002F0001-infection-mutation-testing",{"title":234,"path":235,"stem":236},"Process DELETE scheduled changes before CREATE_UPDATE at the same instant","\u002Fember\u002Fadrs\u002F0002-scheduled-change-processing-order","ember\u002Fadrs\u002F0002-scheduled-change-processing-order",{"title":238,"path":239,"stem":240},"Standard rate scheduling is permanent until overridden","\u002Fember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent","ember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent",{"title":242,"path":243,"stem":244},"Promotions require an existing standard rate","\u002Fember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate","ember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate",{"title":246,"path":247,"stem":248},"UTC datetime contract between Storefront and Hub","\u002Fember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub","ember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub",{"title":250,"path":251,"stem":252},"Elapsed unprocessed scheduled changes do not block rate changes","\u002Fember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes","ember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes",{"title":254,"path":255,"stem":256},"ADR-0007: Delete ConfigureTenantAuth routing command once OIDC setup migrates to Hub","\u002Fember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command","ember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command",{"title":258,"path":259,"stem":260},"Domain Overview","\u002Fember\u002Fdomain_overview","ember\u002Fdomain_overview",{"title":262,"path":263,"stem":264},"Main Flows","\u002Fember\u002Fkey_flows","ember\u002Fkey_flows",{"collectionName":266,"label":267,"prefix":220},"external_ember","StoreFront (Ember)",{"nav":269,"source":441},[270],{"title":271,"path":272,"stem":273,"children":274},"Core","\u002Fcore","core",[275,278,306,310,332,336,346,363,420,424],{"title":276,"path":272,"stem":277},"Documentation Index","core\u002Findex",{"title":14,"path":279,"stem":280,"children":281,"page":43},"\u002Fcore\u002Fadrs","core\u002Fadrs",[282,286,290,294,298,302],{"title":283,"path":284,"stem":285},"ADR-XXXX: Short, descriptive title","\u002Fcore\u002Fadrs\u002F0000-template","core\u002Fadrs\u002F0000-template",{"title":287,"path":288,"stem":289},"ADR-1: Promotions endpoint","\u002Fcore\u002Fadrs\u002F0001-add-promotions-endpoint","core\u002Fadrs\u002F0001-add-promotions-endpoint",{"title":291,"path":292,"stem":293},"ADR-2: EOM partner report job dispatch","\u002Fcore\u002Fadrs\u002F0002-eom-report-job-dispatch","core\u002Fadrs\u002F0002-eom-report-job-dispatch",{"title":295,"path":296,"stem":297},"ADR-3: Replace PB fee waive flag with a Zero scheme override","\u002Fcore\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme","core\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme",{"title":299,"path":300,"stem":301},"ADR-4: No processor Digital Top-up capability gate in Reloadable Commercials","\u002Fcore\u002Fadrs\u002F0004-no-processor-top-up-capability-gate","core\u002Fadrs\u002F0004-no-processor-top-up-capability-gate",{"title":303,"path":304,"stem":305},"ADR-5: Sparse polymorphic sale fee override reason stamp","\u002Fcore\u002Fadrs\u002F0005-sale-fee-override-reason-stamp","core\u002Fadrs\u002F0005-sale-fee-override-reason-stamp",{"title":307,"path":308,"stem":309},"Agent Workflow","\u002Fcore\u002Fai-workflow","core\u002Fai-workflow",{"title":311,"path":312,"stem":313,"children":314},"Backend Guide","\u002Fcore\u002Fbackend","core\u002Fbackend\u002Findex",[315,316,320,324,328],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319},"Backend AI Tooling","\u002Fcore\u002Fbackend\u002Fai-tooling","core\u002Fbackend\u002Fai-tooling",{"title":321,"path":322,"stem":323},"Backend Linting and Formatting","\u002Fcore\u002Fbackend\u002Flinting-and-formatting","core\u002Fbackend\u002Flinting-and-formatting",{"title":325,"path":326,"stem":327},"Backend Setup","\u002Fcore\u002Fbackend\u002Fsetup","core\u002Fbackend\u002Fsetup",{"title":329,"path":330,"stem":331},"Backend Testing","\u002Fcore\u002Fbackend\u002Ftesting","core\u002Fbackend\u002Ftesting",{"title":333,"path":334,"stem":335},"Documentation Health","\u002Fcore\u002Fdoc-health","core\u002Fdoc-health",{"title":337,"path":338,"stem":339,"children":340},"Frontend Guide","\u002Fcore\u002Ffrontend","core\u002Ffrontend\u002Findex",[341,342],{"title":337,"path":338,"stem":339},{"title":343,"path":344,"stem":345},"Frontend Development","\u002Fcore\u002Ffrontend\u002Fdevelopment","core\u002Ffrontend\u002Fdevelopment",{"title":347,"path":348,"stem":349,"children":350,"page":43},"Modules","\u002Fcore\u002Fmodules","core\u002Fmodules",[351,355],{"title":352,"path":353,"stem":354},"Connect API","\u002Fcore\u002Fmodules\u002Fconnect-api","core\u002Fmodules\u002Fconnect-api",{"title":356,"path":357,"stem":358,"children":359,"page":43},"Secure Links","\u002Fcore\u002Fmodules\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links",[360],{"title":356,"path":361,"stem":362},"\u002Fcore\u002Fmodules\u002Fsecure-links\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links\u002Fsecure-links",{"title":364,"path":365,"stem":366,"children":367,"page":43},"Processors","\u002Fcore\u002Fprocessors","core\u002Fprocessors",[368,372,376,380,384,388,392,396,400,404,408,412,416],{"title":369,"path":370,"stem":371},"Amazon Processor and API","\u002Fcore\u002Fprocessors\u002Famazon","core\u002Fprocessors\u002Famazon",{"title":373,"path":374,"stem":375},"Amilon Processor and API","\u002Fcore\u002Fprocessors\u002Familon","core\u002Fprocessors\u002Familon",{"title":377,"path":378,"stem":379},"Cadooz Processor and API","\u002Fcore\u002Fprocessors\u002Fcadooz","core\u002Fprocessors\u002Fcadooz",{"title":381,"path":382,"stem":383},"Choice Digital Processor and API","\u002Fcore\u002Fprocessors\u002Fchoice-digital","core\u002Fprocessors\u002Fchoice-digital",{"title":385,"path":386,"stem":387},"Diggecard processor reference","\u002Fcore\u002Fprocessors\u002Fdiggecard","core\u002Fprocessors\u002Fdiggecard",{"title":389,"path":390,"stem":391},"ePay Processor and API","\u002Fcore\u002Fprocessors\u002Fepay","core\u002Fprocessors\u002Fepay",{"title":393,"path":394,"stem":395},"GoGift v2 Processor and API","\u002Fcore\u002Fprocessors\u002Fgo-gift-v2","core\u002Fprocessors\u002Fgo-gift-v2",{"title":397,"path":398,"stem":399},"InComm Processor and API","\u002Fcore\u002Fprocessors\u002Fincomm","core\u002Fprocessors\u002Fincomm",{"title":401,"path":402,"stem":403},"Ogloba Processor and API","\u002Fcore\u002Fprocessors\u002Fogloba","core\u002Fprocessors\u002Fogloba",{"title":405,"path":406,"stem":407},"SVSECard Processor and API","\u002Fcore\u002Fprocessors\u002Fsvs-ecard","core\u002Fprocessors\u002Fsvs-ecard",{"title":409,"path":410,"stem":411},"Vananam Processor and API","\u002Fcore\u002Fprocessors\u002Fvananam","core\u002Fprocessors\u002Fvananam",{"title":413,"path":414,"stem":415},"Vouchers Depot processor reference","\u002Fcore\u002Fprocessors\u002Fvouchers-depot","core\u002Fprocessors\u002Fvouchers-depot",{"title":417,"path":418,"stem":419},"You Got a Gift Processor and API","\u002Fcore\u002Fprocessors\u002Fyou-got-a-gift","core\u002Fprocessors\u002Fyou-got-a-gift",{"title":421,"path":422,"stem":423},"Development Quickstart","\u002Fcore\u002Fsetup","core\u002Fsetup",{"title":425,"path":426,"stem":427,"children":428,"page":43},"Workflows","\u002Fcore\u002Fworkflows","core\u002Fworkflows",[429,433,437],{"title":430,"path":431,"stem":432},"Hub Endpoint Workflow","\u002Fcore\u002Fworkflows\u002Fhub-endpoints","core\u002Fworkflows\u002Fhub-endpoints",{"title":434,"path":435,"stem":436},"OpenAPI Tooling","\u002Fcore\u002Fworkflows\u002Fopenapi-tooling","core\u002Fworkflows\u002Fopenapi-tooling",{"title":438,"path":439,"stem":440},"Processor Integration Workflow","\u002Fcore\u002Fworkflows\u002Fprocessors","core\u002Fworkflows\u002Fprocessors",{"collectionName":442,"label":271,"prefix":273},"external_core",{"page":444,"surround":1301},{"id":445,"title":114,"body":446,"config":1296,"description":452,"extension":1297,"meta":1298,"navigation":15,"path":115,"seo":1299,"stem":116,"__hash__":1300},"docs\u002Feos\u002Fharbourmaster\u002Freference\u002Freview-behavior.md",{"type":447,"value":448,"toc":1282},"minimark",[449,453,458,532,539,543,546,582,586,653,663,667,792,803,814,818,821,825,847,850,910,928,931,938,942,965,977,997,1000,1003,1007,1014,1018,1267,1272],[450,451,452],"p",{},"This reference defines how Harbourmaster filters input, selects reviewers,\nscopes agent access, verifies publication, and classifies failures.",[454,455,457],"h2",{"id":456},"run-modes","Run modes",[459,460,461,477],"table",{},[462,463,464],"thead",{},[465,466,467,471,474],"tr",{},[468,469,470],"th",{},"Mode",[468,472,473],{},"GitHub writes",[468,475,476],{},"Behavior",[478,479,480,495,507,520],"tbody",{},[465,481,482,489,492],{},[483,484,485],"td",{},[486,487,488],"code",{},"silent",[483,490,491],{},"No",[483,493,494],{},"Runs analysis without publication.",[465,496,497,502,504],{},[483,498,499],{},[486,500,501],{},"check-only",[483,503,491],{},[483,505,506],{},"Produces a check-style result and telemetry.",[465,508,509,514,517],{},[483,510,511],{},[486,512,513],{},"comment",[483,515,516],{},"Yes, when trusted and permitted",[483,518,519],{},"Publishes one pull request review. This is the default.",[465,521,522,527,529],{},[483,523,524],{},[486,525,526],{},"blocking",[483,528,516],{},[483,530,531],{},"Publishes an advisory review but fails closed on runtime errors.",[450,533,534,535,538],{},"Draft pull requests, fork pull requests, changed head SHAs, and comment runs\nwithout write permission are skipped with exit code ",[486,536,537],{},"0",".",[454,540,542],{"id":541},"diff-filtering","Diff filtering",[450,544,545],{},"A file is noisy when it is binary, generated, vendored, a lockfile, lacks a\npatch, or contains at least 800 changed lines. Renames do not trigger the large\nfile rule. Noisy files are excluded unless their current or previous path\nmatches a sensitive category.",[450,547,548,549,552,553,552,556,559,560,552,563,552,566,552,569,559,572,552,575,578,579,538],{},"Sensitive categories are ",[486,550,551],{},"auth",", ",[486,554,555],{},"ci_workflow",[486,557,558],{},"configuration",",\n",[486,561,562],{},"crypto_secrets",[486,564,565],{},"data_migration",[486,567,568],{},"dependency",[486,570,571],{},"github_publishing",[486,573,574],{},"infrastructure",[486,576,577],{},"permissions",", and ",[486,580,581],{},"security",[454,583,585],{"id":584},"risk-tiers","Risk tiers",[459,587,588,601],{},[462,589,590],{},[465,591,592,595,598],{},[468,593,594],{},"Tier",[468,596,597],{},"Classification",[468,599,600],{},"Specialist selection",[478,602,603,616,629,641],{},[465,604,605,610,613],{},[483,606,607],{},[486,608,609],{},"low",[483,611,612],{},"Every changed file is documentation-like.",[483,614,615],{},"Special-case routing",[465,617,618,623,626],{},[483,619,620],{},[486,621,622],{},"medium",[483,624,625],{},"Ordinary code or configuration change without a higher-risk signal.",[483,627,628],{},"All specialists",[465,630,631,636,639],{},[483,632,633],{},[486,634,635],{},"high",[483,637,638],{},"At least one sensitive path and no full-review signal.",[483,640,628],{},[465,642,643,648,651],{},[483,644,645],{},[486,646,647],{},"full",[483,649,650],{},"Degraded context, a missing patch, a large patch, at least 50 changed files, or at least 2,500 changed lines.",[483,652,628],{},[450,654,655,656,659,660,662],{},"Documentation-only changes run only the documentation specialist. Changes whose\ndocumentation-only set includes ",[486,657,658],{},"AGENTS.md"," run only the AGENTS.md specialist.\nMixed code, configuration, documentation, and ",[486,661,658],{}," changes use the full\nspecialist roster. Risk tiers no longer impose a specialist-count cap.",[454,664,666],{"id":665},"reviewers","Reviewers",[459,668,669,685],{},[462,670,671],{},[465,672,673,676,679,682],{},[468,674,675],{},"Agent identifier",[468,677,678],{},"Role",[468,680,681],{},"Default tier",[468,683,684],{},"Primary scope",[478,686,687,703,718,733,748,763,778],{},[465,688,689,694,697,700],{},[483,690,691],{},[486,692,693],{},"harbourmaster-code-quality-reviewer",[483,695,696],{},"Code quality",[483,698,699],{},"deep",[483,701,702],{},"Changed behavior, logic, contracts, data, concurrency, and tests",[465,704,705,710,713,715],{},[483,706,707],{},[486,708,709],{},"harbourmaster-security-reviewer",[483,711,712],{},"Security",[483,714,699],{},[483,716,717],{},"Auth, secrets, permissions, security, and sensitive data",[465,719,720,725,728,730],{},[483,721,722],{},[486,723,724],{},"harbourmaster-performance-reviewer",[483,726,727],{},"Performance",[483,729,699],{},[483,731,732],{},"Latency, throughput, memory, I\u002FO, and complexity",[465,734,735,740,742,745],{},[483,736,737],{},[486,738,739],{},"harbourmaster-documentation-reviewer",[483,741,5],{},[483,743,744],{},"fast",[483,746,747],{},"Documentation, README, and user-facing guidance",[465,749,750,755,758,760],{},[483,751,752],{},[486,753,754],{},"harbourmaster-release-management-reviewer",[483,756,757],{},"Release management",[483,759,699],{},[483,761,762],{},"CI, configuration, migrations, dependencies, publishing, and rollout",[465,764,765,770,773,775],{},[483,766,767],{},[486,768,769],{},"harbourmaster-compliance-reviewer",[483,771,772],{},"Compliance",[483,774,744],{},[483,776,777],{},"Explicit policy, legal, regulatory, and mandatory standards",[465,779,780,785,787,789],{},[483,781,782],{},[486,783,784],{},"harbourmaster-agentsmd-reviewer",[483,786,658],{},[483,788,744],{},[483,790,791],{},"AGENTS.md scope, precedence, commands, and tool boundaries",[450,793,794,795,798,799,802],{},"Each specialist prompt contains explicit ",[486,796,797],{},"What to Flag"," and ",[486,800,801],{},"What NOT to Flag","\nlists that keep findings within the assigned review boundary. Change analysis\nstill records affected capabilities and recommended roles for context and\ntelemetry, but it does not remove specialists from the normal roster. The\nselector records specialists excluded by the two special-case routes; there is\nno default tier budget that skips otherwise eligible reviewers.",[450,804,805,806,809,810,813],{},"The bundled OpenCode reviewer plugin runs selected specialists concurrently,\nthen runs one ",[486,807,808],{},"harbourmaster-adversarial-verifier",", then returns verified\nfeedback to one ",[486,811,812],{},"harbourmaster-review-editor",". Specialists and the verifier\ndefault to a 600-second session timeout. The per-model circuit opens after two\nfailures during the batch. A separate observational telemetry plugin uses\nOpenCode lifecycle hooks; it does not poll sessions or alter reviewer behavior.",[454,815,817],{"id":816},"review-output","Review output",[450,819,820],{},"Specialists return evidence excerpts, repository-relative paths, and line\nnumbers to the adversarial verifier. The code-quality reviewer can use the\ncanonical checkout to collect context, but each finding must remain tied to a\nchanged line. The editor uses the verified evidence to prepare the advisory\nreview. The trusted publication tool validates its arguments and the complete\nset of previous-finding dispositions. The runner does not parse model text or\nfabricate an empty finding list.",[454,822,824],{"id":823},"github-publication","GitHub publication",[450,826,827,828,830,831,834,835,838,839,842,843,846],{},"In ",[486,829,513],{}," mode, the coordinator calls the trusted local ",[486,832,833],{},"publish_review"," tool\nto submit a ",[486,836,837],{},"COMMENT"," review and a complete disposition set for previous\nfindings. The tool keeps unfixed findings active, replies ",[486,840,841],{},"LGTM"," with a trusted\ncompletion marker for completed findings, and posts a reasoned disagreement\ncounterpoint when required. When publication fails, the tool returns the error\nto the editor so it can correct the input and retry, for up to three attempts.\nAfter the first success, repeated identical calls return the cached receipt and\nconflicting calls are rejected. A later run keeps marked threads in bounded\nreview-thread context, but excludes them from lifecycle actions. Before\npublishing the current result, the tool wraps the body of each earlier\nHarbourmaster review in a collapsed ",[486,844,845],{},"Previous review"," details section. Reviews\nthat already use this wrapper are left unchanged, and inline review comments are\nnot modified. It submits a concise no-issues review when no new finding survives\nverification. Specialists and the adversarial verifier cannot access GitHub.\nLifecycle replies use GitHub's REST review-comment reply endpoint and run\nconcurrently. Partial failures map back to individual findings in the\npublication receipt.",[450,848,849],{},"OpenCode derives the call shape from the tool's JSON Schema:",[459,851,852,862],{},[462,853,854],{},[465,855,856,859],{},[468,857,858],{},"Field",[468,860,861],{},"Contents",[478,863,864,874,892],{},[465,865,866,871],{},[483,867,868],{},[486,869,870],{},"body",[483,872,873],{},"Markdown review summary without the trusted marker or inline issue text.",[465,875,876,881],{},[483,877,878],{},[486,879,880],{},"newFindings",[483,882,883,884,552,887,578,890,538],{},"New verified inline comments, each containing ",[486,885,886],{},"path",[486,888,889],{},"line",[486,891,870],{},[465,893,894,899],{},[483,895,896],{},[486,897,898],{},"previousFindings",[483,900,901,902,905,906,909],{},"One ",[486,903,904],{},"commentId"," and lifecycle ",[486,907,908],{},"disposition"," per trusted prior finding.",[450,911,912,913,916,917,920,921,923,924,927],{},"Only ",[486,914,915],{},"disagreement_rejected"," accepts a ",[486,918,919],{},"counterpoint",". Specialist attribution\nbelongs in an inline finding's Markdown ",[486,922,870],{},"; ",[486,925,926],{},"source_agent"," is not a\npublication field.",[450,929,930],{},"Before creating a review, the publication tool checks for a pending review owned\nby the current GitHub identity. It deletes a stale pending review only when its\nbody contains a valid Harbourmaster marker, or when a bounded, non-empty comment\nset consists entirely of legacy Harbourmaster specialist comments. Any other\npending review is left unchanged and publication fails closed.",[450,932,933,934,937],{},"The runner snapshots existing reviews before OpenCode starts and supplies a\nunique marker bound to the run ID and exact head SHA. After OpenCode exits, the\nrunner requires a newly submitted, non-pending review on that head whose body\ncontains the marker. It does not parse, transform, or republish OpenCode output.\nA missing or mismatched review is a ",[486,935,936],{},"github_publish"," failure.",[454,939,941],{"id":940},"context-bounds","Context bounds",[450,943,944,945,552,948,951,952,955,956,960,961,964],{},"OpenCode starts in an ephemeral diff directory. Before it starts, the trusted\nrunner writes ",[486,946,947],{},"review-index.json",[486,949,950],{},"shared-pr-context.txt",", and\n",[486,953,954],{},"review-discussion.txt",". Workspace file roles, tool page limits, and model\ndefaults are in the ",[957,958,959],"a",{"href":107},"configuration reference",". The index\ncontains the repository root, exact base and head, every reviewable changed path\nwith its status and rename path, each staged patch path, and per-hunk base,\nhead, and patch-line ranges. A missing patch is represented by a ",[486,962,963],{},"null"," patch\npath.",[450,966,967,968,552,970,578,973,976],{},"The directory contains one patch file per reviewable changed file and the root\nreference paths ",[486,969,658],{},[486,971,972],{},".agents\u002F",[486,974,975],{},"docs\u002F"," when the checkout contains\nthem. Shared context describes filtered, binary, and missing-patch files, but\nHarbourmaster does not stage patches for them.",[450,978,979,980,552,983,552,986,578,989,992,993,996],{},"The code-quality reviewer receives the canonical checkout root in its prompt and\nhas read-only access to that checkout alongside the staged diff. It can inspect\nunchanged files to trace callers, contracts, and tests. Other specialists and\nthe verifier can inspect only the diff directory. A per-run external-directory\noverride grants access only to the code-quality reviewer. A trusted hook\ncanonicalizes ",[486,981,982],{},"read",[486,984,985],{},"glob",[486,987,988],{},"grep",[486,990,991],{},"list"," paths and rejects symlink\nescapes. The ",[486,994,995],{},"read_more"," tool can continue a truncated repository result with a\ncursor bound to the current session. A missing or truncated result is not\nevidence that no finding exists. Reviewers must cover all relevant changed code\nand use the index-first order: index, patches, caller search, source ranges,\nthen tests when the role permits those reads. Findings must concern behavior\nintroduced by the pull request and refer to changed lines. Checkout files and\ninstructions remain untrusted review context.",[450,998,999],{},"GitHub context loads at most 3,000 changed files and the most recent 100 issue\ncomments, review comments, and reviews per source. GraphQL paginates review\nthreads within a bounded timeout and retains every loaded thread, including\nresolved and completed Harbourmaster-owned threads, with outdated state and the\nroot plus newest ten comments. The loader preserves comment order from oldest to\nnewest. Matching resolved and completed root IDs filter duplicate REST review\ncomments. The editor prompt always includes every Harbourmaster-owned thread and\nat most 40 human threads whose current or previous path is in the pull request\nchanged paths. Unrelated human threads are not a fallback. Only unresolved,\nnon-completed, Harbourmaster-owned roots enter the lifecycle manifest. The\neditor prompt includes the newest 50 combined discussion entries, at most 2,000\ncharacters per body and 40,000 body characters in total. Discussion is ordered\noldest to newest.",[450,1001,1002],{},"GitHub context becomes degraded when reported files are missing from the loaded\nset or when a pull request reaches the configured large-file threshold of 300.\nDegraded context produces full risk.",[454,1004,1006],{"id":1005},"runtime-degradation","Runtime degradation",[450,1008,1009,1010,1013],{},"Non-blocking modes can return an exit-code-zero degraded result for selected\nOpenCode runtime failures. The summary identifies the degraded state and\ntelemetry retains the failure class. Blocking mode fails closed. With\n",[486,1011,1012],{},"strict_runtime"," enabled, a non-skipped run fails if no model calls complete or\nruntime degradation otherwise prevents real review execution.",[454,1015,1017],{"id":1016},"failure-classes","Failure classes",[459,1019,1020,1037],{},[462,1021,1022],{},[465,1023,1024,1027,1030,1034],{},[468,1025,1026],{},"Class",[468,1028,1029],{},"Retryable",[468,1031,1033],{"align":1032},"right","Maximum attempts",[468,1035,1036],{"align":1032},"Exit code",[478,1038,1039,1053,1067,1082,1095,1109,1122,1135,1148,1161,1174,1187,1200,1214,1228,1241,1254],{},[465,1040,1041,1045,1047,1050],{},[483,1042,1043],{},[486,1044,558],{},[483,1046,491],{},[483,1048,1049],{"align":1032},"1",[483,1051,1052],{"align":1032},"10",[465,1054,1055,1060,1062,1064],{},[483,1056,1057],{},[486,1058,1059],{},"github_auth",[483,1061,491],{},[483,1063,1049],{"align":1032},[483,1065,1066],{"align":1032},"20",[465,1068,1069,1074,1077,1080],{},[483,1070,1071],{},[486,1072,1073],{},"github_rate_limit",[483,1075,1076],{},"Yes",[483,1078,1079],{"align":1032},"3",[483,1081,1066],{"align":1032},[465,1083,1084,1088,1090,1092],{},[483,1085,1086],{},[486,1087,936],{},[483,1089,1076],{},[483,1091,1079],{"align":1032},[483,1093,1094],{"align":1032},"50",[465,1096,1097,1102,1104,1106],{},[483,1098,1099],{},[486,1100,1101],{},"opencode_install",[483,1103,491],{},[483,1105,1049],{"align":1032},[483,1107,1108],{"align":1032},"30",[465,1110,1111,1116,1118,1120],{},[483,1112,1113],{},[486,1114,1115],{},"opencode_config",[483,1117,491],{},[483,1119,1049],{"align":1032},[483,1121,1052],{"align":1032},[465,1123,1124,1129,1131,1133],{},[483,1125,1126],{},[486,1127,1128],{},"opencode_server_startup",[483,1130,1076],{},[483,1132,1079],{"align":1032},[483,1134,1108],{"align":1032},[465,1136,1137,1142,1144,1146],{},[483,1138,1139],{},[486,1140,1141],{},"opencode_sdk_runtime",[483,1143,1076],{},[483,1145,1079],{"align":1032},[483,1147,1108],{"align":1032},[465,1149,1150,1155,1157,1159],{},[483,1151,1152],{},[486,1153,1154],{},"opencode_session_timeout",[483,1156,1076],{},[483,1158,1079],{"align":1032},[483,1160,1108],{"align":1032},[465,1162,1163,1168,1170,1172],{},[483,1164,1165],{},[486,1166,1167],{},"model_auth",[483,1169,491],{},[483,1171,1049],{"align":1032},[483,1173,1066],{"align":1032},[465,1175,1176,1181,1183,1185],{},[483,1177,1178],{},[486,1179,1180],{},"model_rate_limit",[483,1182,1076],{},[483,1184,1079],{"align":1032},[483,1186,1066],{"align":1032},[465,1188,1189,1194,1196,1198],{},[483,1190,1191],{},[486,1192,1193],{},"model_timeout",[483,1195,1076],{},[483,1197,1079],{"align":1032},[483,1199,1066],{"align":1032},[465,1201,1202,1207,1209,1211],{},[483,1203,1204],{},[486,1205,1206],{},"model_context_limit",[483,1208,491],{},[483,1210,1049],{"align":1032},[483,1212,1213],{"align":1032},"40",[465,1215,1216,1221,1223,1226],{},[483,1217,1218],{},[486,1219,1220],{},"model_malformed_output",[483,1222,1076],{},[483,1224,1225],{"align":1032},"2",[483,1227,1213],{"align":1032},[465,1229,1230,1235,1237,1239],{},[483,1231,1232],{},[486,1233,1234],{},"diff_unavailable",[483,1236,1076],{},[483,1238,1079],{"align":1032},[483,1240,1066],{"align":1032},[465,1242,1243,1248,1250,1252],{},[483,1244,1245],{},[486,1246,1247],{},"policy_skipped",[483,1249,491],{},[483,1251,1049],{"align":1032},[483,1253,537],{"align":1032},[465,1255,1256,1261,1263,1265],{},[483,1257,1258],{},[486,1259,1260],{},"internal_error",[483,1262,1076],{},[483,1264,1079],{"align":1032},[483,1266,1108],{"align":1032},[450,1268,1269,1271],{},[486,1270,1247],{}," maps to successful comment-mode and neutral check-mode CI\noutcomes. All other terminal failure classes map to failure on both surfaces.",[450,1273,1274,1275,1278,1279,538],{},"For skip and failure diagnosis, see\n",[957,1276,93],{"href":1277},"..\u002Fhow-to\u002Ftroubleshoot-a-review",".\nFor why the runner verifies publication instead of a second publish step, see\n",[957,1280,64],{"href":1281},"..\u002Fexplanation\u002Freview-pipeline",{"title":1283,"searchDepth":1284,"depth":1284,"links":1285},"",3,[1286,1288,1289,1290,1291,1292,1293,1294,1295],{"id":456,"depth":1287,"text":457},2,{"id":541,"depth":1287,"text":542},{"id":584,"depth":1287,"text":585},{"id":665,"depth":1287,"text":666},{"id":816,"depth":1287,"text":817},{"id":823,"depth":1287,"text":824},{"id":940,"depth":1287,"text":941},{"id":1005,"depth":1287,"text":1006},{"id":1016,"depth":1287,"text":1017},{},"md",{},{"title":114,"description":452},"n4jCaTx4zDxhn4vqm71_bo5mcdSIEAbZqSBxHmzQJ7Y",[1302,1303],{"title":110,"path":111,"stem":112,"children":-1},{"title":118,"path":119,"stem":120,"children":-1},1789777548149]