mirror of
https://github.com/Permissionless-Software-Foundation/psf-memo.git
synced 2026-09-21 16:52:01 -07:00
Record topics-table-layout review and verification
- Add the client verification record pinned to the review commit d1f0f76 and
the architect review summary.
By architect.
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
# Topics Table Layout — Architect Review
|
||||
|
||||
**By architect.**
|
||||
|
||||
## Task and commits reviewed
|
||||
|
||||
- Task: `topics-table-layout` (refactorer handoff
|
||||
`merge_and_process refactorer ec753a9c88`).
|
||||
- Merged `swarmforge-refactorer` (fast-forward). Commits:
|
||||
- `41af8f9` Spec topics table layout
|
||||
- `ac4d9ea` Render topics page as a table (coder)
|
||||
- `ec753a9` Add property tests for the topics table view model (refactorer)
|
||||
- Architect review commit: `d1f0f76` (tool-written mutation manifests only).
|
||||
- Verification record `git_sha`: `d1f0f76cca`.
|
||||
- Records/summary commit: (this commit).
|
||||
|
||||
The feature replaces the topics page flexbox list with a react-bootstrap
|
||||
`Table` so the four columns line up, driven by a pure `buildTopicsTable` view
|
||||
model (headers, per-row cells, feed link, horizontal-scroll wrapper). Client
|
||||
only.
|
||||
|
||||
## Architectural findings
|
||||
|
||||
- **UI/Core separation (good).** `src/services/topics-table.js` is a pure view
|
||||
model with no DOM or React dependency, so the header order, per-row cell
|
||||
order, link encoding, and scroll wrapper are all testable without a DOM. The
|
||||
React `Topics` component is a thin shell that maps the model into
|
||||
`<Table>`/`<thead>`/`<tbody>`; it is the environmentally unsuitable boundary
|
||||
and stays excluded from language mutation, consistent with the established UI
|
||||
precedent.
|
||||
- **Dependency direction (good).** The view model reuses `relative-time.js`
|
||||
for the label and `TopicDiscoveryPage.topicFeedPath` for the row link, so the
|
||||
path encoder is not re-implemented. `TopicDiscoveryPage` remains the
|
||||
load/pagination controller and the component's only data dependency.
|
||||
- **Information hiding (good).** The component consumes only `headers`,
|
||||
`rows[].cells`, `rows[].href`, `rows[].room`, and `wrapperClass`; the model
|
||||
hides the column order and percent-encoding. The horizontal-scroll contract
|
||||
is represented as `wrapperClass = 'table-responsive'` rather than left to
|
||||
JSX inspection.
|
||||
- **Local quality (good).** `buildTopicsTable` scans at CC 1 / CRAP 1.0 with
|
||||
100% coverage. `?? 0` defaults and `relativeTime` cover omitted count and
|
||||
last-seen fields for legacy topics.
|
||||
- **Observation, not changed.** The component recomputes the feed path in
|
||||
`handleClick` while each row already carries `href`; both produce the
|
||||
identical encoded path, so the redundancy is harmless.
|
||||
|
||||
## Fixes applied
|
||||
|
||||
None required. Language mutation killed every site, `dry4javascript` reported no
|
||||
candidates, CRAP is 1.0 at 100% coverage, and soft Gherkin mutation killed every
|
||||
mutation. The architect commit contains only the tool-written
|
||||
`mutate4javascript` manifest and the `gherkin-mutator` stamp/manifest.
|
||||
|
||||
## Verification
|
||||
|
||||
Record:
|
||||
|
||||
| File | Component |
|
||||
|------|-----------|
|
||||
| `docs/reviews/topics-table-layout-verification.json` | psf-memo-client |
|
||||
|
||||
Suite status (all `pass`): **psf-memo-client** 447 unit, 94 property,
|
||||
34 acceptance suites, lint ok, build ok.
|
||||
|
||||
- **Language mutation** (`mutate4javascript`, `--max-workers 8`):
|
||||
`topics-table.js` 2/2 killed, 0 survived.
|
||||
- **DRY** (`dry4javascript`, scoped to the changed service, component, unit and
|
||||
property tests): no candidates.
|
||||
- **CRAP** (`crap4javascript`): `buildTopicsTable` CC 1 / CRAP 1.0 / 100%
|
||||
coverage.
|
||||
- **Soft Gherkin acceptance mutation** (`gherkin-mutator --level soft
|
||||
--workers 8`): `topics-table-layout.feature` 16 total, **16 killed**, 0
|
||||
survived → the tool wrote a `# mutation-stamp` plus the per-scenario manifest
|
||||
(committed as-is).
|
||||
|
||||
## Handoffs
|
||||
|
||||
- End-of-chain `git_handoff` to `specifier` (priority 50) to merge
|
||||
`swarmforge-architect` into `master`, using the records/summary commit.
|
||||
- No coder/refactorer follow-up: the commit is tool-written mutation metadata
|
||||
only, with no production or test change.
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"task": "topics-table-layout",
|
||||
"component": "psf-memo-client",
|
||||
"git_sha": "d1f0f76ccac1091eaf72486ca30ecf495515f35b",
|
||||
"branch": "swarmforge-architect",
|
||||
"timestamp": "2026-09-18T14:46:43.742Z",
|
||||
"commands": [
|
||||
{
|
||||
"name": "unit",
|
||||
"command": "npm test",
|
||||
"exit": 0,
|
||||
"duration_ms": 10597,
|
||||
"summary": "447 pass / 0 fail"
|
||||
},
|
||||
{
|
||||
"name": "property",
|
||||
"command": "npm run test:property",
|
||||
"exit": 0,
|
||||
"duration_ms": 12116,
|
||||
"summary": "94 pass / 0 fail"
|
||||
},
|
||||
{
|
||||
"name": "acceptance",
|
||||
"command": "npm run test:acceptance",
|
||||
"exit": 0,
|
||||
"duration_ms": 17526,
|
||||
"summary": "all 34 acceptance suites passed"
|
||||
},
|
||||
{
|
||||
"name": "lint",
|
||||
"command": "npm run lint",
|
||||
"exit": 0,
|
||||
"duration_ms": 7691,
|
||||
"summary": "ok"
|
||||
},
|
||||
{
|
||||
"name": "build",
|
||||
"command": "npm run build",
|
||||
"exit": 0,
|
||||
"duration_ms": 70851,
|
||||
"summary": "ok"
|
||||
}
|
||||
],
|
||||
"result": "pass"
|
||||
}
|
||||
Reference in New Issue
Block a user