Timing total 4263103s
| Intake conversation | 600s |
| Gate 1 (spec review) | 96s |
| Planning | 52s |
| Gate 2 (plan review) | 126s |
| Specialists + checks | 5394s |
| Gate 3 (diff review) (in progress) | 4256835s |
Token burn total 230,921 (in 126,180 / out 104,741) · est. cost $8.78
orchestrator 96,581
+
specialists 134,340
=
total 230,921
| Phase | Input | Output | Total | Calls |
|---|---|---|---|---|
| intake | 1,504 | 527 | 2,031 | 1 |
| architect | 91,184 | 3,366 | 94,550 | 1 |
| specialist:postgres | 15,002 | 13,898 | 28,900 | 2 |
| specialist:api2 | 18,490 | 86,950 | 105,440 | 4 |
| TOTAL | 126,180 | 104,741 | 230,921 | 8 |
Agent Neo activity — live output from the architect & specialists
loading…
Candidate learnings 15 pending — harvested from specialist reports
Deviations and open questions the specialists flagged. Accepting
appends the note to context/learnings.md, which the
architect reads on future runs. Dismissing drops it. Nothing
enters the agents' context until you accept it.
open_question
specialist:postgres
**Case sensitivity:** implemented case-**insensitive** per the Gate-2 resolution. If product wants case-sensitive, change the predicate to `typ."TypeName" = ANY(_typeNames)`.
open_question
specialist:postgres
**Value cap:** no DB-layer cap on number of `typeName` values (left to the API2 validator), as agreed in the plan.
open_question
specialist:postgres
Runtime verification (`./build` / `./test`) should be re-run in an environment with Docker before merge.
deviation
specialist:api2
The spec's `files:` frontmatter was corrupted (one character per line) but decoded to `src/api/v2/projects/issues/issues.routes.ts`. Following the task brief ("implement the FULL API2 surface"), the change spans model → service → validator → controller → routes + tests, not the routes file alone.
deviation
specialist:api2
Filtering is done in the Node service layer rather than in SQL, since DB schema/function changes are out of scope. Trade-off: a paginated page can be shorter than `size` when matches are sparse on that page — same pre-existing pattern already documented for `isDeleted` filtering in the e2e suite.
open_question
specialist:api2
Case-insensitive + trimmed matching was chosen as the more forgiving behavior for a UI filter. If the platform requires exact, case-sensitive `TypeName` matching, narrow `filterRowsByTypeName` accordingly.
open_question
specialist:api2
Repeated query params (`?typeName=a&typeName=b`) are intentionally rejected (non-string → 400); only the comma-separated form from the spec is supported. Confirm that matches client expectations (dashboard sends `typeName=Quality`).
open_question
specialist:api2
If short-page pagination under sparse filters becomes a problem for clients, the filter should move into `fn_GetIssueList` / `fn_GetIssueListDetailed` (a follow-up DB change, explicitly out of scope here).
deviation
specialist:api2
Filtering is performed **in-memory on the page of rows returned by the existing query**, not pushed into SQL. This keeps the change minimal and honours the "no pagination behaviour change" constraint, but means a page may contain fewer than `size` matching issues when non-matching issues occupy the page. This matches the approach already present in the prior implementation and was kept per the "do not expand scope" instruction.
open_question
specialist:api2
Is in-memory, post-pagination filtering acceptable, or should the filter be pushed into `GET_ISSUE_LIST_QUERY` / `GET_DETAILED_ISSUE_LIST_QUERY` so pagination counts reflect the filtered set? (Out-of-scope per spec, flagged for awareness.)
open_question
specialist:api2
Should an unknown/typo'd `typeName` (no matches) return `200` with an empty list (current behaviour) or `400`? Current behaviour treats it as a valid empty result.
deviation
specialist:api2
**Filtering is applied in-memory after the paginated DB query** rather than pushed into the `fn_GetIssueList` / `fn_GetIssueListDetailed` DB functions. The spec keeps "pagination behaviour" and "schema/column changes" out of scope and the DB functions live in a separate repo, so the filter is applied in the service after `query(...)`. Trade-off: when combined with paging, a page is fetched first and then filtered, so a filtered page can contain fewer than `size` rows. This matches the approved plan's scope but is worth flagging.
open_question
specialist:api2
**In-memory vs. DB-side filtering** — confirm the in-memory approach is acceptable, given the pagination interaction noted above. If DB-side filtering is wanted, that needs a change in the PostgreSQLDatabase repo (out of scope here).
open_question
specialist:api2
I could not fetch the raw CI logs from this environment (`gh` is unavailable), so the e2e root cause above is the best-supported hypothesis from static analysis of the seed data + my diff, not a confirmed log line. If the real failure was elsewhere, the CI logs will show it on the next run.
open_question
specialist:api2
Page/filter interaction: the `WHERE` clause filters the rows returned by the paginated function, so a page can contain fewer than `size` matches even when more matching issues exist on later DB pages. This matches the existing pagination semantics and the spec lists pagination changes as out of scope, but if the dashboard needs "N matches per page" we'd need the filter pushed *inside* the stored function (a DB migration) — out of scope here. Confirm the current behaviour is acceptable.
Conversation
JIRA: PLT-3535
Add an additive typeName filter param to GET /issues so clients can scope the list server-side. The dashboard currently fetches all issue types and filters to Quality client-side, transferring and ingesting issues it immediately discards.
Acceptance Criteria
- GET /issues accepts an additive, comma-separated typeName query param; when present, only issues of those type names are returned.
- Param uses typeName, NOT typeId (typeId is project-scoped via composite PK ("ProjectShardId","IssueTypeId")).
- Omitting the param is fully backward-compatible: default response shape and contents unchanged (web / XYZMobile / AtomOS unaffected).
Technical Notes
- Precedent: fn_GetLegacyIssue.sql:115.
- Pairs with the dashboard requesting only typeName=Quality instead of all types then filtering client-side; reduces the ~11.7 MB issues payload (Phase 1 removed compute, not bytes).
Add an additive typeName filter param to GET /issues so clients can scope the list server-side. The dashboard currently fetches all issue types and filters to Quality client-side, transferring and ingesting issues it immediately discards.
Acceptance Criteria
- GET /issues accepts an additive, comma-separated typeName query param; when present, only issues of those type names are returned.
- Param uses typeName, NOT typeId (typeId is project-scoped via composite PK ("ProjectShardId","IssueTypeId")).
- Omitting the param is fully backward-compatible: default response shape and contents unchanged (web / XYZMobile / AtomOS unaffected).
Technical Notes
- Precedent: fn_GetLegacyIssue.sql:115.
- Pairs with the dashboard requesting only typeName=Quality instead of all types then filtering client-side; reduces the ~11.7 MB issues payload (Phase 1 removed compute, not bytes).
Scope is clear from the ticket. Producing the spec now.
Spec ready — see Gate 1 below.
_Addressing CI failure automatically (round 1/3) on: api2. The revised diff will re-open Gate 3 for review before any push._
Chat closed — run has advanced past intake.
Spec
approve
Plan
approve
Specialist bundles pending
postgres
at storage/clones/0adf42f628c1/postgres
added: 0
modified: 0
deleted: 0
api2
at storage/clones/0adf42f628c1/api2
added: 2
modified: 3
deleted: 0
Gate 3: approve, revise, or reject
Test verification:
api2: passed
test log & output
src/api/v2/logs | 76.92 | 65.3 | 70 | 75.71 | logs.controller.ts | 78.72 | 75 | 75 | 78.57 | 73-84 logs.validator.ts | 74.19 | 58.62 | 50 | 71.42 | 35-46 src/api/v2/portfolios | 75.77 | 70.93 | 84.21 | 78.36 | portfolios.controller.ts | 79.04 | 85.71 | 90.9 | 79.04 | ...81-182,192-193 portfolios.validator.ts | 71.91 | 68.05 | 75 | 77.27 | ...,89-94,103,106 src/api/v2/projects | 83.33 | 83.33 | 76.74 | 83.14 | projects.controller.ts | 81.92 | 75.86 | 75 | 81.7 | ...71,720-722,739 projects.validator.ts | 86.57 | 88.75 | 85.71 | 86.99 | ...81,184,187,214 src/api/v2/projects/activities | 84.61 | 79.81 | 78.84 | 84.14 | activities.categories.controller.ts | 65.27 | 40.74 | 62.5 | 63.41 | ...46-156,173-191 activities.categories.helpers.ts | 98.71 | 90.19 | 100 | 98.61 | 89 activities.controller.ts | 68.08 | 100 | 66.66 | 66.66 | 34-42,50-61 activities.mapping.controller.ts | 98.14 | 88.88 | 100 | 98.07 | 58 activities.validators.ts | 99.01 | 98.66 | 100 | 100 | 50 package.prediction.controller.ts | 100 | 66.66 | 100 | 100 | 18-19 src/api/v2/projects/batchfiles | 78.78 | 25 | 100 | 78.78 | batchfiles.controller.ts | 78.78 | 25 | 100 | 78.78 | 19-29,46,59 src/api/v2/projects/categoryTypes | 91.57 | 100 | 88.23 | 91.02 | category.types.controller.ts | 91.57 | 100 | 88.23 | 91.02 | 110-117 src/api/v2/projects/cde | 50.56 | 47.82 | 46.66 | 48.82 | cde.controller.ts | 32.17 | 0 | 30 | 32.17 | ...81-198,203-270 cde.criteria.validator.ts | 78.37 | 60 | 66.66 | 78.78 | 17-21,28-31,56-57 cde.link.validator.ts | 92.3 | 88.88 | 100 | 90.9 | 43,62 src/api/v2/projects/coordinates | 90.98 | 84.11 | 91.93 | 90.5 | conflict.controller.ts | 100 | 100 | 100 | 100 | conflict.validator.ts | 94.73 | 91.66 | 100 | 93.75 | 43-44 coordinates.controller.ts | 82.55 | 77.41 | 78.26 | 81.81 | ...73,249,254-255 coordinates.helper.ts | 94.54 | 65 | 100 | 96.07 | 70,78 coordinates.validator.ts | 97.4 | 95 | 100 | 96.77 | 34,56 src/api/v2/projects/devices | 100 | 100 | 100 | 100 | project.devices.controller.ts | 100 | 100 | 100 | 100 | project.devices.delegation.ts | 100 | 100 | 100 | 100 | project.devices.validator.ts | 100 | 100 | 100 | 100 | src/api/v2/projects/devices/handlers | 100 | 92.85 | 100 | 100 | project.devices.v1.handler.ts | 100 | 92.85 | 100 | 100 | 38 src/api/v2/projects/disciplines | 92.85 | 75 | 100 | 91.66 | disciplines.controller.ts | 92.85 | 75 | 100 | 91.66 | 18,36 src/api/v2/projects/elements | 93.77 | 84.11 | 95.65 | 93.29 | element-helpers.ts | 50 | 100 | 0 | 50 | 14 elements.activities.controller.ts | 95.31 | 78.37 | 100 | 94.82 | 23,42-43 elements.activities.validator.ts | 100 | 100 | 100 | 100 | elements.status.controller.ts | 90.69 | 80.76 | 100 | 89.74 | 82-89,131-137 elements.status.validator.ts | 96.55 | 87.5 | 100 | 97.77 | 47 src/api/v2/projects/folders | 91.66 | 82.81 | 96 | 91.01 | folders.controller.ts | 89.4 | 70.27 | 95.23 | 88.88 | ...93-197,237,243 folders.validator.ts | 100 | 100 | 100 | 100 | src/api/v2/projects/images | 75.28 | 50 | 100 | 75.28 | image.uploader.ts | 75.28 | 50 | 100 | 75.28 | ...97-214,233-282 ...api/v2/projects/images/360captures | 93.95 | 85.18 | 100 | 94.3 | 360captures.controller.ts | 95.65 | 80 | 100 | 95.06 | 69,82,103-104 360captures.validator.ts | 91.22 | 86.36 | 100 | 92.85 | 44-47 src/api/v2/projects/images/photos | 83.69 | 71.42 | 88 | 83 | photos.controller.ts | 88.07 | 75 | 90 | 86.95 | 79,111,124-140 photos.validator.ts | 77.33 | 70.83 | 80 | 77.04 | ...59,62,69,89-94 src/api/v2/projects/issues | 71.07 | 47.82 | 65.11 | 70.26 | issue.comments.controller.ts | 100 | 100 | 100 | 100 | issue.comments.validator.ts | 88.46 | 75 | 100 | 100 | 17-28 issue.notification.service.ts | 25 | 0 | 0 | 25 | 25-49,54-71 issues.controller.ts | 68.51 | 29.16 | 58.33 | 68.3 | ...36-244,249-255 issues.validator.ts | 76.31 | 64.44 | 72.72 | 75 | ...13,165-178,192 src/api/v2/projects/issues/categories | 97.72 | 92 | 100 | 97.36 | issues.categories.controller.ts | 100 | 100 | 100 | 100 | issues.categories.validator.ts | 95.74 | 91.3 | 100 | 95.12 | 69,73 .../v2/projects/issues/fileReferences | 97.22 | 78.94 | 100 | 96.87 | issues.fileReferences.controller.ts | 96.15 | 70.83 | 100 | 95.83 | 67,72 issues.fileReferences.validator.ts | 100 | 92.85 | 100 | 100 | 11 src/api/v2/projects/issues/history | 99.29 | 83.15 | 100 | 99.23 | issue.history.controller.ts | 99.23 | 82.41 | 100 | 99.18 | 86 issue.history.validator.ts | 100 | 100 | 100 | 100 | src/api/v2/projects/issues/models | 100 | 83.33 | 100 | 100 | issues.models.controller.ts | 100 | 50 | 100 | 100 | 15-34 issues.models.validator.ts | 100 | 92.85 | 100 | 100 | 11 src/api/v2/projects/markers | 81.73 | 84.44 | 80 | 83.87 | marker.validator.ts | 81.81 | 81.08 | 83.33 | 86.36 | 30-34,77-81 markers.controller.ts | 81.63 | 100 | 75 | 81.63 | 55-57,68-75 src/api/v2/projects/models | 94.4 | 92.5 | 94.73 | 93.7 | models.controller.ts | 89.1 | 83.33 | 87.5 | 88.5 | 26,84-92,136-137 models.validator.ts | 95.16 | 91.48 | 100 | 94.17 | 36-39,93-96 models.version.controller.ts | 100 | 100 | 100 | 100 | request.validator.ts | 100 | 100 | 100 | 100 | src/api/v2/projects/projectfiles | 86.2 | 84.61 | 57.14 | 86.53 | projectfiles.controller.ts | 86.2 | 84.61 | 57.14 | 86.53 | 18-38 src/api/v2/projects/rooms | 88.63 | 50 | 71.42 | 89.18 | rooms.controller.ts | 100 | 100 | 100 | 100 | rooms.validator.ts | 72.22 | 50 | 33.33 | 71.42 | 31-35,39 ...pi/v2/projects/rooms/capturepoints | 86.13 | 73.64 | 100 | 93.75 | rooms.capturepoints.controller.ts | 100 | 50 | 100 | 100 | 46-47 rooms.capturepoints.validator.ts | 80.55 | 75 | 100 | 90.9 | ...67,170,178,181 src/api/v2/projects/schedules | 97.36 | 93.33 | 100 | 97.77 | schedules.controller.ts | 96.92 | 75 | 100 | 96.22 | 32-33 schedules.validator.ts | 97.95 | 97.29 | 100 | 100 | 32 src/api/v2/projects/userfiles | 86.84 | 90.62 | 80 | 86.36 | userfiles.controller.ts | 85.24 | 91.66 | 75 | 84.9 | 23,32-45 userfiles.validator.ts | 93.33 | 87.5 | 100 | 92.3 | 14 src/api/v2/projects/videos | 69.79 | 74.73 | 62.5 | 68.51 | videos.controller.ts | 67.64 | 80 | 57.89 | 66.94 | ...69-197,201-213 videos.validator.ts | 75 | 68.88 | 80 | 72.72 | 41-62,86,94 src/api/v2/tenants | 69.76 | 50 | 60 | 69.44 | tenant.controller.ts | 61.29 | 0 | 50 | 59.25 | 27-40 tenant.validator.ts | 91.66 | 75 | 100 | 100 | 17 src/clients | 50.13 | 45.35 | 37.5 | 49.65 | ai.service.client.ts | 68.05 | 44.23 | 58.33 | 67.6 | ...-69,82,146,163 authorised.iam.client.ts | 11.34 | 0 | 0 | 10.41 | ...25-188,193-201 authorised.notification.client.ts | 78.57 | 52 | 50 | 78.04 | 77-80,110-122 autodesk.client.ts | 10.61 | 100 | 10.52 | 9.82 | ...74,285-287,293 autodesk.profile.client.ts | 63.15 | 75 | 50 | 61.11 | 16-28,42 billy.search.client.ts | 55.55 | 66.66 | 50 | 52.94 | 22-42,55 clients.ts | 52 | 31.94 | 35.71 | 53.06 | ...32,46-55,66-96 iam.client.helper.ts | 100 | 90.9 | 100 | 100 | 29,70 iam.client.ts | 69.29 | 49.09 | 58.82 | 68.75 | ...18,290,296,301 mapbox.client.ts | 100 | 91.66 | 100 | 100 | 33,48-49 redis.client.ts | 33.33 | 22.44 | 31.25 | 34.54 | ...06-141,150-220 service.clients.ts | 100 | 100 | 100 | 100 | src/db | 28.07 | 0 | 0 | 26 | db.ts | 28.07 | 0 | 0 | 26 | ...93-100,112-126 src/middleware | 44.72 | 30.23 | 46.15 | 43.31 | api-version.middleware.ts | 100 | 100 | 100 | 100 | authorisation.ts | 56.52 | 38.7 | 47.61 | 55.44 | ...95,127-155,183 middleware.ts | 26.36 | 16.32 | 41.17 | 25 | ...75-192,201-208 src/models | 100 | 100 | 100 | 100 | egress.ts | 100 | 100 | 100 | 100 | ingress.ts | 100 | 100 | 100 | 100 | src/services | 37.78 | 28.53 | 28.88 | 37.42 | 360capture.service.ts | 60.46 | 45 | 50 | 59.52 | ...8,42-44,90-100 activities.categories.service.ts | 17.92 | 0 | 0 | 18.26 | ...50-179,185-201 activities.service.ts | 21.52 | 11.11 | 11.11 | 21.67 | ...25-168,189-327 azure.blob.service.ts | 18.79 | 0 | 0 | 16.8 | ...08-211,233-266 azure.table.service.ts | 14.92 | 0 | 0 | 16.39 | ...67-106,112-145 batchfiles.service.ts | 25.8 | 0 | 0 | 25.8 | ...,81-94,112-113 category.types.service.ts | 27.08 | 0 | 0 | 27.08 | ...6-75,80-85,111 cde.service.ts | 17.72 | 0 | 0 | 17.72 | ...13-223,227-347 cde.user.service.ts | 30.76 | 0 | 0 | 30.76 | 9-25 coordinates.conflict.service.ts | 16.25 | 0 | 0 | 16.25 | ...,88-98,105-184 coordinates.service.ts | 15.38 | 0 | 0 | 15.5 | ...69-179,185-245 default.disciplines.service.ts | 24.24 | 0 | 0 | 25 | ...36,41-48,53-59 devices.service.ts | 37.16 | 18.03 | 25 | 37.24 | ...48,254,262-291 disciplines.service.ts | 31.57 | 100 | 0 | 33.33 | 9-22,26-36 fileReference.service.ts | 42.85 | 100 | 0 | 42.85 | 6-13 folders.service.ts | 71.79 | 50 | 88.46 | 68.57 | ...16-233,253-257 issue.comments.service.ts | 75.92 | 67.5 | 100 | 74.5 | 24-32,55-64 issue.history.service.ts | 41.86 | 68 | 42.85 | 41.46 | ...,80,99-105,156 issue.location.ts | 33.33 | 0 | 0 | 31.57 | 11-22,28-34 issue.severity.service.ts | 38.46 | 0 | 0 | 38.46 | 9-23 issue.types.service.ts | 27.58 | 0 | 0 | 24 | 9-20,26-51 issues.categories.service.ts | 42.85 | 0 | 0 | 45 | 23-48,60 issues.fileReference.service.ts | 42.85 | 0 | 0 | 45 | 12-30,36 issues.models.service.ts | 50 | 0 | 0 | 50 | 11-21,27 issues.service.ts | 40.62 | 28.08 | 40.62 | 39.03 | ...03-409,475-508 markers.services.ts | 15.15 | 0 | 0 | 15.38 | ...7,74-86,93-111 model.elements.status.service.ts | 15.03 | 0 | 0 | 15.03 | ...60-285,291-292 models.service.ts | 19.78 | 1.52 | 10 | 20 | ...95-283,295-414 models.version.service.ts | 21.73 | 0 | 0 | 22.05 | ...44-155,167-176 package.predictions.service.ts | 23.8 | 0 | 0 | 23.8 | 12-40 photos.service.ts | 50 | 42.85 | 22.22 | 49.12 | ...7,72-74,99-133 portfolio.service.ts | 70.43 | 46.99 | 90.9 | 73.09 | ...47-350,368-371 projectfiles.service.ts | 88.88 | 90 | 85.71 | 89.7 | 63-70 projects.service.ts | 50 | 49.52 | 39.47 | 49.82 | ...06,909,912,915 rooms.capturepoints.service.ts | 75.62 | 71.79 | 85.71 | 75.47 | ...99,310,314-319 rooms.service.ts | 20.68 | 0 | 0 | 20.68 | 9-22,28-50 schedules.service.ts | 47.05 | 26.43 | 46.66 | 46.66 | ...42,333-365,391 userfiles.service.ts | 19.23 | 0 | 0 | 19.23 | ...02-304,323-372 videos.service.ts | 44.82 | 18.75 | 25 | 43.85 | ...94-105,117-137 src/types | 90.1 | 92.85 | 73.58 | 89.77 | DbColumnsMappings.ts | 100 | 100 | 100 | 100 | categoryTypeHierarchyMapping.ts | 100 | 100 | 100 | 100 | cde.types.ts | 100 | 100 | 100 | 100 | devices.types.ts | 100 | 100 | 100 | 100 | errortypes.ts | 77.19 | 100 | 50 | 77.19 | ...04,110,122,134 http.types.ts | 100 | 100 | 100 | 100 | iam.types.ts | 100 | 100 | 100 | 100 | logger.properties.ts | 100 | 100 | 100 | 100 | marker.types.ts | 100 | 100 | 100 | 100 | model.elements.ts | 100 | 100 | 100 | 100 | notification.types.ts | 87.17 | 71.42 | 83.33 | 87.17 | 24-32 portfolio.types.ts | 100 | 100 | 100 | 100 | project.attachment.types.ts | 100 | 100 | 100 | 100 | src/util | 83.3 | 70.64 | 80.41 | 83.23 | array.util.ts | 100 | 100 | 100 | 100 | azure.util.ts | 95.74 | 85 | 94.73 | 95.69 | 64,205-226 blob-download-url.cache.ts | 94.44 | 91.3 | 100 | 94.44 | 46,78,100 business-region.ts | 100 | 100 | 100 | 100 | cde.token.util.ts | 100 | 100 | 100 | 100 | error.logger.util.ts | 100 | 100 | 100 | 100 | errorFormatter.ts | 96 | 100 | 85.71 | 95.23 | 50 fileDeletion.handler.ts | 96.66 | 72.72 | 100 | 96.66 | 80 fileReference.deletion.util.ts | 35.71 | 0 | 0 | 35.71 | 24-34 image.util.ts | 69.23 | 43.75 | 100 | 67.56 | ...37,44,56,74-80 logger.ts | 100 | 96.42 | 100 | 100 | 58 metrics.ts | 82.02 | 63.63 | 71.42 | 82.02 | ...87-291,328-332 pagination.util.ts | 88.88 | 91.66 | 100 | 85.71 | 14 query.util.ts | 26.19 | 2.56 | 42.85 | 26.19 | 11-23,39-47,54-76 store.ts | 100 | 100 | 100 | 100 | token.util.ts | 81.48 | 66.66 | 71.42 | 81.48 | 19,42-46 url.util.ts | 100 | 100 | 100 | 100 | username.ts | 83.33 | 77.77 | 100 | 100 | 8-11 utilities.ts | 100 | 100 | 100 | 100 | ---------------------------------------|---------|----------|---------|---------|-------------------
Revision round 2 applied.
Pipeline artifacts
Generated for review — not included in any PR or pushed to the repo.
api2:
_SPECIALIST_REPORT.md
docs/specs/20260623-153846-agent-feature.md
docs/specs/20260623-160704-agent-feature.md
docs/specs/20260623-162407-agent-feature.md
docs/specs/20260623-165915-agent-feature.md
docs/specs/EXAMPLE-add-issue-status-filter.md
docs/specs/PAPI-3286.md
docs/specs/PAPI-3286_filehash.md
docs/specs/PAPI-3340.md
docs/specs/README.md
test-01-npx-tsc-noemit-output.txt
test-02-npm-test-output.txt
test-install-output.txt