···11{"id":"hcs-01nd","title":"MEDIUM: Validate Sec-WebSocket-Version header during handshake","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-06T11:52:50.538107666+01:00","created_by":"gdiazlo","updated_at":"2026-01-06T12:09:43.205539723+01:00","closed_at":"2026-01-06T12:09:43.205539723+01:00","close_reason":"Added validate_websocket_version function to websocket.ml. Server now validates Sec-WebSocket-Version header per RFC 6455, responding with 426 Upgrade Required and supported version (13) if invalid."}
22-{"id":"hcs-02q7","title":"Add security-focused fuzz testing for HTTP parsing","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-06T11:52:51.912443162+01:00","created_by":"gdiazlo","updated_at":"2026-01-06T11:52:51.912443162+01:00"}
22+{"id":"hcs-02q7","title":"Add security-focused fuzz testing for HTTP parsing","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T11:52:51.912443162+01:00","created_by":"gdiazlo","updated_at":"2026-01-12T23:50:33.924474729+01:00","closed_at":"2026-01-12T23:50:33.924474729+01:00","close_reason":"Added 15 security-focused fuzz tests using QCheck for query string, form body, and router path parsing. All tests pass."}
33{"id":"hcs-0bi","title":"docs: Create docs/ folder structure and README","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-03T00:44:13.323975386+01:00","updated_at":"2026-01-03T00:47:16.216273256+01:00","closed_at":"2026-01-03T00:47:16.216273256+01:00"}
44{"id":"hcs-0ro","title":"Implement WebSocket frame types and parsing","description":"Implement WebSocket wire format in hcs-core/ws_frame.ml:\n\n```ocaml\ntype frame =\n | Text of string\n | Binary of Cstruct.t\n | Ping of Cstruct.t\n | Pong of Cstruct.t\n | Close of int option * string option\n\ntype parse_result =\n | Complete of frame * int (* frame and bytes consumed *)\n | Incomplete of int (* need more bytes *)\n | Error of string\n\nval parse_frame : Cstruct.t -\u003e parse_result\nval serialize_frame : ?mask:bool -\u003e frame -\u003e Cstruct.t\n\n(* Handshake *)\nval make_handshake_request : Uri.t -\u003e ?protocols:string list -\u003e Headers.t -\u003e request\nval validate_handshake_response : response -\u003e (string option, string) result (* selected protocol *)\nval make_handshake_response : request -\u003e ?protocol:string -\u003e (response, string) result\n```\n\nPure parsing/serialization.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-29T14:34:32.864373772+01:00","updated_at":"2025-12-29T16:00:43.877842667+01:00","closed_at":"2025-12-29T16:00:43.877842667+01:00","dependencies":[{"issue_id":"hcs-0ro","depends_on_id":"hcs-lhr","type":"parent-child","created_at":"2025-12-29T14:34:52.111489961+01:00","created_by":"gdiazlo","metadata":"{}"}]}
55{"id":"hcs-0y4","title":"Implement compression middleware with gzip and zstd support","status":"closed","priority":1,"issue_type":"feature","created_at":"2026-01-01T18:44:00.161388436+01:00","updated_at":"2026-01-01T18:53:17.947904901+01:00","closed_at":"2026-01-01T18:53:17.947904901+01:00"}
66{"id":"hcs-0zq","title":"Testing Infrastructure and Compliance","description":"Set up testing infrastructure including unit tests, integration tests, and HTTP compliance test suites for both client and server implementations.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-29T14:35:43.905080385+01:00","updated_at":"2025-12-29T17:57:31.987947689+01:00","closed_at":"2025-12-29T17:57:31.987947689+01:00","dependencies":[{"issue_id":"hcs-0zq","depends_on_id":"hcs-zba","type":"parent-child","created_at":"2025-12-29T14:35:55.080432801+01:00","created_by":"gdiazlo","metadata":"{}"}]}
77{"id":"hcs-15v","title":"Run tests and fix any issues","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-01T22:16:47.827724667+01:00","updated_at":"2026-01-01T22:22:18.249274206+01:00","closed_at":"2026-01-01T22:22:18.249274206+01:00","dependencies":[{"issue_id":"hcs-15v","depends_on_id":"hcs-g40","type":"blocks","created_at":"2026-01-01T22:17:06.229519632+01:00","created_by":"gdiazlo","metadata":"{}"}]}
88{"id":"hcs-1h7","title":"Create Go WebSocket benchmark server","description":"Go server using gorilla/websocket or nhooyr.io/websocket. Same interface as HCS: accept connections, keep alive, report count.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T09:59:59.144195314+01:00","updated_at":"2025-12-30T10:08:50.856707182+01:00","closed_at":"2025-12-30T10:08:50.856707182+01:00","dependencies":[{"issue_id":"hcs-1h7","depends_on_id":"hcs-jk8","type":"parent-child","created_at":"2025-12-30T10:00:30.601603816+01:00","created_by":"gdiazlo","metadata":"{}"}]}
99-{"id":"hcs-1lvl","title":"[Epic] v0.2.0: Router pipelines + per-route plugs (Phoenix-style)","description":"Refactor to support plugs at multiple layers like Phoenix:\n\n1. **Endpoint**: Global plugs (static files, request_id, session) - ALL requests\n2. **Router Pipelines**: Groups of plugs applied to route scopes (browser vs api)\n3. **Per-route plugs**: Individual routes with their own middleware\n\nAlso fix Endpoint to not duplicate Server config.\n\nThis is a breaking change.","status":"open","priority":1,"issue_type":"epic","created_at":"2026-01-03T20:59:19.284234549+01:00","created_by":"gdiazlo","updated_at":"2026-01-03T21:10:45.319880674+01:00"}
99+{"id":"hcs-1lvl","title":"[Epic] v0.2.0: Router pipelines + per-route plugs (Phoenix-style)","description":"Refactor to support plugs at multiple layers like Phoenix:\n\n1. **Endpoint**: Global plugs (static files, request_id, session) - ALL requests\n2. **Router Pipelines**: Groups of plugs applied to route scopes (browser vs api)\n3. **Per-route plugs**: Individual routes with their own middleware\n\nAlso fix Endpoint to not duplicate Server config.\n\nThis is a breaking change.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-03T20:59:19.284234549+01:00","created_by":"gdiazlo","updated_at":"2026-01-12T23:45:20.965284277+01:00","closed_at":"2026-01-12T23:45:20.965284277+01:00","close_reason":"All subtasks completed - v0.2.0 Phoenix-style architecture shipped"}
1010{"id":"hcs-1op","title":"Web framework building blocks","description":"Implement 5 core features to make HCS a minimal but complete web framework: Sessions, Tokens, Content Negotiation, Endpoint, and PubSub/Channels. Focus on minimal allocations, functional composition, and simplicity over feature parity with Phoenix.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-01T20:46:34.289608444+01:00","updated_at":"2026-01-01T21:36:15.141649231+01:00","closed_at":"2026-01-01T21:36:15.141649231+01:00"}
1111{"id":"hcs-1uy","title":"HTTP/2 Specific Features","description":"Implement H2 module with server push, stream priority, and HTTP/2 detection.","status":"closed","priority":3,"issue_type":"epic","created_at":"2025-12-29T14:25:37.55760677+01:00","updated_at":"2025-12-29T17:40:54.000014455+01:00","closed_at":"2025-12-29T17:40:54.000014455+01:00","dependencies":[{"issue_id":"hcs-1uy","depends_on_id":"hcs-zba","type":"parent-child","created_at":"2025-12-29T14:26:20.914923161+01:00","created_by":"gdiazlo","metadata":"{}"}]}
1212{"id":"hcs-1v2c","title":"Implement: Add health_check as optional Plug","description":"Consider making health_check a proper Plug instead of baked-in behavior:\n- Create Plug.Health module (or keep inline)\n- Allow custom health check paths/responses\n- Make it opt-in rather than opt-out\n\nThis is optional but cleaner design.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-03T20:59:39.352248651+01:00","created_by":"gdiazlo","updated_at":"2026-01-03T21:11:08.141670622+01:00","closed_at":"2026-01-03T21:11:08.141670622+01:00","close_reason":"Superseded by expanded scope - adding router pipelines","dependencies":[{"issue_id":"hcs-1v2c","depends_on_id":"hcs-pcri","type":"blocks","created_at":"2026-01-03T21:00:12.788719112+01:00","created_by":"gdiazlo"},{"issue_id":"hcs-1v2c","depends_on_id":"hcs-1lvl","type":"parent-child","created_at":"2026-01-03T21:00:19.523428797+01:00","created_by":"gdiazlo"}]}
···136136{"id":"hcs-lpr","title":"Implement request and response record types","description":"Implement request and response records in types.ml:\n\n```ocaml\ntype request = {\n meth : method_;\n uri : Uri.t;\n version : version;\n headers : Headers.t;\n body : body;\n}\n\ntype response = {\n status : status;\n version : version;\n headers : Headers.t;\n body : body;\n}\n```\n\nInclude smart constructors and accessors. Pure OCaml + uri package.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-29T14:27:19.295375903+01:00","updated_at":"2025-12-29T14:50:46.801981182+01:00","closed_at":"2025-12-29T14:50:46.801981182+01:00","labels":["core"],"dependencies":[{"issue_id":"hcs-lpr","depends_on_id":"hcs-ugs","type":"blocks","created_at":"2025-12-29T14:27:19.300960037+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-lpr","depends_on_id":"hcs-6yl","type":"blocks","created_at":"2025-12-29T14:27:43.920564401+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-lpr","depends_on_id":"hcs-cmg","type":"blocks","created_at":"2025-12-29T14:27:44.815114113+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-lpr","depends_on_id":"hcs-cks","type":"blocks","created_at":"2025-12-29T14:27:45.656483969+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-lpr","depends_on_id":"hcs-chm","type":"blocks","created_at":"2025-12-29T14:27:46.481924426+01:00","created_by":"gdiazlo","metadata":"{}"}]}
137137{"id":"hcs-lqi","title":"Implement HTTP/1.1 server (Eio)","description":"Implement HTTP/1.1 server for Eio in hcs-eio/h1_server.ml:\n\n```ocaml\nval handle_connection :\n flow:Eio.Flow.two_way -\u003e\n clock:Eio.Time.clock -\u003e\n config:Server.config -\u003e\n handler:(request -\u003e (response, error) result) -\u003e\n unit\n```\n\nFeatures:\n- Parse requests using h1 parser\n- Handle keep-alive connections\n- Support chunked and fixed-length bodies\n- Respect timeouts\n- Handle pipelining (optional)\n- Integrate with logging","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-29T14:33:22.560229088+01:00","updated_at":"2025-12-29T15:03:24.765221644+01:00","closed_at":"2025-12-29T15:03:24.765221644+01:00","dependencies":[{"issue_id":"hcs-lqi","depends_on_id":"hcs-rw6","type":"parent-child","created_at":"2025-12-29T14:33:42.102983428+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-lqi","depends_on_id":"hcs-56z","type":"blocks","created_at":"2025-12-29T14:33:44.325287786+01:00","created_by":"gdiazlo","metadata":"{}"}]}
138138{"id":"hcs-lskj","title":"Update: Export App module in hcs.ml","description":"Update lib/hcs.ml:\n- Add: module App = App\n- Keep: module Endpoint = App (deprecated alias for backward compat)\n- Update docstrings to reflect new design\n- Add deprecation notice for Endpoint","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-03T20:59:43.868501712+01:00","created_by":"gdiazlo","updated_at":"2026-01-03T21:11:18.247236619+01:00","closed_at":"2026-01-03T21:11:18.247236619+01:00","close_reason":"Superseded by expanded scope - adding router pipelines","dependencies":[{"issue_id":"hcs-lskj","depends_on_id":"hcs-pcri","type":"blocks","created_at":"2026-01-03T21:00:22.904885823+01:00","created_by":"gdiazlo"},{"issue_id":"hcs-lskj","depends_on_id":"hcs-1lvl","type":"parent-child","created_at":"2026-01-03T21:00:29.635048148+01:00","created_by":"gdiazlo"}]}
139139-{"id":"hcs-lsmn","title":"Docs: Update documentation for v0.2.0","description":"Update all documentation:\n\n1. README.md - update architecture section, add pipeline examples\n2. bin/las/README.md - update tutorial with new API\n3. Add CHANGELOG.md with breaking changes\n4. Add migration guide from 0.1.x to 0.2.0\n5. Document the three-layer plug model","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-03T21:12:16.403916721+01:00","created_by":"gdiazlo","updated_at":"2026-01-03T21:12:16.403916721+01:00","dependencies":[{"issue_id":"hcs-lsmn","depends_on_id":"hcs-1lvl","type":"parent-child","created_at":"2026-01-03T21:13:19.833264053+01:00","created_by":"gdiazlo"},{"issue_id":"hcs-lsmn","depends_on_id":"hcs-7neb","type":"blocks","created_at":"2026-01-03T21:14:30.606697175+01:00","created_by":"gdiazlo"}]}
139139+{"id":"hcs-lsmn","title":"Docs: Update documentation for v0.2.0","description":"Update all documentation:\n\n1. README.md - update architecture section, add pipeline examples\n2. bin/las/README.md - update tutorial with new API\n3. Add CHANGELOG.md with breaking changes\n4. Add migration guide from 0.1.x to 0.2.0\n5. Document the three-layer plug model","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-03T21:12:16.403916721+01:00","created_by":"gdiazlo","updated_at":"2026-01-12T23:45:00.661618987+01:00","closed_at":"2026-01-12T23:45:00.661618987+01:00","close_reason":"Updated README with SSE client modules; aligned las tutorial code examples with actual implementation","dependencies":[{"issue_id":"hcs-lsmn","depends_on_id":"hcs-1lvl","type":"parent-child","created_at":"2026-01-03T21:13:19.833264053+01:00","created_by":"gdiazlo"},{"issue_id":"hcs-lsmn","depends_on_id":"hcs-7neb","type":"blocks","created_at":"2026-01-03T21:14:30.606697175+01:00","created_by":"gdiazlo"}]}
140140{"id":"hcs-m4r","title":"Codec System","description":"Implement the functor-based CODEC signature and With_codec functor for type-safe serialization/deserialization. Use Cstruct.t (buffers) instead of strings to properly support binary formats like MessagePack, Protobuf, and CBOR.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-29T14:25:22.203715886+01:00","updated_at":"2025-12-29T17:40:46.982752973+01:00","closed_at":"2025-12-29T17:40:46.982752973+01:00","dependencies":[{"issue_id":"hcs-m4r","depends_on_id":"hcs-zba","type":"parent-child","created_at":"2025-12-29T14:26:00.496780385+01:00","created_by":"gdiazlo","metadata":"{}"}]}
141141{"id":"hcs-mip","title":"Implement Http request builder DSL","description":"Implement high-level client DSL in hcs-core/http.ml:\n\n```ocaml\ntype builder\n\nval get : string -\u003e (builder, error) result\nval post : string -\u003e (builder, error) result\nval put : string -\u003e (builder, error) result\nval delete : string -\u003e (builder, error) result\n(* ... other methods ... *)\n\nval of_uri : method_ -\u003e Uri.t -\u003e builder\n\n(* Headers *)\nval header : string -\u003e string -\u003e builder -\u003e builder\nval headers : (string * string) list -\u003e builder -\u003e builder\nval content_type : string -\u003e builder -\u003e builder\nval accept : string -\u003e builder -\u003e builder\nval bearer : string -\u003e builder -\u003e builder\nval basic_auth : user:string -\u003e pass:string -\u003e builder -\u003e builder\nval user_agent : string -\u003e builder -\u003e builder\n\n(* Query parameters *)\nval query : string -\u003e string -\u003e builder -\u003e builder\nval queries : (string * string) list -\u003e builder -\u003e builder\n\n(* Body *)\nval body : body -\u003e builder -\u003e builder\nval body_string : ?content_type:string -\u003e string -\u003e builder -\u003e builder\nval form : (string * string) list -\u003e builder -\u003e builder\n\n(* Build final request *)\nval build : builder -\u003e request\n```\n\nPure OCaml, no IO.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-29T14:34:22.698743046+01:00","updated_at":"2025-12-29T17:10:04.149286655+01:00","closed_at":"2025-12-29T17:10:04.149286655+01:00","dependencies":[{"issue_id":"hcs-mip","depends_on_id":"hcs-l23","type":"parent-child","created_at":"2025-12-29T14:34:49.5612417+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-mip","depends_on_id":"hcs-lpr","type":"blocks","created_at":"2025-12-29T14:34:56.47577088+01:00","created_by":"gdiazlo","metadata":"{}"}]}
142142{"id":"hcs-mjh","title":"Diagnose SSE respond_stream closes immediately; fix; add regression tests proving streaming works","status":"closed","priority":0,"issue_type":"bug","created_at":"2026-01-02T14:57:27.955502878+01:00","updated_at":"2026-01-03T11:14:59.327782781+01:00","closed_at":"2026-01-03T11:14:59.327782781+01:00"}
···189189{"id":"hcs-wkv","title":"Create WebSocket benchmark runner script","description":"Script like run_h2_comparison.sh. Start servers, run tests at 1k/10k/50k/100k connections, measure memory via /proc/[pid]/status VmRSS, report results.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T10:00:03.612055281+01:00","updated_at":"2025-12-30T10:14:42.952379356+01:00","closed_at":"2025-12-30T10:14:42.952379356+01:00","dependencies":[{"issue_id":"hcs-wkv","depends_on_id":"hcs-jk8","type":"parent-child","created_at":"2025-12-30T10:00:45.722495633+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-wkv","depends_on_id":"hcs-w1c","type":"blocks","created_at":"2025-12-30T10:00:55.80122372+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-wkv","depends_on_id":"hcs-1h7","type":"blocks","created_at":"2025-12-30T10:01:00.843226486+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-wkv","depends_on_id":"hcs-6ki","type":"blocks","created_at":"2025-12-30T10:01:05.885715216+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-wkv","depends_on_id":"hcs-6hx","type":"blocks","created_at":"2025-12-30T10:01:10.922318474+01:00","created_by":"gdiazlo","metadata":"{}"}]}
190190{"id":"hcs-x1l","title":"Create benchmark runner script for standardized testing","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T22:21:46.718118939+01:00","updated_at":"2025-12-30T22:33:10.362379965+01:00","closed_at":"2025-12-30T22:33:10.362379965+01:00"}
191191{"id":"hcs-xg9n","title":"Fix docs/plugs/reference.md - create or remove broken link","status":"closed","priority":2,"issue_type":"chore","created_at":"2026-01-03T14:29:32.650292605+01:00","updated_at":"2026-01-03T14:31:22.800247446+01:00","closed_at":"2026-01-03T14:31:22.800247446+01:00"}
192192-{"id":"hcs-xht","title":"HCS Documentation","description":"Comprehensive documentation for HCS library similar to Phoenix docs style. Concise, no claims, working code snippets, organized under docs/ folder.","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-03T00:43:27.786989188+01:00","updated_at":"2026-01-03T00:43:27.786989188+01:00"}
192192+{"id":"hcs-xht","title":"HCS Documentation","description":"Comprehensive documentation for HCS library similar to Phoenix docs style. Concise, no claims, working code snippets, organized under docs/ folder.","status":"closed","priority":2,"issue_type":"epic","created_at":"2026-01-03T00:43:27.786989188+01:00","updated_at":"2026-01-12T23:55:53.365176264+01:00","closed_at":"2026-01-12T23:55:53.365176264+01:00","close_reason":"Documentation complete: 27 docs covering getting-started, guides, client, real-time, plugs, and recipes"}
193193{"id":"hcs-xw7","title":"SSE: respond_*_stream should not swallow all exceptions","description":"In lib/sse.ml respond_with_stream/respond_raw_stream treat any exception from Eio.Stream.take as end-of-stream (with _ -\u003e None). This can cause SSE connections to terminate immediately and hides real errors (cancellation, logic bugs). Narrow exception handling to End_of_file or propagate/log unexpected exceptions.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-02T14:05:48.68753041+01:00","updated_at":"2026-01-02T14:06:23.99837942+01:00","closed_at":"2026-01-02T14:06:23.99837942+01:00"}
194194{"id":"hcs-y4ra","title":"Test: Verify all tests pass after refactor","description":"Run full test suite:\n- dune build\n- dune test\n- Manual test of las application\n- Verify hs (file server) still works (doesn't use Endpoint)","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-03T20:59:48.153343384+01:00","created_by":"gdiazlo","updated_at":"2026-01-03T21:11:28.352189828+01:00","closed_at":"2026-01-03T21:11:28.352189828+01:00","close_reason":"Superseded by expanded scope - adding router pipelines","dependencies":[{"issue_id":"hcs-y4ra","depends_on_id":"hcs-j7fj","type":"blocks","created_at":"2026-01-03T21:00:38.071975277+01:00","created_by":"gdiazlo"},{"issue_id":"hcs-y4ra","depends_on_id":"hcs-1lvl","type":"parent-child","created_at":"2026-01-03T21:00:39.745458479+01:00","created_by":"gdiazlo"},{"issue_id":"hcs-y4ra","depends_on_id":"hcs-lskj","type":"blocks","created_at":"2026-01-03T21:00:43.127315881+01:00","created_by":"gdiazlo"}]}
195195{"id":"hcs-y5a","title":"LAS: Data models (models.ml)","description":"Define types for user, link, vote, comment. Include JSON serialization helpers.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-01T23:41:27.179866273+01:00","updated_at":"2026-01-01T23:50:41.86681997+01:00","closed_at":"2026-01-01T23:50:41.86681997+01:00","dependencies":[{"issue_id":"hcs-y5a","depends_on_id":"hcs-62k","type":"parent-child","created_at":"2026-01-01T23:42:23.256823169+01:00","created_by":"gdiazlo","metadata":"{}"},{"issue_id":"hcs-y5a","depends_on_id":"hcs-dpu","type":"blocks","created_at":"2026-01-01T23:43:03.557959162+01:00","created_by":"gdiazlo","metadata":"{}"}]}