diff --git a/AGENTS.md b/AGENTS.md index e48451ed..e53558d5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -64,7 +64,7 @@ - Prefer snake_case for new report `Column.key` values even though camelCase is supported. - For nested Egeria responses with repeated names, use namespaced extractor keys (for example `template_display_name`, `target_display_name`). - Report specs (FormatSets) are now Pydantic models (`FormatSet`/`Format`/`Column` from `pyegeria/view/_output_format_models.py`); define new specs using these models, not raw dicts. -- Generated report specs follow the `{Type}-DrE-{Basic|Advanced}` naming pattern and carry an optional `family` string (e.g., `"Data Designer"`, `"Governance Officer"`) used for discovery via `report_spec_list(show_family=True)` and `report_specs.filter_by_family(...)`. +- Generated report specs follow the `{Type}-DrE-{Basic|Advanced}` naming pattern and carry an optional `family` string (e.g., `"Data Designer"`, `"Governance Officer"`) used for discovery via `report_spec_list(show_family=True)` and `report_specs.filter_by_family(...)`. Display-only server-returned columns (e.g. the ISC mermaid graphs) come from `GENERATED_EXTRA_COLUMNS` in `commands/tech/gen_report_specs.py`, not from the compact spec. - Mermaid output is normalized by default (`PYEGERIA_NORMALIZE_MERMAID=true`); set to `false` to preserve native Egeria graph syntax for modern renderers. - Compact command specs in `md_processing/data/compact_commands/` use `attribute_definitions` + `bundles` (single-inheritance via `"inherits"`) + `commands`; drop a new `*.json` file there to add a family โ€” picked up automatically at startup without code changes (see `compact_loader.py` + `parse_compact_export.py`). Control loading via `USE_COMPACT_RESOURCES`/`COMPACT_FAMILIES` in `md_processing_constants.py`. - Use `attr_labels` in compact spec attribute definitions to declare user-facing label synonyms that map to the canonical attribute name. diff --git a/BACKLOG.md b/BACKLOG.md index 69aaaef6..2ba62c99 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -5,6 +5,21 @@ Status: `open` ยท `in-progress` ยท `done` ยท `deferred` --- +## ๐ŸŸข Low Priority โ€” Bare `...-DrE` report spec name falls back to the default report + +**Status:** open +**Added:** 2026-10-28 + +Generated report specs are always named `-DrE-Basic` or `-DrE-Advanced`. A caller that passes the bare name, for example `find_information_supply_chains(..., output_format="REPORT", report_spec="Information-Supply-Chain-DrE")`, gets no error. The lookup misses, and output falls back to "Reporting on Default Base Attributes - Perhaps couldn't find a valid combination of report_spec and output_format?" with an "Any Metadata Element" report. Reported by the egeria-workspaces session while checking 6.2.14. The full `-DrE-Basic` name works from `SolutionArchitect` directly. + +Options: +- make `_select_from_registry` (behind `select_report_spec`/`select_report_format` in `pyegeria/view/base_report_formats.py`) resolve a bare `...-DrE` name to `-DrE-Basic`, or to the level given by `EGERIA_USAGE_LEVEL`; +- or make the fallback message name the closest matching specs, so the missing suffix is obvious. + +Add a micro-test either way. + +--- + ## ๐ŸŸก Medium Priority โ€” Wrap Mandy's new engine-host View Server endpoints **Status:** open, waiting on Egeria (expected "in a few days" from 2026-10-14) diff --git a/CLAUDE.md b/CLAUDE.md index 84c1050d..b85a090c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -274,7 +274,7 @@ Changes to `pyegeria/` (SDK API, config, report formatting) can break both. - `format_set_executor.py`: `exec_report_spec()` โ€” runs either path; `SERIES`/`BAR`/`PIE` output formats wrap an analytic function's result as a Vega-Lite chart (dispatched before normal Format-row lookup, so no `FormatSet` needs to declare those as a `Format` row). - `analytic_registry.py` / `analytic_demo_specs.py`: the catalog of analytic functions (`AnalyticFunctionSpec.generic` marks whether what it counts is a parameter or hardcoded) and one real, executable demo `FormatSet` per registered function. - `_output_dashboard_sheet_models.py`: `DashboardSheet`/`Placement` โ€” a local (not yet Egeria-native) model for user-authored dashboards, built via Dr.Egeria's `Create Dashboard Sheet`/`Link Report to Dashboard Sheet`/`Add Text on Dashboard Sheet` (`md_processing/v2/dashboard_sheet.py`). -- Generated report specs follow `{Type}-DrE-{Basic|Advanced}` naming; carry an optional `family` string for discovery. +- Generated report specs follow `{Type}-DrE-{Basic|Advanced}` naming; carry an optional `family` string for discovery. Columns are the Create command's (input) attributes; display-only server-returned columns (e.g. the ISC mermaid graphs) go in `GENERATED_EXTRA_COLUMNS` in `commands/tech/gen_report_specs.py`, never in the compact spec. --- diff --git a/docs/dr_egeria_manual.md b/docs/dr_egeria_manual.md index 10fe5cd3..13ef10b3 100644 --- a/docs/dr_egeria_manual.md +++ b/docs/dr_egeria_manual.md @@ -737,6 +737,8 @@ Converts command definitions into "FormatSets" used by the Egeria reporting engi - The tool scans the specified directory for compact command JSON files. - The `--merge` flag updates the built-in report specs in `pyegeria/view/base_report_formats.py`. - Use `--emit code` to generate a standalone Python module. + - Each Create command produces `-DrE-Basic` and `-DrE-Advanced` specs, for example `Information-Supply-Chain-DrE-Basic`. Always use the full name with the usage-level suffix; the bare `...-DrE` name doesn't resolve. + - Columns come from the command's attributes, which are inputs. To show values the server returns but nobody authors, such as mermaid graphs, add them to `GENERATED_EXTRA_COLUMNS` in `commands/tech/gen_report_specs.py`, keyed by command display name. They are appended to the spec's ALL format and offered as a MERMAID format, and `refresh_specs` keeps them. `Information Supply Chain` uses this for the five Egeria 6.3 ISC graphs. Don't add them as compact-spec attributes: that turns them into authorable template fields. ### Spec Validation (`validate_compact_specs`) diff --git a/pyegeria/core/_globals.py b/pyegeria/core/_globals.py index c719dde6..74639d68 100644 --- a/pyegeria/core/_globals.py +++ b/pyegeria/core/_globals.py @@ -139,4 +139,4 @@ def resolve_enum(enum_class: type[Enum], value: str | int) -> int | None: "Specification Mermaid Graph", "Solution Blueprint Mermaid Graph","Mermaid Graph", "Solution Subcomponent Mermaid Graph","Governance Action Process Mermaid Graph" ] TERM_STATUS = ["DRAFT", "PREPARED","PROPOSED","APPROVED", "REJECTED", "ACTIVE", "DEPRECATED", "DELETED", "OTHER"] -REPORT_ACRONYMS = ["GUID", "ID", "QN", "API", "UI"] +REPORT_ACRONYMS = ["GUID", "ID", "QN", "API", "UI", "ISC"] diff --git a/tests/micro-tests/test_output_formatter_mermaid.py b/tests/micro-tests/test_output_formatter_mermaid.py index fd468477..6c200ea4 100644 --- a/tests/micro-tests/test_output_formatter_mermaid.py +++ b/tests/micro-tests/test_output_formatter_mermaid.py @@ -179,3 +179,15 @@ def test_mermaid_graph_titles_stay_aligned_with_keys(): assert len(MERMAID_GRAPHS) == len(MERMAID_GRAPH_TITLES) assert MERMAID_GRAPH_TITLES[MERMAID_GRAPHS.index("iscDataFabricMermaidGraph")] == "ISC Data Fabric Graph" + + +def test_isc_graph_heading_keeps_acronym(): + from pyegeria.core.utils import camel_to_title_case + + assert camel_to_title_case("ISC Data Mesh Graph") == "ISC Data Mesh Graph" + assert camel_to_title_case("iscDataMeshMermaidGraph") == "ISC Data Mesh Mermaid Graph" + + heading = of.make_md_attribute("ISC Data Mesh Graph", "flowchart LR\\n P-->Q", "REPORT", + attribute_key="iscDataMeshMermaidGraph") + assert heading.startswith("### ISC Data Mesh Graph") + assert "```mermaid" in heading