Align value stream
Skill eugenelim/agent-ready-repo/packs/product-engineering/.apm/skills/align-value-stream
Use at business-unit scale to stand up and keep current a value-stream meta-repo — a coordinating repo with no app code that holds the cross-component artifacts a polyrepo has nowhere else to put (the federated Backstage catalog, the shared-contract authority, the C4/bounded-context architecture, and the cross-component delivery rollup). Triggers on "set up a value-stream meta-repo", "coordinate across component repos", "stand up the cross-component catalog", "where does the shared contract live", "is this feature delivered across all the repos". Reads the per-component slices that decompose-intent produces and rolls up their delivery. Do NOT use at app scale (use decompose-intent — the leaf is one repo's brief) or to author an intent (use frame-intent).From its SKILL.md
npx -y skills add eugenelim/agent-ready-repo --skill align-value-streamAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 15 stars15 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.2 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
Skill: align-value-stream
Stand up and keep current a value-stream meta-repo — a coordinating repo with
no application code that sits above many component repos and holds the
cross-cutting artifacts a polyrepo has nowhere else to put: the cross-component
(capability) intents, the federated catalog, the canonical shared
contracts (or a reference to where they live), the C4 / bounded-context
architecture, and the cross-component delivery rollup. It is a place you
read and edit, never a running service. The slices it rolls up are produced by
decompose-intent's business-unit branch; its spine is currency — a stale
map is the dominant failure mode. Depth lives in references/.
Output rendering
Table — When presenting several items that share the same fields, render a Markdown table. Cap at ~5 columns; beyond that, switch to a per-item detail list. Right-align numeric columns. Key–value / one record — For a single record's fields, use an aligned key: value list, not a two-row table.
When to invoke
Before aligning, confirm:
- The work is at
business-unitScale (set byframe-intent) — a product org whose work fans out to many component repos. AtappScale there is no meta-repo;decompose-intent's leaf is one repo's brief. - You're in (or standing up) a coordinating repo with no app code. If app code lives here, it's a component repo, not the meta-repo.
Procedure
-
Confirm the meta-repo and Scale. Name the value stream and the component repos it coordinates. The meta-repo holds only cross-cutting artifacts.
-
Federate the catalog. Anchor to Backstage's Domain → System → Component → API ontology, but reference each component repo's own
catalog-info.yamlrather than re-authoring it here — federate, never copy. Seereferences/backstage-ontology.md(with a workedcatalog-info.yamlsample, since it is Backstage-native and lives at each repo's root, not as a seed). -
Settle where the shared contract lives. Explain the choice in plain language, default to the meta-repo, list the alternatives (a dedicated contracts/interface repo, a schema registry), and elicit the org's home. Regardless of location, the shape is constant: each per-component brief references
contract@versionand carries a read-only courier snapshot — never attach-as-authority. Provider/consumer roles mirror Backstage'sprovidesApi/consumesApi; each relationship carries a compatibility/upgrade direction. Seereferences/shared-contract-handoff.md. -
Anchor the system architecture. The C4 / bounded-context
reference.mdlives here; each component repo's ownreference.mdlinks to and conforms to it rather than re-deriving the system view. This is thearchitectseam. -
Keep the rollup current. Resolve
output_dirusing the config-driven procedure below, then maintain the cross-component rollup (copy this skill'sassets/rollup-template.mdto<output_dir>/rollups/<slug>.md): one row per slicedecompose-intentproduced → its brief → a status snapshot + a pointer to that repo's own auto-derived coverage. The AND across rows is the answer; an absent-source row isunknown / not-yet-catalogued, never silently delivered. Seereferences/cross-component-rollup.mdand, for the discipline that keeps every artifact above honest,references/catalog-currency.md.
Where the rollup lives — config-driven, elicit when not configured
Resolve the rollup output directory in this order, in this skill body.
Reading is prompt-only (Charter Principle 3): this skill reads a file and
reasons about a path — there is no engine, index, daemon, or watcher behind it,
and the only code that ever writes the layout file is the install-time append.
See references/agentbundle-layout.md for the
[product] section's full schema.
-
Repo-scope config — read
./agentbundle-layout.toml[product] output_dirif the file exists and the key is present. Repo-scope takes priority so that a project or team convention applies when you're working in this repo. The file is adopter-owned, never shipped into a projected path:# agentbundle-layout.toml (adopter-created; optional) [product] output_dir = "docs/product" # a base; rollups land at <output_dir>/rollups/<slug>.md -
User-scope config — read
~/.agentbundle/agentbundle-layout.toml[product] output_dirif the file exists and the key is present. User-scope is the fallback — useful for a personal vault (e.g. Obsidian) or a default output path you use across repos when no repo convention is set. -
Two-branch elicitation — when neither config resolves, ask which branch fits — never a silent default:
- Repo branch — "Commit to this repo? Suggest:
docs/product/(team-visible, version-controlled). Enter path or press Enter to accept:" On accept, writeoutput_dir = "<path>"to./agentbundle-layout.toml [product]so subsequent skills skip elicitation. - Personal/vault branch — "Write to a personal workspace (e.g. Obsidian
vault)? Enter the absolute path. Example:
~/Documents/<VaultName>/product/(no default)." On accept, writeoutput_dir = "<path>"to~/.agentbundle/agentbundle-layout.toml [product].
- Repo branch — "Commit to this repo? Suggest:
Anchor output_dir by the layout file's own location, never against the ambient
cwd: a repo-root file's output_dir is repo-root-relative (an absolute value
is permitted but warn it as non-portable); a user-profile file's output_dir
must be an explicit absolute path (~-anchored is fine), and a relative
value there is an Ask-first deviation, never silently resolved.
Resolve, then surface, then write. After anchoring, resolve output_dir to its
full absolute path — ~-expand it and realpath-resolve it so any symlink
in the path is made visible and never silently followed out of the intended root
— and reject any .. escape. The .. rejection and the realpath happen
after anchoring, so a relative repo-file value that escapes via .. (e.g.
output_dir = "../../etc") is caught regardless of which file supplied it; anchoring
never blesses a ..-bearing value as in-tree. Then surface the resolved
absolute path to the adopter before creating the rollup file — the first write
is always preceded by the path you are about to write under.
A repo-root-sourced output_dir that resolves outside the repo tree — or whose
resolution required following a symlink out of the intended root — is
untrusted-origin: confirm the resolved absolute path with the adopter before
writing.
Output shape — file-per-slug, not a per-topic folder. Rollup files live
directly under <output_dir>/rollups/<slug>.md. A per-topic folder is deliberately
not used: each rollup is a single file. decompose-intent's
docs/product/briefs/<slug>.md output stays pinned — that path is the
hand-off to core's receive-brief and is not governed by this config (a
deliberate non-goal of this layout config).
Hard limits — state them honestly
The coordination pattern has real costs an adopter must accept, not engineered away: no atomic cross-repo commit, no shared release train, and the rollup is a snapshot, not a live feed. Name them when you stand the meta-repo up.
Anti-patterns to refuse
- Building a runtime hub or a live coverage API. The meta-repo is a repo you read and edit, not a service that polls component repos. A live rollup needs auth, polling, and rate limits — that's infrastructure, deferred to a later pack. Snapshot + pointer is the in-charter answer.
- Re-authoring federated data. Copying a component repo's
catalog-info.yamlor coverage into the meta-repo forks it and guarantees drift. Reference it; cache only a snapshot. - Attaching a contract as authority. Copying a contract into a brief forks it
N ways. Reference
contract@version; carry a read-only courier snapshot only. - Duplicating monorepo-vs-polyrepo structuring. That decision lives in
monorepo-extras(new-package); meet it only at "where the shared contract lives," and reference it — don't restate it. - Letting the map go stale. Currency is the whole value. A catalog, contract, or rollup nobody reconciles is worse than none — agents follow it confidently.
What ships with it: 8 files
20.4 KB alongside SKILL.md
assets/
- rollup-template.md2.4 KB
evals/
- eval_queries.json1.6 KB
- evals.json1.5 KB
references/
- agentbundle-layout.md3.2 KB
- backstage-ontology.md3.2 KB
- catalog-currency.md2.4 KB
- cross-component-rollup.md2.9 KB
- shared-contract-handoff.md3.1 KB