Skip to content

fix(handoff): close what stops a Hub agent working without the LearnStack tree - #4

Merged
cemililik merged 3 commits into
mainfrom
docs/hub-agent-handoff
Aug 10, 2026
Merged

fix(handoff): close what stops a Hub agent working without the LearnStack tree#4
cemililik merged 3 commits into
mainfrom
docs/hub-agent-handoff

Conversation

@cemililik

@cemililik cemililik commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Preparation for handing this repository to its own agents. An autonomy audit
asked one question — can a competent Hub agent work here without opening or
editing the LearnStack repository?
— and this closes what it found. Every
finding was re-verified against the working tree before anything was touched.

Documentation and comments, plus one behavioural line (an env-var key).


Three runtime defects, day one

Defect Effect
dotnet run --project src/LearnStack.Hub.Api Path does not exist — it is src/Core/LearnStack.Hub.Api. Fails immediately, in both places that document it
Documented run command never loads .env Connection string falls back to defaults; the API cannot reach Postgres. Both blocks now export it the way scripts/seed.sh already does
HUB_POSTGRES_DB vs POSTGRES_DB_HUB .env.example and dev.yml provision one key, HubFoundationRegistration read the other. It worked only because both defaulted to learnstack_hub — the first rename would have desynced compose from the app silently

Skills sent the agent to a checkout it should not need

Eleven references across nine skills pointed at ../LearnStack/docs/... or
../LearnStack/backend/src/... to read authority or source. Reading
LearnStack needs a URL, not a clone — which is the rule this repo already
states for Markdown links. All are absolute GitHub URLs now. ../LearnStack
survives only where it is genuinely a shell path: make dev, the compose
stack, the Keycloak realm files.

The sharpest case was wire-cross-cutting-foundation, whose Step 1 still read:

Reproduce ../LearnStack/backend/src/LearnStack.SharedKernel/ … folder-for-folder

That kernel shipped with P02c-1 and is on main. The skill is now about
understanding what is there — which is what the owed SharedKernel
reconciliation actually needs.

Skills taught retired rules

  • add-integration-event carried "four HTTPS endpoints, a fifth needs an
    ADR"
    in four places; standards-check had it as a checklist box.
    ADR-0034
    replaced the count with two invariants because protecting it caused TLS
    private keys to be tunnelled through the entitlement payload.
  • Two skills described the link audit backwards — telling the agent to check
    sibling-relative links "resolve locally" when CI now fails on them.

The freeze was unreachable from the entry point

start-task Step 2 checked packet fit against the roadmap and never mentioned
that P02c-2 and everything after it is frozen. An agent asked to "implement the
internal API" would have been green-lit straight into frozen work. Step 2 now
checks the freeze first and stops.

Smaller

  • meta advertised format verification in its job name and in CONTRIBUTING; its
    only step is the link audit. Format verification runs in backend.
  • HubBoundaryTests' summary carried a KNOWN CORPUS DRIFT block for a drift the
    restructure closed — Architecture 24 now spells it Hub_NeverStores_TenantData
    and lists seven tests. Deleted rather than updated.
  • openapi-diff moves off if: false, which actionlint rejects
    ([if-cond] constant expression), to an unset repository variable.
  • add-recurring-job and add-contract-test — needed by P02c-5 / hub-billing and
    P02c-2, written by nobody — are registered in the deferred table rather than
    discovered missing later.

Verification

actionlint clean. Every relative Markdown link in the changed files resolves.
The C# edits are one env-var key plus comments; CI builds and runs the
Testcontainers suite.

Not in scope

The audit also flagged items that are LearnStack's to fix or that depend on
decisions not yet made — the entitlement compliance.caps.value type divergence,
the P02c-4 cross-repo realm edit, and the dependency-map edges into P02c-5/6.
Those are content decisions, not handoff blockers, and belong in their own PR.

🤖 Generated with Claude Code

Summary by Sourcery

Align Hub repository with autonomous usage by a Hub agent without requiring a local LearnStack checkout, and fix configuration and documentation mismatches found during that audit.

New Features:

  • Document and register deferred skills for adding recurring jobs and contract tests to support future Hub packets.

Bug Fixes:

  • Align the Hub database environment variable key with the values provisioned by .env and docker-compose so the API uses the correct Postgres database.
  • Correct Hub API run instructions and project paths so local development uses the Core API project and successfully connects to Postgres.

Enhancements:

  • Clarify Hub architecture test documentation to match the updated LearnStack architecture spec and ADRs, removing obsolete drift notes.
  • Update all agent skills and contributor docs to treat the Hub repo as primary, reference LearnStack authority via absolute GitHub URLs, and remove assumptions about sibling checkouts.
  • Strengthen task-start and implementation skills to check the Hub roadmap freeze status and prioritize existing Hub patterns before consulting LearnStack core.
  • Clarify LearnStack ADR and standards ownership, including where cross-cutting ADRs live and how to coordinate cross-repo changes.

Build:

  • Gate the openapi-diff CI job on a repository variable instead of a constant false condition and narrow the meta job to Markdown link auditing only.

CI:

  • Adjust CI workflow naming and comments to reflect that meta runs only the Markdown link audit and that backend handles format verification.

Deployment:

  • Correct the documented docker-compose Hub API project path under infra/compose to use the Core API project.

Documentation:

  • Update READMEs, CONTRIBUTING, and infra docs to explain correct Hub API startup (including environment export) and current CI checks.
  • Revise multiple Claude skills to reflect the current contract surface invariants from ADR-0034, the prohibition on sibling-relative LearnStack links, and the expectation to read LearnStack docs on GitHub rather than via a local clone.
  • Document the Hub roadmap freeze from P02c-2 onward and ensure skills route frozen work to stop rather than proceed.
  • Clarify future placement of feature flag registries and cross-repo registry sync expectations in the add-feature-key workflow.

Tests:

  • Refresh architecture test documentation comments to reference the canonical LearnStack architecture document by URL and reflect the current list of Hub boundary rules.

Chores:

  • Normalize repository paths and case conventions in local-dev instructions and clean up outdated references to LearnStack-side locations across skills and tests.

Summary by CodeRabbit

  • Documentation

    • Updated development, contribution, architecture, and cross-repository guidance with canonical links and clearer workflow rules.
    • Clarified local API setup, database configuration, contract reviews, deferred skills, registry support, and coordinated roadmap dependencies.
    • Documented entitlement retention values as strings or null.
  • CI & Quality

    • OpenAPI diff checks can now be enabled through configuration.
    • Improved Markdown link auditing and branch-protection check documentation.
  • Bug Fixes

    • Corrected the database environment variable used during API configuration.
    • Updated container startup instructions to use the correct API project path.

…tack tree

Preparation for handing this repository to its own agents. Findings come
from an autonomy audit; each was re-verified against the working tree here
before being touched.

**Three runtime defects an agent hits on day one.**

- Both places that tell you how to start the API give a project path that
  does not exist. It is `src/Core/LearnStack.Hub.Api`, not
  `src/LearnStack.Hub.Api`, so `dotnet run` fails immediately.
- The API cannot reach its database when started the documented way. The
  host never loads `.env`, so the connection string falls back to defaults.
  Both run blocks now export it the way `scripts/seed.sh` already does.
- `.env.example` and `infra/compose/dev.yml` provision `HUB_POSTGRES_DB`;
  `HubFoundationRegistration` read `POSTGRES_DB_HUB`. It worked only because
  both sides defaulted to the same literal — the first time someone changed
  the database name, compose and the app would have disagreed silently.

**Skills sent the agent to a checkout it is not supposed to need.** Eleven
references across nine skills pointed at `../LearnStack/docs/...` or
`../LearnStack/backend/src/...` for reading authority or source. Reading
LearnStack does not require a clone — it requires a URL, which is the rule
this repository already states for Markdown links. All are now absolute
GitHub URLs. `../LearnStack` survives only where it is genuinely a shell
path: `make dev`, the compose stack, the Keycloak realm files.

The sharpest case was `wire-cross-cutting-foundation`, whose Step 1 still
said "reproduce `../LearnStack/backend/src/LearnStack.SharedKernel/`
folder-for-folder". That kernel shipped with P02c-1 and is on `main`; the
skill is now about understanding what is there, which is what the owed
SharedKernel reconciliation actually needs.

**Skills taught rules the corpus has retired.** `add-integration-event`
carried the "four HTTPS endpoints, a fifth needs an ADR" framing in four
places and `standards-check` had it as a checklist box — ADR-0034 replaced
the count with two invariants precisely because protecting it caused TLS
private keys to be tunnelled through the entitlement payload. Two skills
also described the link audit backwards, telling the agent to check that
sibling-relative links "resolve locally" when CI now **fails** on them.

**The freeze was unreachable from the entry point.** `start-task` Step 2
checked packet fit against the roadmap but never mentioned that P02c-2 and
everything after it is frozen — so an agent asked to build the internal API
would have been green-lit into it. Step 2 now checks the freeze first and
stops.

**`meta` claimed work it does not do.** Its only step is the Markdown link
audit; the job name and CONTRIBUTING both advertised format verification,
which runs in `backend`.

Also: `HubBoundaryTests`' summary described a corpus drift the restructure
already closed — Architecture 24 now spells the test `Hub_NeverStores_TenantData`
and lists seven, so the KNOWN CORPUS DRIFT block is deleted rather than
updated. `openapi-diff` moves off `if: false`, which actionlint rejects, to
an unset repository variable. And the two skills the remaining packets need
but nobody has written — `add-recurring-job` and `add-contract-test` — are
registered in the deferred table instead of being discovered missing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Reviewer's Guide

Aligns Hub repo docs, skills and runtime behaviour so agents can work without a sibling LearnStack checkout, fixes three runtime defects around Hub API startup and Postgres config, and clarifies contract/freeze rules and meta CI behaviour.

Flow diagram for updated Hub API startup and Postgres configuration

flowchart TD
  A[Developer runs Hub API locally] --> B[Export .env in repo root using set -a; . ./.env; set +a]
  B --> C[Set POSTGRES_HOST=localhost]
  C --> D[Run dotnet project src/Core/LearnStack.Hub.Api]
  D --> E[HubFoundationRegistration.ResolveConnectionString]
  E --> F[Read POSTGRES_HOST, POSTGRES_PORT, HUB_POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD]
  F --> G[Build Postgres connection string and connect]
Loading

Flow diagram for start-task Step 2 freeze and packet-fit logic

flowchart TD
  A[Agent runs start-task Step 2] --> B[Check CLAUDE.md state and roadmap freeze]
  B --> C{Packet is P02c-2 or later?}
  C -- Yes --> D[Say task is frozen and stop]
  C -- No --> E[Confirm task belongs to current packet]
  E --> F{Belongs to a later packet?}
  F -- Yes --> G[Say so and stop; do not pull future work forward]
  F -- No --> H[If LearnStack-side changes needed, flag cross-repo coordinated packet and follow two-PR protocol]
Loading

File-Level Changes

Change Details Files
Fix Hub API local run path and Postgres configuration so documented commands actually start a working API.
  • Correct dotnet project path in infra compose README to src/Core/LearnStack.Hub.Api.
  • Update README and local-dev-setup skill to show loading .env and POSTGRES_HOST before running the Hub API.
  • Change HubFoundationRegistration to read HUB_POSTGRES_DB instead of POSTGRES_DB_HUB and document alignment with .env/compose.
infra/compose/README.md
README.md
.claude/skills/local-dev-setup/SKILL.md
backend/src/Core/LearnStack.Hub.Infrastructure/Composition/HubFoundationRegistration.cs
Remove reliance on a sibling LearnStack checkout by converting cross-repo filesystem references in skills/docs to absolute GitHub URLs and clarifying authority sources.
  • Replace ../LearnStack/docs and backend/src relative paths with https://github.com/HodeTech/LearnStack/... links in skills, CONTRIBUTING and tests.
  • Clarify that LearnStack ADRs/standards/glossary live in the main LearnStack repo and must be read/changed via coordinated PRs.
  • Update implement-task and code-review skills to prefer Hub’s own source first, using LearnStack only as reconciliation reference.
.claude/skills/start-task/SKILL.md
.claude/skills/implement-task/SKILL.md
.claude/skills/code-review/SKILL.md
.claude/skills/README.md
.claude/skills/write-adr/SKILL.md
.claude/skills/update-glossary/SKILL.md
CONTRIBUTING.md
backend/tests/LearnStack.Hub.Tests.Architecture/RepositoryLayoutTests.cs
Bring skills in line with current ADRs, standards and roadmap (contract surface, link policy, freeze, SharedKernel status).
  • Update add-integration-event and standards-check to reference ADR-0034 invariants instead of the obsolete 'four HTTPS endpoints' rule.
  • Clarify link-audit expectations: sibling-relative ../LearnStack Markdown links are forbidden; only absolute GitHub URLs are allowed.
  • Make start-task explicitly check the P02c-2+ track freeze before packet-fit, and ensure implement-task/start-task messaging matches.
  • Rewrite wire-cross-cutting-foundation to treat Hub SharedKernel as already shipped and authoritative, with LearnStack used only for reconciliation.
.claude/skills/add-integration-event/SKILL.md
.claude/skills/standards-check/SKILL.md
.claude/skills/start-task/SKILL.md
.claude/skills/implement-task/SKILL.md
.claude/skills/wire-cross-cutting-foundation/SKILL.md
Adjust CI/meta and architectural docs to reflect current reality and keep automation clean.
  • Gate openapi-diff job on vars.ENABLE_OPENAPI_DIFF instead of if: false and document the behaviour.
  • Rename meta GitHub job and CONTRIBUTING description to indicate it only performs Markdown link auditing; clarify where format verification runs.
  • Remove the obsolete KNOWN CORPUS DRIFT block from HubBoundaryTests, updating comments to reflect the reconciled Architecture 24/ADR-0019 state.
  • Register add-recurring-job and add-contract-test as deferred skills in the skills README with ownership notes.
.github/workflows/ci.yml
CONTRIBUTING.md
backend/tests/LearnStack.Hub.Tests.Architecture/HubBoundaryTests.cs
.claude/skills/README.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1288461e-7da4-4f42-82b5-0d2e0cf098c0

📥 Commits

Reviewing files that changed from the base of the PR and between 4287d1f and 6adf936.

📒 Files selected for processing (5)
  • .claude/skills/commit-and-pr/SKILL.md
  • .claude/skills/start-task/SKILL.md
  • CONTRIBUTING.md
  • README.md
  • infra/compose/README.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .claude/skills/start-task/SKILL.md

📝 Walkthrough

Walkthrough

The changes align Hub guidance with canonical LearnStack references, update contract and task rules, correct local API and database setup instructions, enable variable-controlled OpenAPI diff checks, and update architecture, entitlement, and roadmap documentation.

Changes

Hub guidance and workflow alignment

Layer / File(s) Summary
Source and ADR reference guidance
.claude/skills/*
LearnStack references now use canonical GitHub URLs. Cross-repository ADR and pull-request sequencing guidance is explicit.
Contract and task workflow rules
.claude/skills/add-feature-key/SKILL.md, .claude/skills/add-integration-event/SKILL.md, .claude/skills/standards-check/SKILL.md, .claude/skills/start-task/SKILL.md, .claude/skills/wire-cross-cutting-foundation/SKILL.md
Contract interfaces, ADR requirements, registry handling, SharedKernel authority, and frozen-packet checks now reflect the current workflow.
Local runtime and project-path guidance
.claude/skills/local-dev-setup/SKILL.md, README.md, backend/src/Core/LearnStack.Hub.Infrastructure/Composition/HubFoundationRegistration.cs, infra/compose/README.md
Startup instructions load .env, set POSTGRES_HOST=localhost, use the relocated API project, and read HUB_POSTGRES_DB.
CI and architecture documentation
.github/workflows/ci.yml, CONTRIBUTING.md, backend/tests/LearnStack.Hub.Tests.Architecture/*
OpenAPI diff gating uses vars.ENABLE_OPENAPI_DIFF. CI status-check descriptions and architecture-test documentation are updated.
Contract and roadmap documentation
docs/architecture/entitlement-projection.md, docs/roadmap/*
Compliance-cap values are documented as strings or null. P02c-4 dependencies and coordinated LearnStack realm changes are documented.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: enabling Hub agents to work without a local LearnStack checkout.
Description check ✅ Passed The description clearly covers the scope, runtime fixes, documentation changes, verification, and out-of-scope items, despite not using every template heading.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/hub-agent-handoff

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've left some high level feedback:

  • The absolute GitHub URLs for LearnStack docs and source are repeated across multiple skills and tests; consider centralizing the base URL (e.g., in a shared constant or a short "LearnStack links" section) to reduce the risk of future drift if the repo or branch structure changes.
  • The .env export sequence for running the Hub API is now described in both README.md and local-dev-setup/SKILL.md; factoring this into a single canonical snippet or script (and referencing it from both places) would help avoid the two instructions diverging over time.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The absolute GitHub URLs for LearnStack docs and source are repeated across multiple skills and tests; consider centralizing the base URL (e.g., in a shared constant or a short "LearnStack links" section) to reduce the risk of future drift if the repo or branch structure changes.
- The `.env` export sequence for running the Hub API is now described in both `README.md` and `local-dev-setup/SKILL.md`; factoring this into a single canonical snippet or script (and referencing it from both places) would help avoid the two instructions diverging over time.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.claude/skills/commit-and-pr/SKILL.md:
- Line 66: Update the cross-repo coordination guidance in the commit-and-PR
instructions to state the required sequence explicitly: merge the LearnStack ADR
PR first, open the Hub code PR, open the LearnStack code PR referencing the Hub
commit hash, then merge both code PRs together. Preserve the restriction
requiring explicit user permission before pushing to or merging in LearnStack.

In @.claude/skills/start-task/SKILL.md:
- Around line 46-55: Update the freeze-check instruction in Step 2 to explicitly
say “At the start of Step 2” instead of “Before anything else,” preserving the
required ordered document reading from Step 1 before evaluating the task’s
packet or freeze status.

In `@CONTRIBUTING.md`:
- Around line 11-12: Keep the meta status-check context consistent between
.github/workflows/ci.yml and the CONTRIBUTING.md entry: either update the
required-check configuration and documentation to use the emitted “meta
(markdown link audit)” name, or rename the workflow job to meta. Apply the same
choice everywhere so the required check matches the workflow output.

In `@README.md`:
- Line 68: Update the documented Hub API commands in README.md at line 68 and
infra/compose/README.md at line 27 to invoke the repository-required
~/.dotnet/dotnet executable instead of plain dotnet, preserving the existing
project arguments.
- Around line 64-67: Update the README API startup instructions around the
backend setup to select the .NET 10 SDK before running either API command. Add
the user-local .NET directory to PATH or invoke the dotnet executable through
~/.dotnet/dotnet, while preserving the existing environment-loading and
backend-directory steps.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8542f7ab-f01c-4163-ae40-fd72d9a69a46

📥 Commits

Reviewing files that changed from the base of the PR and between 1f78195 and 81958f7.

📒 Files selected for processing (19)
  • .claude/skills/README.md
  • .claude/skills/add-feature-key/SKILL.md
  • .claude/skills/add-integration-event/SKILL.md
  • .claude/skills/code-review/SKILL.md
  • .claude/skills/commit-and-pr/SKILL.md
  • .claude/skills/implement-task/SKILL.md
  • .claude/skills/local-dev-setup/SKILL.md
  • .claude/skills/standards-check/SKILL.md
  • .claude/skills/start-task/SKILL.md
  • .claude/skills/update-glossary/SKILL.md
  • .claude/skills/wire-cross-cutting-foundation/SKILL.md
  • .claude/skills/write-adr/SKILL.md
  • .github/workflows/ci.yml
  • CONTRIBUTING.md
  • README.md
  • backend/src/Core/LearnStack.Hub.Infrastructure/Composition/HubFoundationRegistration.cs
  • backend/tests/LearnStack.Hub.Tests.Architecture/HubBoundaryTests.cs
  • backend/tests/LearnStack.Hub.Tests.Architecture/RepositoryLayoutTests.cs
  • infra/compose/README.md

Comment thread .claude/skills/commit-and-pr/SKILL.md Outdated
Comment thread .claude/skills/start-task/SKILL.md Outdated
Comment thread CONTRIBUTING.md Outdated
Comment thread README.md
Comment thread README.md Outdated
cemililik and others added 2 commits August 10, 2026 21:09
The autonomy audit that scoped the handoff PR flagged three items as
out-of-scope for it. They are corpus defects, not handoff gaps, so they
land here rather than in a follow-up nobody owns.

1. `caps.value` is a string on the wire. The worked example in
   entitlement-projection.md carried `"value": 365` as a JSON number,
   which `entitlement-v1.schema.json` rejects — the envelope declares
   `"value": { "type": ["string", "null"] }` with
   `additionalProperties: false`, and `ComplianceCapDto.Value` is
   `string?`, so the serialiser cannot emit a number anyway. The
   document's own contract test would have failed on its own example.
   Corrected to `"365"` and stated as a rule, because the next numeric
   cap will reach for the same shape.

2. The dependency map was missing `p4 → p5` and `p4 → p6`. Both P02c-5
   and P02c-6 ship "Operator portal screens" sections that build on the
   portal shell and its Operators/Audit modules; the prose said so, the
   graph did not. A reader planning parallel work off the diagram would
   have scheduled them concurrently.

3. P02c-4 was labelled "touches no LearnStack code" in two places while
   its own Deliverables require editing
   `../LearnStack/infra/keycloak/realms/learnstack-hub.json` — the
   operator roles and the MFA-required browser flow — and describe it as
   a coordinated cross-repo change. The file cannot be duplicated into
   this repository because LearnStack's compose imports both realms at
   first boot. P02c-4 now carries a row in "Hub waits on LearnStack" and
   is counted with the coordinated packets, leaving P02c-2 as the only
   fully Hub-local packet remaining.

The third is the failure mode this whole review keeps finding: a fact
was corrected where the work was being done and left stale in the index
that summarises it. A packet declared LearnStack-free is a packet whose
cross-repo edit nobody schedules.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cemililik
cemililik merged commit 310f718 into main Aug 10, 2026
8 checks passed
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