Skip to content

docs: business-first org profile and registry-driven GitHub metadata - #47

Open
abrichr wants to merge 14 commits into
mainfrom
docs/business-clarity-profile
Open

abrichr wants to merge 14 commits into
mainfrom
docs/business-clarity-profile

Conversation

@abrichr

@abrichr abrichr commented Oct 10, 2026 •

Copy link
Copy Markdown
Member

This rewrites the OpenAdaptAI organization profile so that a business reader learns from the first screen what OpenAdapt does, what changes for their team, and how to start. It corrects the fault-test figure: the screen-only check passed 54 of the 72 runs that left the record wrong, not "54 of 90". It also makes repository-lifecycle.yml the source of truth for the GitHub settings that visitors see, and it adds a script that an owner runs to apply them after merge.

What changes

Organization profile (profile/README.md)

  • Opens with the launcher README's headline: OpenAdapt enters approved information into the systems your team already uses, and then it checks that the entry saved.
  • Adds a before-and-after table for a faxed referral. The baseline of about 10 to 12 minutes cites two hospital time studies, and the profile says that nobody has measured an "after" time with OpenAdapt yet.
  • Lists the five ways a run can end in plain terms. Only "Stopped before saving" says that nothing was written.
  • Offers two paths: hand off a workflow, or run openadapt quickstart --break-it yourself. The billing-audit case study is withdrawn, so the profile doesn't link to it.
  • Changes the install command from pip install --upgrade 'openadapt[browser]' and openadapt quickstart to pip install --upgrade openadapt and openadapt quickstart --break-it. In the current release (1.16.0), the base openadapt package already includes browser support, and the CLI has --break-it.
  • Moves developer content below the business sections and adds a table that maps each plain result to its engine outcome.
  • Restates the fault test with the correct counts (54, 9, and 0 of 72) and the 9 of 18 correct saves that every check stopped.
  • Removes the historical MockMed comparison (100/100 and 20/20 runs, 4.9s and 37.5s median, $0 and $0.27 a run) and the "Install OpenAdapt" and "Read the docs" links in the top row. The OpenEMR and fault-test results stay. The docs are still linked from "Run it yourself".

Registry and checks

  • repository-lifecycle.yml holds the organization description and website, the headline, the six pins, and a description, website, and topic list for 29 repositories. ehr-integration-directory replaces openadapt-evals among the pins and joins Support.
  • Schema change: public_metadata.repository_descriptions (description only) is replaced by public_metadata.repositories (description, homepage, and topics). schema_version stays 2. A code search of the organization found no other reader of the old key, and the lifecycle validator reads only the lifecycle and public_surfaces groups.
  • New scripts/github_metadata.py reads the registry without a YAML dependency and enforces GitHub's topic and pin limits and short-copy rules.
  • scripts/check_profile.py checks the pins, lifecycle labels, plain terms in business-facing copy, section order, the headline, the absence of "54 of 90", and that the apply script matches the registry.
  • benchmark-claims.json binds the 12 figures on the new profile to pinned artifacts and drops the entries for the removed figures.
  • README.md replaces the manual list of GitHub settings with the apply-script steps. REPOSITORY_LIFECYCLE.md adds ehr-integration-directory to Support and uses sentence-case headings.

Apply script (.overhaul/APPLY.sh, rendered from the registry)

  • The default is a dry run that prints each gh command and calls nothing.
  • --apply requires an organization owner, reports each failed command, and then compares every value on GitHub with the registry.
  • --verify only reads. It exits 0 only when everything matches, and 2 when only the hand-set pins remain.

Screenshots

Before After
Before: the first screen of the org profile opens with engineering terms and a pip command. After: the first screen says what OpenAdapt does in plain words and compares a faxed referral today and with OpenAdapt.
Before: the first screen of the org profile opens with engineering terms and a pip command. After: the first screen says what OpenAdapt does in plain words and compares a faxed referral today and with OpenAdapt.
Before After
Before: the fault test pairs 75.0% with "54 of 90 runs", which is the wrong denominator. After: the fault test reports 54 of 72 wrong records (75.0%), the claim of record, plus the runs every check stopped.
Before: the fault test pairs 75.0% with "54 of 90 runs", which is the wrong denominator. After: the fault test reports 54 of 72 wrong records (75.0%), the claim of record, plus the runs every check stopped.

After: developers get a table that maps each plain result to the engine outcome it comes from.

After: developers get a table that maps each plain result to the engine outcome it comes from.

Before After
Before: the profile on a 390-pixel phone screen. After: the profile on a 390-pixel phone screen, where the before-and-after table wraps into narrow columns.
Before: the profile on a 390-pixel phone screen. After: the profile on a 390-pixel phone screen, where the before-and-after table wraps into narrow columns.

The read-only check of live GitHub settings shows today's descriptions and pins next to the values the apply script sets.

The read-only check of live GitHub settings shows today's descriptions and pins next to the values the apply script sets.

How it was tested

These were run on 2026-10-09:

  • python3 -m unittest discover -s tests -p 'test_*.py': 400 tests pass. The 30 new tests cover the registry parser, the profile rules, and the apply script, and 11 of them run the script against a fake gh.
  • python3 scripts/check_profile.py: 29 descriptions, 6 pins, and 45 Markdown links validated.
  • python3 scripts/validate_evidence_registry.py: valid.
  • python3 scripts/check_benchmark_claims.py --online --allow-recorded-drift: 12 figures bound, and all 4 upstream artifacts matched.
  • shellcheck, bash -n, and ruff check on the changed files: clean.
  • A dry run listed 59 changes and called nothing.
  • A read-only --verify against GitHub exited 1 as expected: 45 of 90 values differ today, and the pins differ.
  • Every link in the profile and every registry website returned HTTP 200.

After merging

Merging updates the profile. GitHub settings change only when an owner applies them:

  1. Run .overhaul/APPLY.sh and review the 59 commands.
  2. Run gh auth refresh -s admin:org,repo as an owner of OpenAdaptAI.
  3. Run .overhaul/APPLY.sh --apply. It also sets the private openadapt-web and openadapt-cloud descriptions, and an empty website or topic list clears that field.
  4. Under Customize pins, pin in this order: OpenAdapt, openadapt-flow, openadapt-desktop, openadapt-capture, openadapt-agent, ehr-integration-directory. GitHub has no API for pins.
  5. Run .overhaul/APPLY.sh --verify and confirm that it exits 0.

Decisions for the owner:

  • Confirm that ehr-integration-directory belongs in Support.
  • Decide what to do with six public forks that have no registry entry: OpenCUA, OmniParser, UI-TARS-desktop, pynput, oa.blog, and atomacos.

The launcher README in OpenAdaptAI/OpenAdapt (branch feat/business-clarity-launcher) uses the same headline. No merge order is required. If its first line changes, update profile_headline in the registry and the first bold line of the profile. The profile check fails until the two match.

🤖 Generated with Claude Code

abrichr and others added 14 commits October 9, 2026 12:49
Partial work saved after the session limit interrupted the agent. A
follow-up commit on this branch completes and cleans it up before review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…script

scripts/github_metadata.py parses public_metadata in repository-lifecycle.yml
with a strict parser for the small YAML subset the registry uses, so the
profile check needs no YAML package. It checks the formats GitHub enforces
(topic names and count, https websites, six pins at most) plus our short-copy
rules (ASCII only, no dashes, 160 characters at most).

render-apply prints a bash script with the exact gh commands that apply the
registry. It runs as a dry run by default, checks every command, reads GitHub
back after --apply, and prints a success line only when every value matches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ript

Rewrite the profile headline to match the launcher README's opening line.
Keep MCP out of the pinned agent description, say what the engine does
without implying every run checks the record, and describe the private
Cloud and website repositories in plain words. The header comment now names
the apply script instead of a command that didn't exist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The profile now opens with one plain sentence, a faxed-referral before and
after with sourced baseline times, the five ways a run can end, and two
paths: hand off a workflow, or run the engine yourself. Developer content,
the product surfaces, evidence, research, and contribution notes follow.

The fault-test numbers now use the claim of record. A screen-only check
passed 54 of the 72 runs that left the record wrong (75.0%); the old text
paired that rate with 54 of 90 runs. The over-halt count sits beside it,
and every figure on the page is bound to its artifact again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check_profile.py now reads public_metadata through github_metadata.py and
checks that:

- the pins are the five product repositories plus the EHR Integration
  Directory, and no pin is a Research, Labs, Experimental, or retired repo
- every described repository is a product repository or has a lifecycle
- product and pinned descriptions carry no static lifecycle label, while
  Experimental, Research, Labs, and Superseded descriptions open with theirs
- the organization description, profile headline, pinned descriptions, and
  the profile's business section avoid the internal vocabulary
- the profile opens with the registry's headline, keeps business sections
  before developer sections, uses the launcher's quickstart, and never
  prints 54 of 90
- .overhaul/APPLY.sh matches what the registry renders

.overhaul/APPLY.sh is the rendered script for this change. A read-only
--verify run against GitHub on 2026-10-09 listed 45 of 90 values that differ
today, the six current pins, and six public forks that have no registry
entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… script

The apply-script tests run a rendered script against a fake gh that keeps
GitHub state in a file. They check that a dry run calls nothing, that one
failed write or one unreadable value fails the run without a success line,
that pins left for an owner exit 2, and that a non-owner or signed-out
account changes nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The root README replaced its list of hand-copied settings with four steps
that use the rendered apply script: review the dry run, apply, pin by hand,
and verify. REPOSITORY_LIFECYCLE.md lists the EHR Integration Directory
under Support, says the registry also holds the public GitHub metadata, and
uses sentence-case headings. Heading anchors don't change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rallel

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pins check passes a GraphQL query that names $org itself, so the
single quotes are deliberate. Say so in the script and silence SC2016.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An agent stopped at the weekly usage limit on 2026-10-09 with these edits
uncommitted. They are unreviewed and may be half-applied; the next resume
judges them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep the interrupted edits and finish them:
- The --break-it run ends with "Check the record". Flow records that run as
  RECONCILIATION_REQUIRED, so the profile now names the plain result.
- The OpenEMR field test says it used a development build of Flow 0.1.0,
  which matches the benchmark's own method note. Rewrap that paragraph.
- Name the customer story in its link text instead of "written up here".
- State the fault test's scope as two plain sentences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fault test's 72 wrong-record runs include two classes the old list left
out: a stale write that deleted the patient's other records, and a stray
billing row. The next paragraph already names the billing write, so the list
now covers it. The counts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove the case study link from the profile and drop "customer stories"
from the openadapt-web description in the registry. Render the apply
script again from the registry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"No OpenAdapt customer has measured" presumes there are customers. Use the
launcher README's wording, which states the same limit without that
presumption.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant