Repository navigation
Dogfood Frame #102–#105 on Factory status and Pending preview - #11
Merged
Merged
Conversation
Factory status selected its snapshot with a POST body, copied dict fields by hand, and the panel escaped HTML with str_split. This path now uses req_path, req_query, req_header, map_keys, chained map_get, html_escape, and attr_escape. It stays a projection: no Factory start, lock, queue write, or owner_direction. Co-authored-by: William Elias <wylelias.123@gmail.com>
howlcipher
commented
Sep 29, 2026
howlcipher
left a comment
Owner
Author
There was a problem hiding this comment.
Dev Lead: APPROVE with nits for Frame #102–#105 dogfood.
Projection-only path looks correct: path/query/header source selection (POST body no longer selects), map_keys allowlists drop private blocker notes, tip lock chains map_get only after a present intermediate, and factory_view uses html_escape/attr_escape with constant handlers only. Caps and Factory start/lock/queue/owner_direction boundaries are unchanged; contract tests cover the selector matrix, fixture/pending, and escapes; CI green on a3c8525.
Nits (non-blocking): architecture diagram should name factory_view.howl; a non-dict commit tip negative test would lock the TYPE_ERROR catch path. Undraft + squash-merge when ready.
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.
Consumer dogfood of HowlFrame #102–#105. No new Frame opcodes. Factory status and the Pending preview are the Board path that now uses the surface that landed on howlframe main. This does not start Factory, take the supervisor lock, write a queue, or trust
owner_direction. howlplane #122 is untouched.factory-status-fixture-and-pending-preview.mp4
What was swapped
Factory status used to select
publishedvsfixturewithPOST {"source":...}because the request surface was body-only. The selector is now a request read:GET /api/factory/status/{source}viareq_path(what the panel calls)GET /api/factory/status?source=viareq_queryX-Howlboard-Factory-Sourceviareq_headerPath wins, then query, then header. A missing selector is
""(map_get's absence sentinel) and means published. A JSON body is not a selector.Status text fields and blockers are copied by walking
map_keysagainst an allowlist. Unknown keys, including a private note on a blocker, do not reach the response.Tip lock accepts
{"sha":"..."}or{"commit":{"sha":"..."}}. The nested read is chainedmap_get, and it runs only after the intermediate is present, because a miss is""andmap_getof that string isTYPE_ERROR.The Factory panel (
frontend/factory_view.howl) useshtml_escapefor text andattr_escapefordata-provenance,data-class, anddata-markdown. It does not build an inline handler. Mission rendering still uses the hand-rolledesc. The Pending preview is still a POST: it submits a row, it does not read a selector./api/projectsis still a list of records. That public shape was left alone.How to verify
In a second terminal:
make run-frontend. Open http://localhost:3000.data/factory/status/remote-snapshot.json, the Factory panel reports published Plane tip status, or unknown if that tip cannot be read. Nothing was started.GET /api/factory/status/published.GET /api/factory/status/fixture. The badge saysFIXTURE, campaignabc123, and the three blocker classes are shown.Pending.The same fixture read is
curl -s 'http://localhost:8080/api/factory/status?source=fixture'andcurl -s -H 'X-Howlboard-Factory-Source: fixture' http://localhost:8080/api/factory/status.curl -s -X POST -d '{"source":"fixture"}' http://localhost:8080/api/factory/statusdoes not select the fixture.To show artifacts inline, enable in settings.