diff --git a/board/_theme.py b/board/_theme.py index a13939ba..cd8e4231 100644 --- a/board/_theme.py +++ b/board/_theme.py @@ -1002,17 +1002,19 @@ def orchestration_panel(key, title, description, prompt, *, work_links=(), ) -def hero(key, kind, lede_html="", *, navigation=(), navigation_columns=None): +def hero(key, kind, lede_html="", *, navigation=(), navigation_columns=None, display_name=None): """The masthead: the organ's logo re-drawn — mark, wordmark, rule, tagline. `lede_html` is accepted for compatibility but not displayed. `kind` remains accepted for compatibility with existing renderers. The grey label describes the organ's function, from the shared metadata. + `display_name` optionally replaces the wordmark with escaped instance text. """ o = organ(key) + wordmark = f'{WORD}{o["organ"]}' if display_name is None else f'{_esc(display_name)}' # Legacy prose arguments remain accepted for downstream compatibility. return (f'
{mark(key)}' - f'

{WORD}{o["organ"]}' + f'

{wordmark}' f'{o["function"]}

' f'
' f'

{o["tagline"]}

' diff --git a/docs/adoption/config_surfaces.md b/docs/adoption/config_surfaces.md index 81e08387..6564fe81 100644 --- a/docs/adoption/config_surfaces.md +++ b/docs/adoption/config_surfaces.md @@ -8,6 +8,8 @@ framework organs is domain-free logic you pull from upstream. | Surface | Organ | What it declares | |---------|-------|------------------| | `repos.yaml` | Mind (yours) | The body map — every repo's GitHub home, category, role. The single source the rest are checked against. | +| Profile passed with `--instance` | Scientist | Opt-in instance name, canonical repository ID, Pages URL, project-config path and explicitly connected organs; see the [starter preview](https://github.com/PyAutoLabs/PyAutoScientist/blob/main/STARTER.md). | +| Project configuration referenced by the profile | Scientist | Explicit project/resource relationships and public visibility; repository identity still comes from Mind. | | `config/repos.yaml` | Heart | What to poll and gate: repo groups, required CI workflows, thresholds, dirty-file noise patterns. | | `pre_build.sh` — the `run_workspace` table | Hands | One row per workspace: repo, package, flags, parent library. | | `agents/faculties/sizing/_sizing.py` | Brain | The library/workspace repo sets and aliases used to size and route tasks. | diff --git a/docs/adoption/guide.md b/docs/adoption/guide.md index 8d501d12..fa6e4996 100644 --- a/docs/adoption/guide.md +++ b/docs/adoption/guide.md @@ -7,6 +7,15 @@ improvements cleanly forever after. There is deliberately no shared deployment, no "generic edition", and no stability promise on `main` — see {ref}`the disclaimer ` below. +## Independent starter preview + +The Scientist adoption pilot now offers an opt-in, independently named empty +[local dashboard preview](https://github.com/PyAutoLabs/PyAutoScientist/blob/main/STARTER.md). +It separates instance identity and selected organ connections from the renderer, +and does not require the full organ family. It does not yet bootstrap a working +Mind or harness, activate organs or deploy an independent site. The existing +full-stack walkthrough below remains separate from this smaller pilot path. + ## Prerequisites — what PyAutoScientist *is* These are the product, not incidental choices. If they don't fit how you diff --git a/docs/board-navigation.md b/docs/board-navigation.md index 6ee857c4..d6d8ef90 100644 --- a/docs/board-navigation.md +++ b/docs/board-navigation.md @@ -40,7 +40,10 @@ existing positional API. The optional keyword inserts `navigation_cards(items, label='Board sections', columns=None)` directly after the masthead and before the description. `section_layout(page, summaries=None)` composes the finished owner HTML into the standard order, moving the orchestration panel above -these cards. Existing `hero` callers retain their positional API. +these cards. Existing `hero` callers retain their positional API. Its optional keyword-only +`display_name` replaces the wordmark with escaped instance-owned text, leaving +the organ mark, function and palette unchanged. Omitting it preserves the +existing wordmark. Scientist uses it for independently named instance profiles. Each item is a mapping with `href` and `label`, plus optional `count` and `context`. Text is escaped. Destinations accept local anchors, relative links diff --git a/tests/test_board_theme.py b/tests/test_board_theme.py index ed880567..3d995c1d 100644 --- a/tests/test_board_theme.py +++ b/tests/test_board_theme.py @@ -546,3 +546,12 @@ def test_navigation_desktop_columns_are_opt_in_and_propagated_by_hero(): def test_navigation_columns_reject_invalid_values(columns): with pytest.raises(ValueError): _theme.navigation_cards([], columns=columns) + + +def test_hero_instance_name_is_escaped_without_mutating_shared_branding(): + original = _theme.hero('organism', 'Dashboard') + named = _theme.hero('organism', 'Dashboard', display_name='Mira & ') + assert 'Mira & <Research>' in named + assert _theme.MARKS['organism'] in named + assert _theme.ORGANS['organism']['function'] in named + assert _theme.hero('organism', 'Dashboard') == original