Skip to content

api(feat[haskell]) Add native Haddock integration - #265

Merged
tony merged 34 commits into
mainfrom
haskell-port
Nov 9, 2026
Merged

tony merged 34 commits into
mainfrom
haskell-port

Conversation

@tony

@tony tony commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Native Haskell documentation

Add a native Haddock exporter and shared-model adapter for the public Haskell API. Preserve linked signatures, opaque data heads, constructor and record-label ownership, instance heads, authored links and export groups. Sidebar regeneration uses the stored groups without a checkout or native toolchain.

The exporter builds a selected committed source archive with GHC 9.14.1, Haddock 2.33.0 and Cabal 3.18.2.0. Library and producer revisions are recorded separately. Frozen native output qualifies LibTmux.Id, LibTmux.Value and LibTmux.Version, including NoFieldSelectors records. Unsupported declaration forms, missing links, inconsistent ownership and incomplete export groups fail explicitly.

Register Haskell with source-only Cabal installation, numeric version ordering, generated API/navigation, package metadata and canonical branding. Distinguish Hackage absence from registry errors. The core landing page describes the three public scalar modules; workspace is planned and MCP is excluded. Source, producer, model and path identities are checked during generation.

HTML and Markdown use native linked Haskell declaration tokens. Data constructors stay separate from dispatch methods, signatureless modules retain their names and instance heads retain their owner and source links. The shared signature demo covers curried Haskell functions.

Derive command usage from the selected Haskell source with a pinned WASM grammar and a bounded lexical reader. Preserve exact binding identities and call-site evidence; reject unqualified command flow, ambiguous argv, custom sequencing and unresolved public attribution. The generated document correctly contains no public sends for this scalar-only API. Command tables and concept explanations show that absence. The grammar is a docs-tooling dependency; the Haskell core dependency set is unchanged. New modules or IO require requalification.

Native kind/glossary labels distinguish Haskell data types, constructors and non-selector record labels across navigation, search and previews. The core landing page lists the actual public modules rather than inventing a Server graph. Its complete Cabal example executes the public values API, identifies the installed library separately from its example source, and uses a verification profile that refuses tmux dispatch. The page presents one visible program without irrelevant lifecycle controls.

The publisher preparation registers the Haskell prefix and master caller, validates exact source toolchain pins, provisions documentation dependencies and exports Haddock using the committed docs producer and selected library SHA. The stored model and usage citations describe the selected committed public API; later private Runtime work leaves those declarations unchanged.

Stage source-owned getting-started, installation, typed-values, API-documentation and status guides at the native API revision. Shared navigation offers the available Guides section and public reference. Module-file links reach shared API pages; source fragments retain pinned GitHub links. CI checks out that same revision to verify the guide cache. The selected-port release notice uses existing registry metadata and identifies Haskell as unreleased. Standard types link to the selected base package documentation, and tracked Haskell/Cabal files link to their pinned source. The missing-symbol diagnostic remains active; the build ceiling is unchanged.

This remains a draft. A manual caller is on Haskell master, with publication off by default and no automatic triggers. The source-bound selected-port build and publisher inventory verification pass locally. Exact-head full hosted validation and deployment infrastructure remain unqualified; publication remains pending. The native Runtime/core/workspace implementation remains a separate active goal. Raw Haddock derived-instance fragments and final native-caller pin synchronization still require qualification.

Verification

Current hosted CI is running at c298d9294. Full assembled-site validation and publication remain unqualified.

  • 1,390 API-model tests pass, with one pre-existing skip. The targeted site/component checks pass 138 tests; 139 assembled-tree checks are skipped locally because this clean worktree has no assembled site.
  • Workspace types pass with a 4 GiB Node heap inside the existing 8 GiB resource limit: zero errors, zero warnings and 32 hints in 78.38 seconds including setup. The default 2 GiB heap exhausted memory; that failed receipt is retained. Lint and Ruff pass, with existing lint warnings.
  • The real reference-page regression first displayed a Haskell constructor as function. Forwarding the language to the extracted member list restores data constructor. Independent review passes the correction and excluded/unpublished picker cases.
  • Rebased onto shared main 9a01505fc. Product-link code now comes from the shared exclusion fix; this PR retains its Haskell regression test.

The previous complete run failed fourteen counterpart counts and one five-second transcript-test timeout. The shared navigation correction addresses the counts; all 41 transcript checks pass locally in 3.23 seconds including startup, but the hosted timeout has not yet been requalified. No test deadline was raised.

The current public library provides IDs, checked values and version admission. Complete capture, query and mutation examples depend on the native public API and remain later work.

@tony tony changed the title api(feat[haskell]) Export native Haddock declarations api(feat[haskell]) Adapt native Haddock documentation Nov 7, 2026
@tony tony changed the title api(feat[haskell]) Adapt native Haddock documentation api(feat[haskell]) Add native Haddock integration Nov 8, 2026
tony added 24 commits November 8, 2026 17:19
…ifacts

why: Preserve Haskell signatures, opaque types and authored links with separate library and exporter provenance.

what:
- Build selected library commits with the pinned GHC, Cabal and Haddock tools
- Export public declarations, instance heads, documentation and source anchors
- Reject incomplete interfaces, unsupported layouts and invalid public links
- Register native fixtures and Python checks in the shared tooling
why: Public type links and declaration roles must survive the native documentation boundary.

what:
- Retain ordered header spans with native destinations and public identities
- Check normalized span text against each complete declaration
- Mark native data constructors with the existing signature role
- Reject private, missing and unsafe header destinations
why: The native exporter has a command entry point and a shebang; its
tracked file mode must allow execution and satisfy the Python lint gate.

what:
- Record the executable mode for the Haddock exporter
why: Native Haskell declarations need shared-model identities, source
links and authored navigation without inferred signature semantics.

what:
- Validate the qualified public Haddock profile and source provenance
- Preserve linked headers, opaque types and constructor ownership
- Keep instance heads with their owning types and exact source links
- Regenerate complete navigation from native export-group metadata
- Parse normalized references while preserving literal Haskell code
why: Haskell source documentation needs its own package identity, numeric
Cabal versions and truthful availability in the shared site.

what:
- Register the source-only core, planned workspace and MCP exclusion
- Generate source-bound API, navigation, manifest and version records
- Validate Cabal versions and distinguish Hackage absence from errors
- Add canonical Haskell artwork and the core landing page
why: Generic callable rendering loses linked Haskell types and treats
data constructors as dispatch methods.

what:
- Retain Haddock header tokens and links in HTML and Markdown
- Preserve named modules, data constructors and record labels
- Render instance documentation through ordinary Markdown headings
- Exercise curried signatures in the shared rendering checks
why: The new Haskell landing page names public modules, so its backlinks
must be present for publication freshness checks to pass.

what:
- Generate the three Haskell module backlinks from current content
- Retain existing mentions and unresolved-reference records
why: Command pages must not invent sends for a public API limited to scalar values.
what:
- Add the pinned WASM grammar and a bounded lexical action reader
- Reject unqualified flows and preserve exact helper identities and evidence
- Generate revision-bound usage data and show truthful language absence
why: Scalar identifiers do not implement the cross-port object graph or workspace.
what:
- Explain absent Haskell concepts using the current public scope
- Keep member-order coverage aligned with the scalar-only reference
why: Publication checks require live identity evidence for registered port links.
what:
- Record the verified GitHub source and repository and absent Hackage page
- Add Haskell header expectations for the source-only package
- Keep boundary controls independent of per-record refresh dates
why: Haskell data types, constructors and record labels need their own
meaning in the shared reference. Documentation ownership does not
qualify their source names.

what:
- Project native kinds across pages, navigation, exports and previews
- Keep readable labels, marks and palette aliases consistent in caches
- Preserve module ownership while avoiding duplicate export rows
- Verify native glossary references through the destination pipeline
- Cover native names, written forms, selection and restored navigation
why: The prose audit must distinguish native declaration tokens and graph identities from authored documentation.

what:
- Classify exact native span text, href and target fields as structure
- Classify explicit reference edge kinds and target identities
- Retain failure for unrecognized fields
why: A module-based value API cannot claim the server and pane operations
of the object-graph ports.

what:
- Resolve module entries against public core declarations and summaries
- Preserve strict graph role and capability validation for other ports
- Share module facts across HTML, Markdown, headings and port metadata
- Render source-pinned Cabal setup with its availability note
why: Copied test runtimes must include the same imports and readable kind labels as the production components.

what:
- Include version parsing in isolated protocol source fixtures
- Resolve the native kind helper in standalone Astro compilations
- Check readable glossary labels and native declaration kind metadata
- Read multiword kinds in Markdown member-order assertions
why: Haskell readers need a runnable example of the public package without
claiming graph navigation or tmux operations that are not exposed yet.
what:
- Display the committed Cabal project and distinguish example and library refs
- Verify pure examples with an explicit profile that rejects tmux dispatch
- Render a visible single program without unused lifecycle controls or API lists
why: Registered ports must appear in the language picker and render native
examples with the bundled syntax grammar.
what:
- Include Haskell in the compiled and native family
- Enable Haskell in the shared highlighter and Expressive Code allowlist
why: The core page now obtains its module list from structured data rather
than repeating those links in authored prose.
what:
- Regenerate the prose mention index after the module-home change
why: Cross-port assertions must cover Haskell's implemented scalar surface
without requiring an absent Server or companion package.
what:
- Record core-only products, explicit snapshot absence and source-only links
- Resolve a public PaneId declaration in selected-version prose checks
why: Generic setup and automation prompts requested operations that the
Haskell package does not yet expose.
what:
- Set up and execute the public values example without a tmux requirement
- Report unavailable automation APIs before composing task instructions
- Preserve source-ref checks across prose line wrapping
why: Haskell needs the same selected-source and prefix ownership contracts
as the other independently published documentation trees.
what:
- Register the master caller and Haskell publication prefix
- Read exact source toolchain pins before provisioning native dependencies
- Export Haddock with the committed docs producer and selected library SHA
- Check pin rejection, quoted argument boundaries and exporter failure propagation
why: Reference and command-usage citations must identify the same verified
source as the current native trunk and example source.
what:
- Regenerate native model, file inventory and usage at the selected source
- Retain the unchanged public declaration content and export groups
why: Hosted lint checks executable permissions for scripts with a shebang.
what:
- Record the Haskell toolchain reader as executable in Git
why: Haskell readers need installation and scalar API guides that match
the documented source without links to unimplemented runtime sections.

what:
- Stage committed guides at the native API revision and retain source anchors
- Derive available navigation sections and landing links from the port profile
- Check out the selected Haskell source for CI guide freshness
why: The shared release banner contradicts the Haskell package's
unpublished and untagged state.

what:
- Derive the selected port's notice from existing release metadata
- Preserve tagged-port, global and dismissal behavior
- Exercise the real notice with unreleased and tagged package states
tony added 9 commits November 8, 2026 17:19
why: Homepage browser checks assume every port offers operational tasks
and four selectable example variants. The public Haskell API is scalar.

what:
- Require one full program and no toggles for single-view examples
- Preserve program, file and clipboard checks for every supported view
- Check unavailable task guidance during language previews
- Remove stale port counts from browser summaries
why: Reader guides name standard Haskell types and Cabal files that must
resolve outside the port API rather than count as missing declarations.

what:
- Link standard types to the selected base package documentation
- Resolve tracked Haskell source and Cabal project files
- Refresh mention diagnostics while preserving missing-symbol reporting
why: Bare product routes bypassed availability checks and linked to pages
that excluded ports do not build.

what:
- Apply product availability to bare and trailing-slash landing routes
- Retain language-home exits for unavailable products
- Render the real picker in the cross-port availability regression
…y shipped

why: Haskell has a module-first public API, an excluded MCP product and a
planned workspace package. Shared export metadata and assembled checks must
preserve those differences without linking to nonexistent pages.

what:
- Keep excluded product status and omit its unavailable document URLs
- Add an availability overview for the planned workspace package
- Check native module exports and the sections Haskell currently provides
- Distinguish unpublished overviews from products with no pages
why: Native reference groups and companion availability vary by port.
Shared assertions must preserve those differences without language branches.
what:
- Select core navigation checks from configured documentation sections
- Compare every exported reference section and declaration with its model
- Check declared product availability in root and selected-port manifests
why: Extracting member rendering into the shared component dropped the page's
language and displayed Haskell data constructors as ordinary functions.
what:
- Pass the declaration language to the extracted member list
- Reuse native kind labels in its compact and expanded badges
- Exercise constructor labels through the real reference page and child
why: An unpublished product has an overview while an excluded product has
no page. Picker assertions must preserve both cases after the shared fix.
what:
- Derive overview expectations from exclusion and parent-library metadata
- Check the excluded Haskell MCP and planned workspace destinations
- Keep language-home shortcuts at bare product roots
why: Public command attribution must include imported implementation paths
without treating unrelated hidden modules as exported operations.

what:
- Trace local imports from public Haskell source roots.
- Index both Cabal source roots before resolving reachable modules.
- Reject ambiguous, conditional and unqualified package dependency paths.
- Cover transitive imports and custom Prelude boundaries.
why: Haskell pages and executable examples need one verified library input,
and publication checks need explicit resolution baselines for the new port.

what:
- Refresh reference, guide and source-usage data from the merged native
  capture foundation while retaining the current public scalar interface.
- Align homepage files, install pins, variant proofs and expected output.
- Record Haskell's measured cross-reference floor and type-link ceiling
  without changing another port's baseline.
- Document both baseline requirements in the port integration checklist.
why: Updating the documented Haskell input leaves a fixed source URL in
the cross-reference regression test pointing at an older commit.

what:
- Derive expected source URLs from the imported API model revision.
- Preserve exact file destinations and unknown-symbol checks.
@tony
tony merged commit 343c3bb into main Nov 9, 2026
3 checks passed
tony added a commit that referenced this pull request Nov 9, 2026
…ts (#291)

why: Six ports had docs branches ready but no published site, and
three shared fixes were waiting behind them. Releasing them together
gives one docs commit to trust for deployment and one set of caller
pins to move, instead of six separate waves.

what:
- Add OCaml (#264), Haskell (#265), Erlang (#266, #278, #279, #280,
  #284, #292), Common Lisp (#268), Perl (#274) and Clojure (#276):
  native API pages, tested guides, navigation, landing and switcher
  entries, and cross-reference data for each
- Keep browser checks from loading third-party resources, and pass
  the check origin to the three scripts that named an undefined base
  (#287)
- Render guide badges at build time instead of hotlinking shields
  (#288)
- Size the reference sidebar and member bars from the viewport, so
  the Chrome iOS keyboard no longer shrinks them (#290)
- Make the OCaml model producer verify its native build inputs in
  their checkout and reject stale ones, with controls run in CI
- Offer one switcher page per port, and title Perl's workspace guide
  "Workspace guide"
- Regenerate the registry, mention index and cross-reference counts
  for the combined port set

Base main 2593131, head dabe59b. Port heads: #264 7d4f88f
and 73fb1ad, #265 dc024e3, #268 947da1f, #274 818fa2e,
#276 a134503, #287 a437e97, #292 e7740d9.
@tony
tony temporarily deployed to docs-preview-cleanup November 9, 2026 13:38 — with GitHub Actions Inactive

This branch was previously deployed

2 inactive deployments
docs-preview-cleanup — dc024e3b Deployed Nov 9, 2026 by tony via cleanup #228
docs-preview — dc024e3b Deployed Nov 9, 2026 by tony via publish-preview / publish #1339
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant