Every ticket as the root of its provenance graph — goal, patch, approval, runs and (as the ticket-class build lands) mandate, manifestations, guarantees, journey, artifacts and children. Rendered through the <<<TicketGraphList>>> tag.
Port tag DocList to Go, byte-equivalent vs the PHP render against the same DB [go-port:tags:tag:DocList]
goal
Port ONE unit of congruency to Go. ONE. This ticket is deliberately SMALL: porting a whole
layer at once is what #230 corrected (~150 units exist; a layer-sized tournament fails at that
size). Do not port anything outside this unit.
UNIT KEY : go-port:tags:tag:DocList
(the decomposer's idempotency marker — it lives in this ticket's TITLE. Do not edit
the title, or the unit will be re-filed as a duplicate.)
LAYER : tags — ticket #226 (the tag engine + invocators rendering identical HTML (execute_all_tags in Go))
PHP SOURCE: invocators/tags/dev/DocList.php
THE PHP ORIGINAL — the contract:
invocators/tags/dev/DocList.php
It is a `Tag_Interface` tag; the engine substitutes
it wherever <<<DocList>>> appears in a template, and the gallery renders it standalone at
?page=tags&tag=DocList (TagList::scan finds it under TAGS_DIR, so that URL resolves). Port THIS
tag only — its arguments, its SQL, its markup, and its empty/error state (a tag that degrades
gracefully against a missing dependency must degrade IDENTICALLY in Go; see
tools/tag_selfcheck.py for what each tag depends on).
PAGES WHOSE TEMPLATE EMBEDS <<<DocList>>> (read out of Document_Templates with the
engine's own pattern — these are the in-page substitution sites, and they are part
of this unit's gate):
docs
DEPENDS ON (build these first — each is its own unit ticket unless marked):
- go-port:tags:engine:engine_tag_wrapper
- go-port:tags:engine:engine_tag_parser
- go-port:tags:engine:engine_tagarguments
- go-port:tags:engine:engine_tag_interface
THE BUILD — small, and ITERATIVE:
1. Implement ONLY this unit in the Go port.
2. Run the gate below, PHP original vs Go port, over the SAME database.
3. If any diff is non-empty, fix the Go side and go back to 2. The PHP is the spec: when they
disagree, the Go port is wrong — never 'improve' the behaviour here. If the PHP is
genuinely defective, file a separate bug ticket and port the defect faithfully.
EQUIVALENCE-DIFF — both servers on the SAME db, byte-identical HTML.
1. the gallery render of THIS tag:
diff <(curl -s 'http://127.0.0.1:8899/?page=tags&tag=DocList') \
<(curl -s 'http://127.0.0.1:8900/?page=tags&tag=DocList')
2. every page that embeds it:
for p in docs; do
diff <(curl -s "http://127.0.0.1:8899/?page=$p") <(curl -s "http://127.0.0.1:8900/?page=$p") || echo "DIVERGES: $p";
done
Whitespace counts — diff raw bytes. If this tag takes arguments, drive each argument form the
templates above actually use, not just the bare invocation.
THE GATE (how this ticket settles): EVERY diff above is EMPTY. Not 'equivalent', not 'looks
right' — empty. Paste the exact diff invocations you ran and their empty output as the
evidence. A gate that does not exercise this unit is not this unit's gate: if you cannot make
a diff here run against THIS unit, say so on the ticket rather than settling on a diff that
would be empty even with the unit unimplemented.
Kind is `build` (a pair: coder + adversarial tester). This unit gets a tournament only if
someone judges it genuinely worth one — that is the exception on #230, not the default.
Filed mechanically by checkouts/current/congruency/tools/go_port_decomposer.py under ticket #230.
patch
none
approval
unapproved
runs
no runs recorded
mandate (clauses)
not yet recorded — lands with the ticket-class build
manifestations
not yet recorded — lands with the ticket-class build
guarantees
not yet recorded — lands with the ticket-class build
journey (blunders & successes)
not yet recorded — lands with the ticket-class build
artifacts (forge)
not yet recorded — lands with the ticket-class build