tuturuuu-bot is a private GitHub App owned by tutur3u, installed only on
tutur3u/platform. Its sole purpose is local agent feature-branch pushes and PR
creation. Release automation retains its own identity and credentials. The App’s
webhook is inactive and it subscribes to no events.
Owner provisioning checklist
Only the owner performs credential setup, outside agent sessions and recordings.- Review
.github/tuturuuu-bot/manifest.json. Submit that JSON as themanifestform field in a POST tohttps://github.com/organizations/tutur3u/settings/apps/new, following the GitHub manifest flow. A GET link does not submit the manifest. Use an owner-controlled form/callback, randomstate, and a local copy with itsredirect_url; verify callback state. Exchange the temporary code atPOST https://api.github.com/app-manifests/{code}/conversionswithin one hour. Route the credential-bearing response directly to the owner’s credential manager, never terminal output, git, chat or an agent. No callback service is deployed here. If no trusted callback exists, use Organization settings → Developer settings → GitHub Apps → New GitHub App, transcribe the manifest, disable the webhook, select Only on this account and generate the key there. - Confirm the available slug is
tuturuuu-bot, private visibility and exactly the permissions below. Click Install App → tutur3u → Only select repositories → platform → Install. Do not select all repositories. Record the numeric App ID and installation ID privately as configuration; these IDs are not secrets. - Import the private key through the owner-controlled Keychain Access interface
into a generic password item with service
tuturuuu-bot-private-key. Do not grant blanket application access. If usingsecurity add-generic-password, create it without-Aor-T; never put the PEM on the command line or in shell history. Remove any automatically trusted applications in Access Control and require confirmation for access. Never click Always Allow. Approve Allow only for an expected operation after verifying its requester. - Set non-secret
TUTURUUU_BOT_APP_IDandTUTURUUU_BOT_INSTALLATION_IDin the trusted local launcher session. No workflow in this change mints an App token. Do not createTUTURUUU_BOT_PRIVATE_KEYas an Actions repository secret or environment secret. The key is needed only locally. A repo variable of the same App ID name is unnecessary for this local-only design. - Before any future workflow minting is considered, a dedicated GitHub
environment is a required precondition: configure its deployment-branch
policy for main and production only, protect it with owner review, put
TUTURUUU_BOT_PRIVATE_KEYonly in that environment, and require every minting job to declareenvironment:. Never put the key in a repository secret or allow arbitrary branch/fork code to consume it. This is future scope requiring owner approval; creating the environment or changing settings is not done here. - Recommended defense in depth: platform → Settings → Rules → Rulesets → New
tag ruleset, target the actual release tag patterns (for example
v*and package-prefixed release tags from Release Please), enable Restrict updates and Restrict deletions, and keep the App outside bypass lists. Confirm the selected patterns cover real tags and do not block first-time release tag creation. Only the owner applies repo settings; this PR does not apply them. - Add an owner-managed branch ruleset restricting updates to
release-please--branches--*, with access limited to the intended release writer and no agent-bot bypass. Review creation/deletion protections as well. If the release PAT and agents sharevhpx, GitHub cannot distinguish their processes through an actor-based ruleset; isolating the release writer’s credentials/principal remains necessary. This PR does not apply the ruleset. - Verify a narrowly scoped push to an owned task branch, then PR creation. Check
the PR author is
tuturuuu-bot[bot], its human approval gate remains required, and the token is revoked. Do not dispatch release/publication jobs to test this local identity. Do not retireRELEASE_PLEASE_TOKEN: releases still use it.
Permissions and retained identities
No issues permission is needed to create PRs. No actions, workflows, checks,
administration, deployments or secrets permission is granted. The bot is never a
ruleset bypass actor. The helper cannot push workflow files with this token;
workflow-changing work needs a separately authorized identity and review.
The release approval guard preserves the original
github-actions[bot] author
allowlist, together with release-branch, commit-subject and generated-file gates.
A type: Bot flag does not confer authority. vhpx-authored release PRs remain
ineligible for automatic approval even if an override includes that login.
The workflow and core pin RELEASE_PLEASE_AUTHORS to github-actions[bot] only.
GitHub resolves commit.author.login from author email, which can be spoofed.
Matching that login and a generated-looking subject/file set is a heuristic, not
proof that release automation created or pushed the commit. The owner-managed
release-branch ruleset and isolated writer credentials are needed to restrict
who can update the branch. Neither the allowlist nor this PR establishes trusted
commit provenance. Existing self-review refusal remains a blocked outcome.
Local usage
Run from trusted code on an owner-controlled macOS host:git push origin HEAD:<task-branch>. Task branches use the
repository’s feature/fix/chore/docs and related authored prefixes; names use
letters, numbers, underscores, hyphens and slash-separated components. The helper
rejects omitted/multiple refspecs, implicit destinations, protected/release/tag
refs, deletion refspecs, force options, --delete, -d, --mirror, --all,
--tags, --receive-pack, --exec and all other push flags. Git’s normal
non-fast-forward checks remain in force. The wrapper replaces the origin label
with https://github.com/tutur3u/platform.git and sends exactly
HEAD:refs/heads/<task-branch>. It disables automatic tag following with
push.followTags=false and disables local hooks with both --no-verify and
core.hooksPath=/dev/null, so pre-push hooks do not receive the child token.
PR creation requires exactly one --head <task-branch> using the same task-branch
validation as pushes. Supported options are parsed before credential access;
missing/duplicate/ambiguous heads and another repository are refused. The helper
sets GH_PROMPT_DISABLED=1 to prevent interactive branch-push prompts. It accepts
only that gh pr create form and the constrained git push form. All
gh pr review invocations (including --approve and -a), token-inspection
commands, gh api and other executables are refused before Keychain access.
Only explicit contents and pull_requests scope inputs are accepted; metadata
read is implicit. It always requests repository platform and uses the fixed
GitHub API origin without redirects or automatic retries.
Private keys are read only with macOS security find-generic-password, signed
in memory and never supplied to the child. File/env private keys and token-printing
modes are forbidden. Installation tokens go only to the child environment.
Temporary Git credential config overrides cached personal credentials without
writing credentials/config to disk. The helper does not call gh auth login or
gh auth setup-git. Auth tracing/config override environment variables are stripped.
GH_HOST and the default GH_REPO are fixed; pass --repo tutur3u/platform to gh.
No 1Password adapter is implemented.
Threat model, rotation and revocation
The trusted boundary includes the host user, Keychain ACLs, wrapper source, Node, Git, gh, PATH, repository hooks/config, editor and child command. Keychain is not an agent sandbox. Same-user processes may prompt for the same key, and a mistaken Allow can release it. Never use Always Allow. A compromised same-user tool, child, debugger or hook can steal memory/environment credentials. Recommended future hardening is a separate-user or biometric signing broker that retains the private key, requires user presence and enforces repository/permission/request policy while returning only short-lived scoped tokens. That broker is not implemented here; the current wrapper handles the key in its own process memory. Child output is inherited, so a compromised child can print credentials. Local push hooks are disabled; this does not sandbox the host tools or Git configuration. Never use HTTP/shell tracing, credential inspection or commands that persist auth. Error messages from signing, Keychain, API response bodies and subprocess exceptions are replaced with fixed messages. The wrapper itself never logs or writes the key or token. It preserves child status and attempts revocation on normal exit, child failure and errors after minting. Requests have 15-second deadlines and the child has a 50-minute deadline. Abrupt termination, host/network failure or an unknown mint response may leave a token alive until expiry (within one hour). Do not blindly replay an unknown push/PR outcome: inspect the remote state first. For rotation, the owner creates a second key in App settings, privately replaces the Keychain item, verifies a scoped operation, then deletes the old App key and any temporary download. Removing a private key alone may not revoke issued tokens. Explicitly revoke them or suspend the installation if needed. For an emergency, Organization settings → GitHub Apps → tuturuuu-bot → Suspend/Uninstall, delete compromised App keys/Keychain items, review the audit log and reconcile writes before resuming. No Actions secret should exist to rotate in this design; remove any leftover App repository secret from an earlier owner experiment. Owner revocation/setting actions are never performed automatically by agents.Human review and follow-up
Bot-authored PRs are normal PRs.vhpx is a separate principal, so vhpx’s approval
counts independently subject to repository rules. PR authorship comes from the
token used at creation; commit coauthor trailers do not determine it. This bootstrap
PR may use the existing identity until the App is provisioned.
The bot must never approve PRs or be a bypass actor. CODEOWNERS work in #6491
assigns sensitive paths to human @vhpx; it does not remove the App’s underlying
GitHub review capability. After #6456 merges, its classifier lane should add a
default-branch-code check that fails any PR approved by tuturuuu-bot[bot].
This is a required follow-up, not a guarantee provided here. Classifier files and
#6456’s workflows are untouched.
Other reserved workflows remain owned by their current lanes: discord-modal-deploy,
supabase-staging, supabase-production, production-package-resume,
release-please-transient-retry and security-checks/classifier. No App migration is
planned for them under this narrow purpose. Setup-node and action-hardening changes
also remain with their owners.
Inventory and verification
Generate a current audit report on demand:TUTURUUU_BOT_ or
tuturuuu-bot-token, including non-minting jobs and comments. Any future Actions
proposal must separately review this local-only guard and the required environment
boundary before enabling minting; no workflow is currently authorized to use it.
Run focused tests through the shared resource queue: