feat(admin): loops grouped inside their skill, and graph scope labels (issue #54) - #173
Merged
Conversation
… (issue #54) Operator feedback on the shipped graph: not clear which repos or folders it covers, and the loop a skill's own text describes was nowhere to be seen. The second half was a real gap against the original ask: the design carried loop markers grouped inside the skill, but the data layer never produced them. Loops. findLoopHints (graph-model, pure) scans a SKILL.md BODY for iteration vocabulary (until, repeat, iterate, for each, while, keep ...ing), frontmatter excluded so a description like 'repeat daily' never reads as a loop, deduped and capped at three. The hints ride skill nodes as facts, and every surface groups them INSIDE the skill, because a loop lives inside its one job, one container, one budget slot: the HTML renders a loop-carrying skill as a Node-RED group box (tinted rect labelled with the skill, the chip, one rearm marker per hint with the phrase, the ring wire contained in the box; sub-skills nest as small chips), the TUI shows rearm-glyph badges, the text view [loop: ...] badges. A hint is text evidence, never a promise: the mention discipline, applied to a node's insides. Scope. Forge groups now name the repositories their window's records actually ran against (forgeRepoTargets: the repo half of the id-only target string every runs view already shows, capped at five, labelled record-derived, because a github trigger's config names no repository at all). Local folders keep their full path in the TUI and text views; the HTML artifact stays basename-only by default and gains --full-paths, an explicit operator opt-in for the reviewed run.folder paths, because the artifact is a durable, shareable file. Specs: REQ-TOPOLOGY-GRAPH gains (e2) (loops as node facts grouped in the skill; record-derived forge scope); REQ-GRAPH-HTML-EXPORT gains the opt-in with its acceptance twin; SECURITY.md names the opt-in. GRAPH_LIMITS gains maxReposListed, literal-pinned. docs/graph.md gains the loops and scope sections; both READMEs' screenshot is regenerated from a fixture whose skill actually loops, image version bumped. Suite in the CI posture: 2175 pass, 0 skipped; admin bundle builds; the artifact re-verified in headless Chrome, default and --full-paths both. Signed-off-by: Rob Boerman <robboerman@live.nl>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Operator feedback on the shipped graph: it was not clear which repos or folders it covers, and the loop a skill's own text describes was nowhere to be seen. The second half was a real gap against the original ask — the design carried loop-in-skill markers, but the data layer never produced them.
Loops, grouped inside the skill
findLoopHints(pure, graph-model) scans each SKILL.md body for iteration vocabulary (until,repeat,iterate,for each,while,keep …ing), frontmatter excluded so adescription: repeat dailynever reads as a loop, deduped, capped at three. Every surface groups the hints inside the skill, because a loop lives inside its one job, one container, one budget slot:[loop: "…"]badges.A hint is text evidence, never a promise — the mention discipline, applied to a node's insides.
Which repos and folders
github · ran against acme/website— the repo half of the id-only recordtargetevery runs view already shows, capped at 5, labelled record-derived (a github trigger's config names no repository at all).--full-paths, an explicit operator opt-in for the reviewedrun.folderpaths.Specs (same PR)
REQ-TOPOLOGY-GRAPHgains (e2);REQ-GRAPH-HTML-EXPORTgains the opt-in with acceptance twins (the default-artifact no-path canary keeps holding); SECURITY.md names the opt-in;GRAPH_LIMITS.maxReposListedliteral-pinned;docs/graph.mdgains the loops and scope sections.READMEs and image
Both READMEs' screenshot regenerated from a fixture whose skill actually loops (the group box, the ⟳ marker, and the forge scope line are all visible in it), alt texts updated, image version bumped.
Verification
Suite in the CI posture: 2175 pass, 0 skipped; bundle builds; the artifact re-verified in headless Chrome in both modes; layout invariants extended (chip inside box, ring inside box, markers clear of wires, sub-chips unwired) and mutation-checked.