{
 "$schema": "https://agentdrives.com/schemas/tool.schema.json",
 "id": "prd_01m57vgth328zbnfbw1h714sxp",
 "ids": {
  "org": "org_01m57vgth30hmatr8ts0193m63",
  "surfaces": {
   "web": "srf_01m63472ysn6vp175n2d0qgadb",
   "api": "srf_01m63472ysg55pgrkha1jpvhdp",
   "mcp": "srf_01m63472yskkjhmfcrt2s8w4mw"
  },
  "slugs": [
   "codeberg"
  ],
  "domain": "codeberg.org",
  "wikidata": "Q106102182"
 },
 "slug": "codeberg",
 "name": "Codeberg",
 "url": "https://codeberg.org",
 "domain": "codeberg.org",
 "category": "source-control",
 "category_name": "Source control",
 "tested_at": "2026-10-28",
 "run": "20261028T234338Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261028T234338Z",
   "date": "2026-10-28",
   "level": 1,
   "engine": {
    "model": "claude-opus-5-5",
    "driver": 5,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "skip",
    "version": "2026.10.28",
    "commit": "99ae3421cf12ceb022f11490ba63dc427fd69aa3",
    "prompts": {
     "version": "2026.10.28",
     "commit": "99ae3421cf12ceb022f11490ba63dc427fd69aa3"
    },
    "rules": {
     "version": "2026.10.28",
     "commit": "3440e5c62c95160a8125825a987e36d623edd38d"
    }
   },
   "stop": "signup",
   "drives": 2,
   "paid": false,
   "agent_paid": null
  }
 ],
 "level": 1,
 "level_name": "Needs a person",
 "level_selfhost": 4,
 "entry": "closed",
 "door": {
  "passed": 0,
  "tries": 2,
  "self_start": false
 },
 "badges": [],
 "not_counted": null,
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "how": "robots"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "na",
   "text": "No plan to buy",
   "value": "nothing",
   "route": "none"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Learn",
   "state": "yes",
   "text": "Docs it can act on: an OpenAPI",
   "have": [
    "openapi"
   ],
   "docs": "gaps"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "how": "robots",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "na",
   "text": "No plan to buy",
   "value": "nothing",
   "route": "none",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "person",
   "label": "A person sets it up",
   "routes": [],
   "minutes": null,
   "core": null
  }
 ],
 "minutes": null,
 "next": {
  "to": 2,
  "text": "Next: let an agent sign up on its own"
 },
 "stop": "signup",
 "core": null,
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 55,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 55,
  "security": "private",
  "standards": []
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [
  {
   "capability": "Create a task or issue",
   "probe": "Create an issue without the required title",
   "outcome": "422 {\"message\": \"[Title]: Required\", \"url\": \"http://127.0.0.1:38431/api/swagger\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Open and merge a pull request",
   "probe": "Open a PR from a branch that does not exist",
   "outcome": "404 {\"message\": \"The target couldn't be found.\", \"url\": \"http://127.0.0.1:38431/api/swagger\", \"errors\": [\"could not find 'no-such-branch' to be a commit, branch or tag in the head repository agentdriv",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a code repository",
   "probe": "Read a repo that does not exist in our namespace",
   "outcome": "404 {\"message\": \"The target couldn't be found.\", \"url\": \"http://127.0.0.1:38431/api/swagger\", \"errors\": []}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Review a pull request",
   "probe": "Submit a review with a bad event value",
   "outcome": "404 {\"message\": \"GetPullRequestByIndex\", \"url\": \"http://127.0.0.1:38431/api/swagger\", \"errors\": [\"pull request does not exist [id: 0, issue_id: 0, head_repo_id: 0, base_repo_id: 1, head_branch: , base",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a code repository",
   "probe": "Repeat a repo create with the same name",
   "outcome": "409 {\"message\": \"The repository with the same name already exists.\", \"url\": \"http://127.0.0.1:38431/api/swagger\"}",
   "grade": "clear",
   "idempotent": "yes",
   "rate_limit": null
  },
  {
   "capability": "Create a task or issue",
   "probe": "Repeat one issue create with the same body and an Idempotency-Key",
   "outcome": "201 number 5; 201 number 6: two issues",
   "grade": "silent",
   "idempotent": "no",
   "rate_limit": null
  },
  {
   "capability": "Review a pull request",
   "probe": "Submit a review with a bad event value on an existing PR",
   "outcome": "200 {\"id\": 4, \"user\": {\"id\": 1, \"login\": \"…\", \"login_name\": \"\", \"source_id\": 0, \"full_name\": \"AgentDrives Test\", \"email\": \"the agent's inbox\", \"avatar_url\": \"http://127.0.0.1:38",
   "grade": "silent",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a code repository",
   "probe": "Burst of 15 quick reads of one repo",
   "outcome": "Counter({'200': 15}); rate-limit headers: none",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Create a code repository",
   "probe": "Call with a wrong token",
   "outcome": "401 {\"message\": \"token is malformed: token contains an invalid number of segments\\naccess token does not exist [sha: ••••]\\ntoke",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Open and merge a pull request",
   "probe": "Delete the head branch between opening and merging a PR",
   "outcome": "merge -> 500 {\"message\": \"branch does not exist [repo_id: 0 name: pf-br]\", \"url\": \"http://127.0.0.1:38431/api/swagger\"}; GET pulls/7 state open merged False; pf.txt on main -> 404",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": {
  "totals": {
   "items": 521,
   "documented": 521,
   "safe": 458,
   "exercised": 0,
   "passed": 0,
   "skipped": 63,
   "blocked": 458,
   "not_run": 0,
   "match": 0,
   "drift": 0,
   "broken_doc": 0,
   "docs_complete": 0,
   "docs_partial": 521,
   "docs_missing": 0,
   "errors_clear": 0,
   "errors_vague": 0,
   "errors_silent": 0
  }
 },
 "coverage_core": null,
 "coverage_own": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 5,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false
 },
 "methodology": 42,
 "rules_date": "2026-10-30",
 "engine": {
  "model": "claude-opus-5-5",
  "driver": 5,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "skip",
  "version": "2026.10.28",
  "commit": "99ae3421cf12ceb022f11490ba63dc427fd69aa3",
  "prompts": {
   "version": "2026.10.28",
   "commit": "99ae3421cf12ceb022f11490ba63dc427fd69aa3"
  },
  "rules": {
   "version": "2026.10.28",
   "commit": "3440e5c62c95160a8125825a987e36d623edd38d"
  }
 },
 "same_level_drives": 1,
 "drives": 2,
 "same_stop_drives": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "newer_drives": null,
 "nothing_to_pay": true,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "robots"
  },
  "signed": {
   "state": "robots",
   "kind": "signup",
   "at": "2026-10-29"
  },
  "browser": {
   "state": "unknown",
   "measured": false
  },
  "our_key": "pending",
  "robots": "closed",
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs.codeberg.org read (77 pages); no llms.txt, no Markdown pages, no agent page; the API spec on codeberg.org is robots-closed"
  },
  "signup": {
   "status": "blocked",
   "note": "robots.txt disallows sign-up for AI agents (/user/sign_up): the robots.txt group naming ChatGPT-User, ClaudeBot, GPTBot and other AI agents has \"Disallow: /\"",
   "cause": "robots_named"
  },
  "verify": {
   "status": "",
   "note": "Behind the sign-up: robots.txt disallows sign-up for AI agents (/user/sign_up)",
   "cause": "robots_named",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "No account; the token page (/user/settings/applications) and /api/ are closed by robots.txt",
   "cause": "robots_named",
   "via": "",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "No account; /api/ is disallowed for all user agents and the whole host for AI agents",
   "route": "account",
   "cause": "robots_named",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "No account: robots.txt disallows sign-up for AI agents (/user/sign_up)",
   "cause": "robots_named",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "n/a",
   "rails": [],
   "rail_ids": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "route": "none",
   "checkout": {
    "reached": "no",
    "processor": "none",
    "captcha": "none",
    "three_ds": "not_seen",
    "card_form": false,
    "phone_field": "none",
    "wallets": [],
    "rail_offer": "none",
    "price": "",
    "currency": "",
    "period": "",
    "plan": "",
    "last_button": ""
   },
   "person": null,
   "ours": null,
   "note": "Free product: the FAQ says \"we do not require payment for any specific service\"; donations (Liberapay, SEPA) and optional membership buy no service. No 402 anywhere; we paid nothing (no 402).",
   "reached": false
  },
  "cancel": {
   "status": "",
   "grade": "n/a",
   "note": "Nothing to cancel: no paid plan exists and the drive started nothing",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "No codeberg.org account was made (sign-up closed by robots.txt); nothing to delete",
   "account": false,
   "reached": false
  }
 },
 "routes": [
  {
   "route": "local",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "nothing",
   "fresh": true,
   "minutes": 3,
   "browser": false
  },
  {
   "route": "email_password",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "walled",
   "wall": {
    "type": "robots",
    "owner": "product"
   },
   "person": "none",
   "brings": "nothing",
   "fresh": true,
   "minutes": 0.1,
   "browser": null
  }
 ],
 "checkout": {
  "reached": "no",
  "rail_offer": "none"
 },
 "docs": {
  "at": "2026-10-28",
  "read": 77,
  "listed": 82,
  "sampled": false,
  "overall": "gaps",
  "getting_started": "found",
  "auth": "found",
  "errors": "partial",
  "examples": "good",
  "freshness": "fresh",
  "newest": "2026-10-26",
  "core_pages": "5 of 7",
  "capabilities": "gaps",
  "label": "Some gaps"
 },
 "claims": null,
 "pay_options": {
  "checked": "2026-10-28",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": null
  },
  "owner_fixes": []
 },
 "surfaces": {
  "api": true,
  "cli": false,
  "sdk": false,
  "mcp": "none",
  "llms_txt": false,
  "webhooks": true,
  "sandbox": false
 },
 "urls": {
  "docs": "https://docs.codeberg.org/",
  "llms_txt": null,
  "mcp": null
 },
 "surface_notes": {
  "api": "Forgejo REST API (/api/v1), robots-closed on codeberg.org",
  "webhooks": "repository webhooks, documented at docs.codeberg.org/advanced/using-webhooks"
 },
 "surface_sizes": [
  {
   "kind": "api",
   "listed": 512,
   "tested": 0
  },
  {
   "kind": "cli",
   "listed": 5,
   "tested": 0
  }
 ],
 "can_do": [
  "On a self-hosted Forgejo (the software Codeberg runs): sign up, get a scoped token and do the whole core without a browser: create a repo, push, open, review and merge a pull request, track issues and run Actions CI on a runner the agent registers"
 ],
 "cannot_do": [
  {
   "what": "Sign up or use any feature on codeberg.org",
   "why": "robots.txt closes the whole host to AI agents acting for a user, and /api/ to all user agents"
  },
  {
   "what": "Read the API spec on codeberg.org",
   "why": "/swagger.*.json is disallowed in robots.txt"
  },
  {
   "what": "Publish a site with Codeberg Pages",
   "why": "needs a codeberg.org account; Pages is not part of self-hosted Forgejo"
  }
 ],
 "blockers": [
  "robots.txt disallows sign-up for AI agents (/user/sign_up)"
 ],
 "tips_for_agents": [
  "On codeberg.org, respect robots.txt: there is no way in for a named agent. Run Forgejo yourself: image data.forgejo.org/forgejo/forgejo:<major>-rootless with FORGEJO__security__INSTALL_LOCK=true and sqlite3",
  "Get a Forgejo token with POST /api/v1/users/{user}/tokens (basic auth; add X-Forgejo-OTP once 2FA is on); scopes like read:repository are enforced",
  "Register CI runners with a token from GET /api/v1/user/actions/runners/registration-token: a repo-level runner ignores your other repos",
  "Approving your own PR is refused (422); submit a COMMENT review instead"
 ],
 "selfhost": {
  "install": {
   "status": "headless",
   "minutes": 3,
   "note": "Forgejo 17.0.1 (the software Codeberg runs. env FORGEJO__security__INSTALL_LOCK=true, DB_TYPE=sqlite3, ROOT_URL; restarted once with LFS_START_SERVER=true on the host network for LFS and migration. No migrations by hand. Pages, Weblate and hosted CI are Codeberg services, not in Forgejo."
  },
  "ladder": {
   "signup": {
    "status": "headless",
    "note": "Web Register form posted headless; no CAPTCHA, no mail confirmation on a fresh instance"
   },
   "verify": {
    "status": "n/a",
    "note": "No confirmation needed"
   },
   "credentials": {
    "status": "headless",
    "note": "POST /api/v1/users/{user}/tokens with basic auth"
   },
   "first_call": {
    "status": "headless",
    "note": "GET /api/v1/user -> 200"
   },
   "first_action": {
    "status": "headless",
    "note": "POST /api/v1/user/repos -> 201"
   },
   "delete": {
    "status": "browser",
    "note": "Data deleted by API; the web account delete refuses the instance's only admin (\"You cannot delete yourself when you are an admin\"); the account went with the instance",
    "left": "removed"
   },
   "pay": {
    "status": "n/a",
    "note": "Self-hosted: nothing to pay or cancel."
   },
   "cancel": {
    "status": "n/a",
    "note": "Self-hosted: nothing to pay or cancel."
   }
  },
  "coverage_core": 86,
  "coverage_source": "computed"
 },
 "edge_case": "none",
 "summary": "Our agent couldn't use hosted Codeberg: robots.txt has a group naming AI agents that act for a user (ChatGPT-User, ClaudeBot, GPTBot and others) with Disallow: /, which closes the sign-up, and /api/ is closed to all user agents. Its documented self-hosted route, Forgejo 17.0.1 (the software Codeberg runs), ran here without a browser, and an agent did the core there through the API and git except Pages: repos, pushes, pull requests, reviews, issues and Actions CI on a runner it registered. Codeberg Pages and its other hosted services stay out of reach.",
 "wall": "robots.txt closes Codeberg to AI agents",
 "plan_scope": "",
 "robots_stop": "signup",
 "robots": {
  "rule": "named",
  "step": "signup",
  "seen": "2026-10-28",
  "held": false
 },
 "terms": null,
 "terms_read": null,
 "email_gate": null,
 "plain": {
  "summary": "Codeberg is a free home for source code. Our agent couldn't sign up or use the hosted site, because its robots.txt file closes it to AI agents. The agent could run the same software (Forgejo) on its own machine and do nearly all the core work there without help.",
  "can_do": [
   "On its own copy of the software, create a repository and push code",
   "On its own copy, open, review and merge a pull request",
   "On its own copy, track issues and run automated builds on a runner it set up",
   "Read the public documentation site"
  ],
  "cannot_do": [
   {
    "what": "Sign up or use anything on codeberg.org",
    "why": "robots.txt closes the whole site to AI agents acting for a user"
   },
   {
    "what": "Read the API description on codeberg.org",
    "why": "robots.txt disallows it for all user agents"
   },
   {
    "what": "Publish a website with Codeberg Pages",
    "why": "It needs a codeberg.org account and is not in the self-hosted software"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "capability": "Create a code repository",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/user/repos",
    "mcp": null,
    "cli": null,
    "ui": "+ menu > New Repository"
   },
   "check": "GET /api/v1/repos/{owner}/{repo} returns the new repo",
   "capability_id": "cap_xcgt50hx",
   "source": "https://docs.codeberg.org/getting-started/first-repository/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-02",
   "capability": "Push commits to a repository",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "git push",
    "ui": "web editor commit"
   },
   "check": "repo commit list shows the new commit via GET /api/v1/repos/{owner}/{repo}/commits",
   "capability_id": "cap_dzrmp5j9",
   "source": "https://docs.codeberg.org/git/clone-commit-via-cli/",
   "result": "blocked",
   "via": "cli"
  },
  {
   "id": "cap-03",
   "capability": "Open and merge a pull request",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/repos/{owner}/{repo}/pulls",
    "mcp": null,
    "cli": null,
    "ui": "repo > Pull Requests > New"
   },
   "check": "GET /api/v1/repos/{owner}/{repo}/pulls/{index} shows state merged",
   "capability_id": "cap_p32gmnqr",
   "source": "https://docs.codeberg.org/collaborating/pull-requests-and-git-flow/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-04",
   "capability": "Review a pull request",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/repos/{owner}/{repo}/pulls/{index}/reviews",
    "mcp": null,
    "cli": null,
    "ui": "PR Files Changed tab"
   },
   "check": "GET /api/v1/repos/{owner}/{repo}/pulls/{index}/reviews lists the review",
   "capability_id": "cap_gbrba2xt",
   "source": "https://docs.codeberg.org/collaborating/pull-requests-and-git-flow/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-05",
   "capability": "Create a task or issue",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/repos/{owner}/{repo}/issues",
    "mcp": null,
    "cli": null,
    "ui": "repo > Issues > New Issue"
   },
   "check": "GET /api/v1/repos/{owner}/{repo}/issues/{index} returns the issue",
   "capability_id": "cap_kzejkm30",
   "source": "https://docs.codeberg.org/getting-started/issue-tracking-basics/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-06",
   "capability": "Run a CI/CD workflow",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "repo > Actions / Woodpecker CI pipeline"
   },
   "check": "Woodpecker/Actions run page shows a completed pipeline for the pushed commit",
   "capability_id": "cap_r6y9w5sx",
   "source": "https://docs.codeberg.org/ci/",
   "result": "blocked",
   "via": "browser"
  },
  {
   "id": "cap-07",
   "capability": "Publish a website",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "repo Settings > Pages / push to pages branch"
   },
   "check": "https://{user}.codeberg.page/{repo} serves the published content",
   "capability_id": "cap_3s9vd3rp",
   "source": "https://docs.codeberg.org/codeberg-pages/",
   "result": "blocked",
   "via": "browser"
  },
  {
   "id": "cap-08",
   "capability": "Deploy a serverless function",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": null,
   "capability_id": null,
   "unmapped": "not_a_job",
   "source": "https://docs.codeberg.org/ci/",
   "result": "blocked",
   "via": "browser"
  },
  {
   "id": "cap-09",
   "capability": "Create a repository wiki page",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/repos/{owner}/{repo}/wiki/page",
    "mcp": null,
    "cli": "git push to wiki.git",
    "ui": "repo > Wiki > New Page"
   },
   "check": "GET /api/v1/repos/{owner}/{repo}/wiki/page/{title} returns the page",
   "capability_id": "cap_yvyjytn1",
   "source": "https://docs.codeberg.org/getting-started/wiki/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-10",
   "capability": "Publish a release",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/repos/{owner}/{repo}/releases",
    "mcp": null,
    "cli": null,
    "ui": "repo > Releases > New Release"
   },
   "check": "GET /api/v1/repos/{owner}/{repo}/releases/{id} shows the release with assets",
   "capability_id": "cap_4wthbqyz",
   "source": "https://docs.codeberg.org/git/using-tags/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-11",
   "capability": "Store large files with Git LFS",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "git lfs track / push",
    "ui": "repo Settings > LFS"
   },
   "check": "repo Settings > LFS Files lists the tracked large file",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://docs.codeberg.org/git/using-lfs/",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-12",
   "capability": "Create a user group",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/orgs/{org}/teams",
    "mcp": null,
    "cli": null,
    "ui": "org > Teams > Create Team"
   },
   "check": "GET /api/v1/teams/{id} returns the team",
   "capability_id": "cap_yn12vxg9",
   "source": "https://docs.codeberg.org/collaborating/create-organization/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-13",
   "capability": "Create a workspace",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/orgs",
    "mcp": null,
    "cli": null,
    "ui": "+ menu > New Organization"
   },
   "check": "GET /api/v1/orgs/{org} returns the organization",
   "capability_id": "cap_vk1kvzkm",
   "source": "https://docs.codeberg.org/collaborating/create-organization/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-14",
   "capability": "Set a member's role or permissions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api/v1/teams/{id}/members/{username}",
    "mcp": null,
    "cli": null,
    "ui": "org > Teams > permissions"
   },
   "check": "team permissions page shows the updated access level",
   "capability_id": "cap_bs3hvrpm",
   "source": "https://docs.codeberg.org/collaborating/repo-permissions/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-15",
   "capability": "Invite a member",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api/v1/repos/{owner}/{repo}/collaborators/{collaborator}",
    "mcp": null,
    "cli": null,
    "ui": "repo Settings > Collaborators > Add Collaborator"
   },
   "check": "GET /api/v1/repos/{owner}/{repo}/collaborators lists the invited user",
   "capability_id": "cap_3w8sjh12",
   "source": "https://docs.codeberg.org/collaborating/invite-collaborators/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-16",
   "capability": "Register a webhook",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/repos/{owner}/{repo}/hooks",
    "mcp": null,
    "cli": null,
    "ui": "repo Settings > Webhooks > Add Webhook"
   },
   "check": "GET /api/v1/repos/{owner}/{repo}/hooks lists the webhook",
   "capability_id": "cap_977hxacb",
   "source": "https://docs.codeberg.org/advanced/using-webhooks/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-17",
   "capability": "Migrate a repository from another host",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/repos/migrate",
    "mcp": null,
    "cli": null,
    "ui": "+ menu > New Migration"
   },
   "check": "GET /api/v1/repos/{owner}/{repo} shows the migrated history and issues",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://docs.codeberg.org/advanced/migrating-repos/",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-18",
   "capability": "Create an API key",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/users/{username}/tokens",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Applications > Generate New Token"
   },
   "check": "GET /api/v1/users/{username}/tokens lists the new access token",
   "capability_id": "cap_wbg916v9",
   "source": "https://docs.codeberg.org/advanced/access-token/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-19",
   "capability": "Enable two-factor authentication",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Security > Two-Factor Authentication"
   },
   "check": "Settings > Security shows TOTP/WebAuthn enabled",
   "capability_id": "cap_9qz744jy",
   "source": "https://docs.codeberg.org/security/2fa/",
   "result": "blocked",
   "via": "browser"
  },
  {
   "id": "cap-20",
   "capability": "Add a self-hosted CI agent",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "woodpecker-agent / forgejo-runner register",
    "ui": "org Settings > Actions/Runners"
   },
   "check": "runner/agent list in org settings shows the new agent online",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://docs.codeberg.org/ci/agents/",
   "result": "blocked",
   "via": "cli"
  },
  {
   "id": "cap-21",
   "capability": "Resolve merge conflicts",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "git rebase/merge",
    "ui": "PR conflict resolution editor"
   },
   "check": "PR mergeable status changes from conflict to clean",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://docs.codeberg.org/collaborating/resolve-conflicts/",
   "result": "blocked",
   "via": "cli"
  },
  {
   "id": "cap-22",
   "capability": "Connect a custom domain to a Pages site",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "repo Pages settings / DNS CNAME"
   },
   "check": "custom domain serves the Pages site content",
   "capability_id": "cap_dj4n5a69",
   "source": "https://docs.codeberg.org/codeberg-pages/using-custom-domain/",
   "result": "blocked",
   "via": "browser"
  },
  {
   "id": "cap-23",
   "capability": "Search a product directory",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/v1/repos/search",
    "mcp": null,
    "cli": null,
    "ui": "/explore/repos"
   },
   "check": "search results page lists matching repositories",
   "capability_id": "cap_wd6q1cae",
   "source": "https://codeberg.org/explore/repos",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-24",
   "capability": "Translate a project's strings",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "translate.codeberg.org component"
   },
   "check": "Weblate component shows the new translated string committed",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://docs.codeberg.org/codeberg-translate/introduction-to-weblate/",
   "result": "blocked",
   "via": "browser"
  },
  {
   "id": "cap-25",
   "capability": "Set repository and profile visibility",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /api/v1/repos/{owner}/{repo}",
    "mcp": null,
    "cli": null,
    "ui": "repo Settings > Visibility"
   },
   "check": "repo settings page shows private/public state changed",
   "capability_id": null,
   "unmapped": "not_a_job",
   "source": "https://docs.codeberg.org/collaborating/repo-permissions/",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-26",
   "capability": "Change account settings",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /api/v1/user/settings",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Profile"
   },
   "check": "Settings > Profile shows the updated field",
   "capability_id": "cap_q235vpxt",
   "source": "https://docs.codeberg.org/getting-started/email-settings/",
   "result": "blocked",
   "via": "api"
  }
 ],
 "stale": false,
 "unreachable_since": null,
 "not_driven_since": null,
 "icon": "/logos/codeberg.png",
 "agent_kinds": {
  "browser": {
   "who": "An assistant in a browser",
   "passed": [],
   "stop": "signup",
   "why": "its robots.txt disallows AI agents there",
   "tone": "wall",
   "text": "Stops at sign-up: its robots.txt disallows AI agents there."
  },
  "direct": {
   "who": "An agent talking to it directly",
   "passed": [],
   "stop": "signup",
   "why": "its robots.txt disallows AI agents there",
   "tone": "wall",
   "text": "Stops at sign-up: its robots.txt disallows AI agents there."
  }
 },
 "sdk": {
  "packages": [],
  "read_at": "2026-11-01T20:55:41Z"
 },
 "surface_reach": {
  "surfaces": {
   "cli": true
  },
  "read_at": "2026-10-31T01:07:18Z"
 },
 "connect": {
  "cli": {
   "install": "pipx install codeberg-cli",
   "package": "codeberg-cli",
   "ecosystem": "pypi",
   "source": "https://pypi.org/project/codeberg-cli/",
   "state": "documented"
  },
  "docs": {
   "url": "https://docs.codeberg.org/",
   "state": "tested"
  }
 },
 "surface_sources": {
  "docs": "https://docs.codeberg.org/",
  "cli": "https://pypi.org/project/codeberg-cli/",
  "api": "https://codeberg.org/api/swagger"
 },
 "copilot_connector": null,
 "stripe_directory": null,
 "in_stripe_directory": null,
 "stripe_projects": null,
 "pay_rails": [],
 "stop_evidence": {
  "at": "signup",
  "date": "2026-10-28",
  "line": "robots.txt disallows sign-up for AI agents (/user/sign_up): the robots.txt group naming ChatGPT-User, ClaudeBot, GPTBot and other AI agents has \"Disallow: /\""
 },
 "wall_vendor": null,
 "mcp_sign_in": null,
 "safety_issues": 0,
 "fix_counts": {
  "small": 4,
  "medium": 0,
  "large": 0,
  "total": 4
 },
 "evidence_sha256": "af58e0395d9d6b7159ea36add4f622d8d9baff68db40aa5039934d5b7ac16cc2",
 "first_seen": "2026-10-28",
 "license": {
  "name": "CC BY 4.0",
  "url": "https://creativecommons.org/licenses/by/4.0/"
 },
 "correction": {
  "status": "none",
  "open": 0,
  "since": null,
  "reply_by": null
 },
 "attribution": null,
 "confirmation": {
  "state": "awaiting",
  "drives": 2,
  "agree": 2,
  "review": null,
  "text": "2 drives on one day, awaiting confirmation"
 },
 "stop_shot": null,
 "stop_shot_hash": null,
 "attempts_count": 155,
 "detail": {
  "public": false,
  "in": [
   "report",
   "api"
  ],
  "since": "2026-10-17"
 },
 "what_it_does": "Codeberg is a free home for source code.",
 "kind": "product",
 "rules_version": "rules-2026-10-30-42",
 "rules_url": "https://agentdrives.com/method/changelog#rules-2026-10-30-42",
 "category_median": null,
 "peers": {
  "DOCS-08": {
   "basis": "all",
   "n": 142,
   "below": 88,
   "above": 0,
   "percentile": 81
  },
  "DOCS-10": {
   "basis": "all",
   "n": 142,
   "below": 0,
   "above": 103,
   "percentile": 14
  },
  "DOCS-11": {
   "basis": "all",
   "n": 142,
   "below": 10,
   "above": 44,
   "percentile": 38
  },
  "ERR-02": {
   "basis": "all",
   "n": 105,
   "below": 0,
   "above": 65,
   "percentile": 19
  },
  "ERR-03": {
   "basis": "all",
   "n": 104,
   "below": 81,
   "above": 0,
   "percentile": 89
  },
  "ERR-04": {
   "basis": "all",
   "n": 36,
   "below": 0,
   "above": 12,
   "percentile": 33
  },
  "ERR-07": {
   "basis": "all",
   "n": 104,
   "below": 0,
   "above": 70,
   "percentile": 16
  },
  "IN-11": {
   "basis": "category",
   "n": 5,
   "below": 0,
   "above": 1
  },
  "IN-12": {
   "basis": "category",
   "n": 5,
   "below": 2,
   "above": 0
  },
  "LEAVE-03": {
   "basis": "all",
   "n": 145,
   "below": 0,
   "above": 89,
   "percentile": 19
  },
  "LIM-02": {
   "basis": "all",
   "n": 48,
   "below": 0,
   "above": 21,
   "percentile": 28
  },
  "PROTO-02": {
   "basis": "category",
   "n": 5,
   "below": 0,
   "above": 0
  }
 },
 "probe": {
  "checked": "2026-11-01",
  "status": "ok",
  "sign_up_page": "robots",
  "wall": "robots",
  "llms_txt": false,
  "mcp": "none",
  "openapi": false,
  "payment_402": null,
  "payment_rails": [],
  "files": {
   "openapi": {
    "url": null,
    "found": false
   },
   "llms_txt": {
    "url": null,
    "found": false
   },
   "llms_full": {
    "url": null,
    "found": false
   }
  }
 },
 "probe_history": [
  {
   "checked": "2026-11-01",
   "status": "ok",
   "sign_up_page": "robots",
   "wall": "robots",
   "llms_txt": false,
   "mcp": "none",
   "openapi": false,
   "payment_402": null,
   "payment_rails": []
  },
  {
   "checked": "2026-10-31",
   "status": "ok",
   "sign_up_page": "robots",
   "wall": "robots",
   "llms_txt": false,
   "mcp": "none",
   "openapi": false,
   "payment_402": null,
   "payment_rails": []
  },
  {
   "checked": "2026-10-30",
   "status": "ok",
   "sign_up_page": "robots",
   "wall": "robots",
   "llms_txt": false,
   "mcp": "none",
   "openapi": false,
   "payment_402": null,
   "payment_rails": []
  }
 ],
 "surface_changes": [],
 "agent_reports": null,
 "verdict": "L1 · Needs a person: hosted Codeberg stopped our agent at sign-up. The robots.txt group naming ChatGPT-User, ClaudeBot, GPTBot and other AI agents has \"Disallow: /\", which closes /user/sign_up. With no account, the token page, the API and the delete step were not reached. Our agent read docs.codeberg.org, and the API spec on codeberg.org is robots-closed. On the documented self-hosted route, Forgejo, the software Codeberg runs, an agent did the core work through the API and git: repos, pushes, pull requests, reviews, issues and Actions CI on a runner it registered. Codeberg Pages and its other hosted services were not reached. Codeberg is free, so there was nothing to pay or cancel.",
 "changes": {
  "source": "store",
  "drives": [
   {
    "run": "20261028T074734Z",
    "date": "2026-10-28",
    "level": 1,
    "stop": "signup",
    "entry": "closed",
    "driver": 5,
    "listed": true,
    "paid": false,
    "agent_paid": null
   },
   {
    "run": "20261028T234338Z",
    "date": "2026-10-28",
    "level": 1,
    "stop": "signup",
    "entry": "closed",
    "driver": 5,
    "listed": true,
    "paid": false,
    "agent_paid": null
   }
  ],
  "events": [],
  "feed": "https://agentdrives.com/api/tools/codeberg/changes.json"
 },
 "agreement": {
  "drives": 2,
  "agree": 2
 },
 "method_release": "2026-Q4.27",
 "found": {
  "agent_blockers": 1,
  "surface_issues": 0
 },
 "agent_surfaces": {
  "api": {
   "state": "documented",
   "reachable": null,
   "documented": 512,
   "tested": 0,
   "source": "https://codeberg.org/api/swagger"
  },
  "mcp": {
   "state": "none_found",
   "reachable": null,
   "documented": null,
   "tested": null,
   "source": null
  },
  "cli": {
   "state": "documented",
   "reachable": true,
   "documented": 5,
   "tested": 0,
   "source": "https://pypi.org/project/codeberg-cli/"
  },
  "sdk": {
   "state": "none_found",
   "documented": null,
   "tested": null,
   "source": null
  },
  "docs": {
   "state": "tested",
   "documented": 82,
   "tested": 77,
   "source": "https://docs.codeberg.org/"
  },
  "payment": {
   "state": "none_found",
   "documented": null,
   "tested": null,
   "source": null
  }
 },
 "issues_found": 1,
 "rank": null,
 "rank_of": 1,
 "rank_change": null,
 "rank_since": null,
 "links": {
  "category": [
   {
    "label": "Developer platform",
    "href": "https://agentdrives.com/categories/developer"
   },
   {
    "label": "Source control",
    "href": "https://agentdrives.com/categories/source-control"
   }
  ],
  "tasks": [],
  "walls": [],
  "vendors": [],
  "standards": [],
  "steps": [
   {
    "label": "Find",
    "href": "https://agentdrives.com/access/find"
   },
   {
    "label": "Get in",
    "href": "https://agentdrives.com/access/get-in",
    "note": "stopped here"
   },
   {
    "label": "Use",
    "href": "https://agentdrives.com/access/use"
   },
   {
    "label": "Pay",
    "href": "https://agentdrives.com/access/pay"
   },
   {
    "label": "Leave",
    "href": "https://agentdrives.com/access/leave"
   }
  ],
  "rivals": [
   {
    "label": "Bitbucket",
    "href": "https://agentdrives.com/tools/bitbucket",
    "slug": "bitbucket",
    "level": 1
   },
   {
    "label": "Gitea",
    "href": "https://agentdrives.com/tools/gitea",
    "slug": "gitea",
    "level": 1
   },
   {
    "label": "GitHub",
    "href": "https://agentdrives.com/tools/github",
    "slug": "github",
    "level": 1
   }
  ],
  "compare": [],
  "rail": [
   {
    "label": "Watch this product",
    "href": "https://agentdrives.com/watch"
   },
   {
    "label": "Get the data",
    "href": "https://agentdrives.com/data#plans"
   }
  ]
 },
 "capability_matrix": [
  {
   "id": "cap-01",
   "name": "Create a code repository",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-02",
   "name": "Push commits to a repository",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "blocked",
    "ui": "untried"
   }
  },
  {
   "id": "cap-03",
   "name": "Open and merge a pull request",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-04",
   "name": "Review a pull request",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-05",
   "name": "Create a task or issue",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-06",
   "name": "Run a CI/CD workflow",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "blocked"
   }
  },
  {
   "id": "cap-07",
   "name": "Publish a website",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "blocked"
   }
  },
  {
   "id": "cap-08",
   "name": "Deploy a serverless function",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "blocked"
   }
  },
  {
   "id": "cap-09",
   "name": "Create a repository wiki page",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-10",
   "name": "Publish a release",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-11",
   "name": "Store large files with Git LFS",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-12",
   "name": "Create a user group",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-13",
   "name": "Create a workspace",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-14",
   "name": "Set a member's role or permissions",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-15",
   "name": "Invite a member",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-16",
   "name": "Register a webhook",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-17",
   "name": "Migrate a repository from another host",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-18",
   "name": "Create an API key",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-19",
   "name": "Enable two-factor authentication",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "blocked"
   }
  },
  {
   "id": "cap-20",
   "name": "Add a self-hosted CI agent",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "blocked",
    "ui": "untried"
   }
  },
  {
   "id": "cap-21",
   "name": "Resolve merge conflicts",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "blocked",
    "ui": "untried"
   }
  },
  {
   "id": "cap-22",
   "name": "Connect a custom domain to a Pages site",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "blocked"
   }
  },
  {
   "id": "cap-23",
   "name": "Search a product directory",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-24",
   "name": "Translate a project's strings",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "blocked"
   }
  },
  {
   "id": "cap-25",
   "name": "Set repository and profile visibility",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-26",
   "name": "Change account settings",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  }
 ],
 "category_place": {
  "category": "source-control",
  "products": 5,
  "higher": 1,
  "same_level": 3,
  "as_of": "2026-10-29",
  "stop": "signup",
  "rivals_by": "stop",
  "rivals": [
   "bitbucket",
   "gitea",
   "github"
  ]
 },
 "page": "https://agentdrives.com/tools/codeberg?via=api"
}