[{"data":1,"prerenderedAt":1399},["ShallowReactive",2],{"navigation":3,"external-navigation":214,"docs:\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository":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":1396},{"id":445,"title":77,"body":446,"config":1391,"description":555,"extension":1392,"meta":1393,"navigation":15,"path":78,"seo":1394,"stem":79,"__hash__":1395},"docs\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository.md",{"type":447,"value":448,"toc":1386},"minimark",[449,460,476,482,487,490,504,516,538,542,549,1291,1305,1311,1328,1339,1343,1360,1366,1369,1377,1382],[450,451,452],"blockquote",{},[453,454,455,459],"p",{},[456,457,458],"span",{},"!WARNING"," This process is currently invite-only. Tillo will announce when\nthis changes.",[453,461,462,463,467,468,471,472,475],{},"Add one native ",[464,465,466],"code",{},"Harbourmaster review"," job to pull requests from branches in the\nrepository. The job guards forks and drafts, ensures the ",[464,469,470],{},"harbourmaster-review","\nlabel is present, and runs the latest Harbourmaster version merged to the EOS\n",[464,473,474],{},"main"," branch.",[453,477,478,479,481],{},"An eligible pull request is reviewed automatically only when\n",[464,480,470],{}," is absent. The job adds the label before reviewing, so\nlater commits do not start another review. Removing and re-adding the label\nrequests another review for the current head.",[483,484,486],"h2",{"id":485},"prerequisites","Prerequisites",[453,488,489],{},"Before changing the consuming repository, confirm that:",[491,492,493,501],"ul",{},[494,495,496,497,500],"li",{},"the repository can use actions from ",[464,498,499],{},"TilloTech\u002Feos",";",[494,502,503],{},"the repository uses GitHub-hosted runners.",[450,505,506],{},[453,507,508,511,512,515],{},[456,509,510],{},"!IMPORTANT"," ",[464,513,514],{},"HARBOURMASTER_AWS_ROLE_TO_ASSUME"," is configured globally for all\nteam repos. The ARN identifies the role but does not grant access to it. OIDC\nsupplies the short-lived AWS credentials at runtime.",[453,517,518,519,522,523,526,527,530,531,534,535,537],{},"The role must allow ",[464,520,521],{},"bedrock-mantle:CreateInference",",\n",[464,524,525],{},"bedrock-mantle:GetProject",", and ",[464,528,529],{},"bedrock-mantle:ListProjects"," in ",[464,532,533],{},"us-east-1",".\nThe action fixes the AWS region to ",[464,536,533],{}," for the bundled GPT-5.6 Terra and\nLuna models.",[483,539,541],{"id":540},"add-the-workflow","Add the workflow",[453,543,544,545,548],{},"Create ",[464,546,547],{},".github\u002Fworkflows\u002Fharbourmaster-review.yml",":",[550,551,556],"pre",{"className":552,"code":553,"language":554,"meta":555,"style":555},"language-yaml shiki shiki-themes github-dark github-light","name: Harbourmaster review\n\non:\n  pull_request:\n    types: [opened, reopened, ready_for_review, synchronize, labeled]\n\npermissions: {}\n\nconcurrency:\n  group: harbourmaster-review-${{ github.event.pull_request.number }}\n  cancel-in-progress: true\n\njobs:\n  review:\n    name: Harbourmaster review\n    if: >\n      github.event.pull_request.draft == false &&\n      github.event.pull_request.head.repo.full_name == github.repository && (\n        github.event.action != 'labeled' ||\n        github.event.label.name == 'harbourmaster-review'\n      )\n    permissions:\n      contents: read\n      id-token: write\n      issues: write\n      pull-requests: write\n    runs-on: ubuntu-latest\n    timeout-minutes: 15\n    steps:\n      - name: Require a new Harbourmaster review\n        if: >\n          github.event.action != 'labeled' && contains(\n            github.event.pull_request.labels.*.name,\n            'harbourmaster-review'\n          )\n        run: |\n          echo \"::warning title=Human Harbourmaster re-review required::\" \\\n            \"This head is unreviewed. A human must remove and re-add the\" \\\n            \"harbourmaster-review label to request a re-review.\"\n          exit 1\n\n      - name: Apply harbourmaster-review label\n        if: github.event.action != 'labeled'\n        env:\n          GH_TOKEN: ${{ github.token }}\n          LABEL: harbourmaster-review\n          PR: ${{ github.event.pull_request.number }}\n          REPO: ${{ github.repository }}\n        run: |\n          set -euo pipefail\n\n          if ! gh api \"repos\u002F${REPO}\u002Flabels\u002F${LABEL}\" >\u002Fdev\u002Fnull 2>&1; then\n            gh label create \"$LABEL\" \\\n              --repo \"$REPO\" \\\n              --description \"Trigger Harbourmaster review\" \\\n              --color \"0E8A16\" ||\n              gh api \"repos\u002F${REPO}\u002Flabels\u002F${LABEL}\" >\u002Fdev\u002Fnull\n          fi\n\n          jq -n --arg label \"$LABEL\" '{labels: [$label]}' |\n            gh api \\\n              --method POST \\\n              \"repos\u002F${REPO}\u002Fissues\u002F${PR}\u002Flabels\" \\\n              --input - \\\n              >\u002Fdev\u002Fnull\n\n      - name: Checkout reviewed pull request head\n        uses: actions\u002Fcheckout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0\n        with:\n          ref: ${{ github.event.pull_request.head.sha }}\n          persist-credentials: false\n\n      - name: Run Harbourmaster reviewer\n        uses: TilloTech\u002Feos\u002Fapps\u002Fharbourmaster@main\n        with:\n          repo: ${{ github.repository }}\n          pull_number: ${{ github.event.pull_request.number }}\n          head_sha: ${{ github.event.pull_request.head.sha }}\n          mode: comment\n          strict_runtime: \"true\"\n          github_token: ${{ github.token }}\n          aws_role_to_assume: ${{ vars.HARBOURMASTER_AWS_ROLE_TO_ASSUME }}\n          aws_profile: ${{ vars.HARBOURMASTER_AWS_PROFILE }}\n          aws_bearer_token_bedrock: ${{ secrets.AWS_BEARER_TOKEN_BEDROCK }}\n","yaml","",[464,557,558,574,580,590,598,634,639,648,653,661,672,683,688,696,704,714,726,732,738,744,750,756,764,775,786,796,806,817,828,836,849,859,865,871,877,883,894,900,906,912,918,923,935,945,953,964,975,986,997,1006,1012,1017,1023,1029,1035,1041,1047,1053,1059,1064,1070,1076,1082,1088,1094,1100,1105,1117,1132,1140,1151,1162,1167,1179,1189,1196,1206,1216,1226,1237,1248,1258,1269,1280],{"__ignoreMap":555},[456,559,562,566,570],{"class":560,"line":561},"line",1,[456,563,565],{"class":564},"sZkSk","name",[456,567,569],{"class":568},"sQ3_J",": ",[456,571,573],{"class":572},"sg6BJ","Harbourmaster review\n",[456,575,577],{"class":560,"line":576},2,[456,578,579],{"emptyLinePlaceholder":15},"\n",[456,581,583,587],{"class":560,"line":582},3,[456,584,586],{"class":585},"s0DvM","on",[456,588,589],{"class":568},":\n",[456,591,593,596],{"class":560,"line":592},4,[456,594,595],{"class":564},"  pull_request",[456,597,589],{"class":568},[456,599,601,604,607,610,613,616,618,621,623,626,628,631],{"class":560,"line":600},5,[456,602,603],{"class":564},"    types",[456,605,606],{"class":568},": [",[456,608,609],{"class":572},"opened",[456,611,612],{"class":568},", ",[456,614,615],{"class":572},"reopened",[456,617,612],{"class":568},[456,619,620],{"class":572},"ready_for_review",[456,622,612],{"class":568},[456,624,625],{"class":572},"synchronize",[456,627,612],{"class":568},[456,629,630],{"class":572},"labeled",[456,632,633],{"class":568},"]\n",[456,635,637],{"class":560,"line":636},6,[456,638,579],{"emptyLinePlaceholder":15},[456,640,642,645],{"class":560,"line":641},7,[456,643,644],{"class":564},"permissions",[456,646,647],{"class":568},": {}\n",[456,649,651],{"class":560,"line":650},8,[456,652,579],{"emptyLinePlaceholder":15},[456,654,656,659],{"class":560,"line":655},9,[456,657,658],{"class":564},"concurrency",[456,660,589],{"class":568},[456,662,664,667,669],{"class":560,"line":663},10,[456,665,666],{"class":564},"  group",[456,668,569],{"class":568},[456,670,671],{"class":572},"harbourmaster-review-${{ github.event.pull_request.number }}\n",[456,673,675,678,680],{"class":560,"line":674},11,[456,676,677],{"class":564},"  cancel-in-progress",[456,679,569],{"class":568},[456,681,682],{"class":585},"true\n",[456,684,686],{"class":560,"line":685},12,[456,687,579],{"emptyLinePlaceholder":15},[456,689,691,694],{"class":560,"line":690},13,[456,692,693],{"class":564},"jobs",[456,695,589],{"class":568},[456,697,699,702],{"class":560,"line":698},14,[456,700,701],{"class":564},"  review",[456,703,589],{"class":568},[456,705,707,710,712],{"class":560,"line":706},15,[456,708,709],{"class":564},"    name",[456,711,569],{"class":568},[456,713,573],{"class":572},[456,715,717,720,722],{"class":560,"line":716},16,[456,718,719],{"class":564},"    if",[456,721,569],{"class":568},[456,723,725],{"class":724},"scx8i",">\n",[456,727,729],{"class":560,"line":728},17,[456,730,731],{"class":572},"      github.event.pull_request.draft == false &&\n",[456,733,735],{"class":560,"line":734},18,[456,736,737],{"class":572},"      github.event.pull_request.head.repo.full_name == github.repository && (\n",[456,739,741],{"class":560,"line":740},19,[456,742,743],{"class":572},"        github.event.action != 'labeled' ||\n",[456,745,747],{"class":560,"line":746},20,[456,748,749],{"class":572},"        github.event.label.name == 'harbourmaster-review'\n",[456,751,753],{"class":560,"line":752},21,[456,754,755],{"class":572},"      )\n",[456,757,759,762],{"class":560,"line":758},22,[456,760,761],{"class":564},"    permissions",[456,763,589],{"class":568},[456,765,767,770,772],{"class":560,"line":766},23,[456,768,769],{"class":564},"      contents",[456,771,569],{"class":568},[456,773,774],{"class":572},"read\n",[456,776,778,781,783],{"class":560,"line":777},24,[456,779,780],{"class":564},"      id-token",[456,782,569],{"class":568},[456,784,785],{"class":572},"write\n",[456,787,789,792,794],{"class":560,"line":788},25,[456,790,791],{"class":564},"      issues",[456,793,569],{"class":568},[456,795,785],{"class":572},[456,797,799,802,804],{"class":560,"line":798},26,[456,800,801],{"class":564},"      pull-requests",[456,803,569],{"class":568},[456,805,785],{"class":572},[456,807,809,812,814],{"class":560,"line":808},27,[456,810,811],{"class":564},"    runs-on",[456,813,569],{"class":568},[456,815,816],{"class":572},"ubuntu-latest\n",[456,818,820,823,825],{"class":560,"line":819},28,[456,821,822],{"class":564},"    timeout-minutes",[456,824,569],{"class":568},[456,826,827],{"class":585},"15\n",[456,829,831,834],{"class":560,"line":830},29,[456,832,833],{"class":564},"    steps",[456,835,589],{"class":568},[456,837,839,842,844,846],{"class":560,"line":838},30,[456,840,841],{"class":568},"      - ",[456,843,565],{"class":564},[456,845,569],{"class":568},[456,847,848],{"class":572},"Require a new Harbourmaster review\n",[456,850,852,855,857],{"class":560,"line":851},31,[456,853,854],{"class":564},"        if",[456,856,569],{"class":568},[456,858,725],{"class":724},[456,860,862],{"class":560,"line":861},32,[456,863,864],{"class":572},"          github.event.action != 'labeled' && contains(\n",[456,866,868],{"class":560,"line":867},33,[456,869,870],{"class":572},"            github.event.pull_request.labels.*.name,\n",[456,872,874],{"class":560,"line":873},34,[456,875,876],{"class":572},"            'harbourmaster-review'\n",[456,878,880],{"class":560,"line":879},35,[456,881,882],{"class":572},"          )\n",[456,884,886,889,891],{"class":560,"line":885},36,[456,887,888],{"class":564},"        run",[456,890,569],{"class":568},[456,892,893],{"class":724},"|\n",[456,895,897],{"class":560,"line":896},37,[456,898,899],{"class":572},"          echo \"::warning title=Human Harbourmaster re-review required::\" \\\n",[456,901,903],{"class":560,"line":902},38,[456,904,905],{"class":572},"            \"This head is unreviewed. A human must remove and re-add the\" \\\n",[456,907,909],{"class":560,"line":908},39,[456,910,911],{"class":572},"            \"harbourmaster-review label to request a re-review.\"\n",[456,913,915],{"class":560,"line":914},40,[456,916,917],{"class":572},"          exit 1\n",[456,919,921],{"class":560,"line":920},41,[456,922,579],{"emptyLinePlaceholder":15},[456,924,926,928,930,932],{"class":560,"line":925},42,[456,927,841],{"class":568},[456,929,565],{"class":564},[456,931,569],{"class":568},[456,933,934],{"class":572},"Apply harbourmaster-review label\n",[456,936,938,940,942],{"class":560,"line":937},43,[456,939,854],{"class":564},[456,941,569],{"class":568},[456,943,944],{"class":572},"github.event.action != 'labeled'\n",[456,946,948,951],{"class":560,"line":947},44,[456,949,950],{"class":564},"        env",[456,952,589],{"class":568},[456,954,956,959,961],{"class":560,"line":955},45,[456,957,958],{"class":564},"          GH_TOKEN",[456,960,569],{"class":568},[456,962,963],{"class":572},"${{ github.token }}\n",[456,965,967,970,972],{"class":560,"line":966},46,[456,968,969],{"class":564},"          LABEL",[456,971,569],{"class":568},[456,973,974],{"class":572},"harbourmaster-review\n",[456,976,978,981,983],{"class":560,"line":977},47,[456,979,980],{"class":564},"          PR",[456,982,569],{"class":568},[456,984,985],{"class":572},"${{ github.event.pull_request.number }}\n",[456,987,989,992,994],{"class":560,"line":988},48,[456,990,991],{"class":564},"          REPO",[456,993,569],{"class":568},[456,995,996],{"class":572},"${{ github.repository }}\n",[456,998,1000,1002,1004],{"class":560,"line":999},49,[456,1001,888],{"class":564},[456,1003,569],{"class":568},[456,1005,893],{"class":724},[456,1007,1009],{"class":560,"line":1008},50,[456,1010,1011],{"class":572},"          set -euo pipefail\n",[456,1013,1015],{"class":560,"line":1014},51,[456,1016,579],{"emptyLinePlaceholder":15},[456,1018,1020],{"class":560,"line":1019},52,[456,1021,1022],{"class":572},"          if ! gh api \"repos\u002F${REPO}\u002Flabels\u002F${LABEL}\" >\u002Fdev\u002Fnull 2>&1; then\n",[456,1024,1026],{"class":560,"line":1025},53,[456,1027,1028],{"class":572},"            gh label create \"$LABEL\" \\\n",[456,1030,1032],{"class":560,"line":1031},54,[456,1033,1034],{"class":572},"              --repo \"$REPO\" \\\n",[456,1036,1038],{"class":560,"line":1037},55,[456,1039,1040],{"class":572},"              --description \"Trigger Harbourmaster review\" \\\n",[456,1042,1044],{"class":560,"line":1043},56,[456,1045,1046],{"class":572},"              --color \"0E8A16\" ||\n",[456,1048,1050],{"class":560,"line":1049},57,[456,1051,1052],{"class":572},"              gh api \"repos\u002F${REPO}\u002Flabels\u002F${LABEL}\" >\u002Fdev\u002Fnull\n",[456,1054,1056],{"class":560,"line":1055},58,[456,1057,1058],{"class":572},"          fi\n",[456,1060,1062],{"class":560,"line":1061},59,[456,1063,579],{"emptyLinePlaceholder":15},[456,1065,1067],{"class":560,"line":1066},60,[456,1068,1069],{"class":572},"          jq -n --arg label \"$LABEL\" '{labels: [$label]}' |\n",[456,1071,1073],{"class":560,"line":1072},61,[456,1074,1075],{"class":572},"            gh api \\\n",[456,1077,1079],{"class":560,"line":1078},62,[456,1080,1081],{"class":572},"              --method POST \\\n",[456,1083,1085],{"class":560,"line":1084},63,[456,1086,1087],{"class":572},"              \"repos\u002F${REPO}\u002Fissues\u002F${PR}\u002Flabels\" \\\n",[456,1089,1091],{"class":560,"line":1090},64,[456,1092,1093],{"class":572},"              --input - \\\n",[456,1095,1097],{"class":560,"line":1096},65,[456,1098,1099],{"class":572},"              >\u002Fdev\u002Fnull\n",[456,1101,1103],{"class":560,"line":1102},66,[456,1104,579],{"emptyLinePlaceholder":15},[456,1106,1108,1110,1112,1114],{"class":560,"line":1107},67,[456,1109,841],{"class":568},[456,1111,565],{"class":564},[456,1113,569],{"class":568},[456,1115,1116],{"class":572},"Checkout reviewed pull request head\n",[456,1118,1120,1123,1125,1128],{"class":560,"line":1119},68,[456,1121,1122],{"class":564},"        uses",[456,1124,569],{"class":568},[456,1126,1127],{"class":572},"actions\u002Fcheckout@d23441a48e516b6c34aea4fa41551a30e30af803",[456,1129,1131],{"class":1130},"sryI4"," # v6.1.0\n",[456,1133,1135,1138],{"class":560,"line":1134},69,[456,1136,1137],{"class":564},"        with",[456,1139,589],{"class":568},[456,1141,1143,1146,1148],{"class":560,"line":1142},70,[456,1144,1145],{"class":564},"          ref",[456,1147,569],{"class":568},[456,1149,1150],{"class":572},"${{ github.event.pull_request.head.sha }}\n",[456,1152,1154,1157,1159],{"class":560,"line":1153},71,[456,1155,1156],{"class":564},"          persist-credentials",[456,1158,569],{"class":568},[456,1160,1161],{"class":585},"false\n",[456,1163,1165],{"class":560,"line":1164},72,[456,1166,579],{"emptyLinePlaceholder":15},[456,1168,1170,1172,1174,1176],{"class":560,"line":1169},73,[456,1171,841],{"class":568},[456,1173,565],{"class":564},[456,1175,569],{"class":568},[456,1177,1178],{"class":572},"Run Harbourmaster reviewer\n",[456,1180,1182,1184,1186],{"class":560,"line":1181},74,[456,1183,1122],{"class":564},[456,1185,569],{"class":568},[456,1187,1188],{"class":572},"TilloTech\u002Feos\u002Fapps\u002Fharbourmaster@main\n",[456,1190,1192,1194],{"class":560,"line":1191},75,[456,1193,1137],{"class":564},[456,1195,589],{"class":568},[456,1197,1199,1202,1204],{"class":560,"line":1198},76,[456,1200,1201],{"class":564},"          repo",[456,1203,569],{"class":568},[456,1205,996],{"class":572},[456,1207,1209,1212,1214],{"class":560,"line":1208},77,[456,1210,1211],{"class":564},"          pull_number",[456,1213,569],{"class":568},[456,1215,985],{"class":572},[456,1217,1219,1222,1224],{"class":560,"line":1218},78,[456,1220,1221],{"class":564},"          head_sha",[456,1223,569],{"class":568},[456,1225,1150],{"class":572},[456,1227,1229,1232,1234],{"class":560,"line":1228},79,[456,1230,1231],{"class":564},"          mode",[456,1233,569],{"class":568},[456,1235,1236],{"class":572},"comment\n",[456,1238,1240,1243,1245],{"class":560,"line":1239},80,[456,1241,1242],{"class":564},"          strict_runtime",[456,1244,569],{"class":568},[456,1246,1247],{"class":572},"\"true\"\n",[456,1249,1251,1254,1256],{"class":560,"line":1250},81,[456,1252,1253],{"class":564},"          github_token",[456,1255,569],{"class":568},[456,1257,963],{"class":572},[456,1259,1261,1264,1266],{"class":560,"line":1260},82,[456,1262,1263],{"class":564},"          aws_role_to_assume",[456,1265,569],{"class":568},[456,1267,1268],{"class":572},"${{ vars.HARBOURMASTER_AWS_ROLE_TO_ASSUME }}\n",[456,1270,1272,1275,1277],{"class":560,"line":1271},83,[456,1273,1274],{"class":564},"          aws_profile",[456,1276,569],{"class":568},[456,1278,1279],{"class":572},"${{ vars.HARBOURMASTER_AWS_PROFILE }}\n",[456,1281,1283,1286,1288],{"class":560,"line":1282},84,[456,1284,1285],{"class":564},"          aws_bearer_token_bedrock",[456,1287,569],{"class":568},[456,1289,1290],{"class":572},"${{ secrets.AWS_BEARER_TOKEN_BEDROCK }}\n",[453,1292,1293,1294,1296,1297,1300,1301,1304],{},"A new ",[464,1295,625],{}," event can cancel an active review for an older head. The\n",[464,1298,1299],{},"head_sha"," input uses ",[464,1302,1303],{},"github.event.pull_request.head.sha",", so the action\nreviews the event head.",[453,1306,1307,1308,1310],{},"The job-level guard blocks fork and draft pull requests before checkout. While\n",[464,1309,470],{}," is present, automatic events fail the native check before\nreview execution. A human must remove and re-add the label to review the latest\nhead. Automation must not request that re-review.",[453,1312,1313,1314,1317,1318,1321,1322,1327],{},"Consumer repositories must use ",[464,1315,1316],{},"TilloTech\u002Feos\u002Fapps\u002Fharbourmaster@main",". Do not\ncopy the EOS-local ",[464,1319,1320],{},".\u002Fapps\u002Fharbourmaster"," action reference. For the EOS\nself-review exception, see\n",[1323,1324,1326],"a",{"href":1325},"..\u002Fexplanation\u002Fshared-action-trust-boundary#eos-self-review-is-an-invariant","The shared-action trust boundary",".",[453,1329,1330,1331,1333,1334,1338],{},"See ",[1323,1332,89],{"href":90}," after the\nworkflow is in place. See the\n",[1323,1335,1337],{"href":1336},"..\u002Freference\u002Fgithub-action","GitHub Action reference"," for inputs and\npermissions.",[483,1340,1342],{"id":1341},"validate-the-setup","Validate the setup",[453,1344,1345,1346,1348,1349,1351,1352,1355,1356,1359],{},"Open a non-draft pull request from a branch in the consuming repository. One\nnative ",[464,1347,466],{}," check should appear on the pull request. Opening\nthat check should show the label, checkout, and reviewer steps. The workflow\nshould apply ",[464,1350,470],{},", publish a ",[464,1353,1354],{},"Harbourmaster AI Review"," with a\n",[464,1357,1358],{},"COMMENT"," event, and finish successfully.",[453,1361,1362,1363,1365],{},"Push another commit while ",[464,1364,470],{}," is present and confirm that the\nnative check fails with a warning without running the reviewer. Remove and\nre-add the label as a human operator, then confirm that it reviews the new head\nSHA and replaces the failure with a successful check.",[453,1367,1368],{},"Mark a pull request as draft or open one from a fork. The review job should be\nskipped before checkout.",[450,1370,1371],{},[453,1372,1373,1376],{},[456,1374,1375],{},"!NOTE"," Harbourmaster reviews are advisory. Keep the repository's normal\nbuild, type-check, test, lint, formatting, documentation, and link checks\nenabled.",[453,1378,1379,1380,1327],{},"If a later check is skipped or fails, see\n",[1323,1381,93],{"href":94},[1383,1384,1385],"style",{},"html pre.shiki code .sZkSk, html code.shiki .sZkSk{--shiki-dark:#85E89D;--shiki-default:#22863A}html pre.shiki code .sQ3_J, html code.shiki .sQ3_J{--shiki-dark:#E1E4E8;--shiki-default:#24292E}html pre.shiki code .sg6BJ, html code.shiki .sg6BJ{--shiki-dark:#9ECBFF;--shiki-default:#032F62}html pre.shiki code .s0DvM, html code.shiki .s0DvM{--shiki-dark:#79B8FF;--shiki-default:#005CC5}html pre.shiki code .scx8i, html code.shiki .scx8i{--shiki-dark:#F97583;--shiki-default:#D73A49}html pre.shiki code .sryI4, html code.shiki .sryI4{--shiki-dark:#6A737D;--shiki-default:#6A737D}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":555,"searchDepth":582,"depth":582,"links":1387},[1388,1389,1390],{"id":485,"depth":576,"text":486},{"id":540,"depth":576,"text":541},{"id":1341,"depth":576,"text":1342},{},"md",{},{"title":77,"description":555},"kBDs5AfCcZrgr2S7gtUXDWGD6UF4UU-X-c37wQVncxQ",[1397,1398],{"title":68,"path":69,"stem":70,"children":-1},{"title":81,"path":82,"stem":83,"children":-1},1789777547973]