/ META.scm
META.scm
 1  ;; SPDX-License-Identifier: AGPL-3.0-or-later
 2  ;; SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell
 3  ;;; META.scm — beamdeno
 4  
 5  (define-module (beamdeno meta)
 6    #:export (architecture-decisions development-practices design-rationale))
 7  
 8  (define architecture-decisions
 9    '((adr-001
10       (title . "Port-First, Distribution Later")
11       (status . "accepted")
12       (date . "2025-12-31")
13       (context . "Erlang distribution protocol is complex, ports are simpler")
14       (decision . "Start with Erlang ports, add distribution protocol in v0.3")
15       (consequences . ("Faster initial release" "Requires running erl" "Distribution for advanced users")))
16  
17      (adr-002
18       (title . "ETF as Wire Format")
19       (status . "accepted")
20       (date . "2025-12-31")
21       (context . "Need to serialize data between Deno and BEAM")
22       (decision . "Use Erlang Term Format (ETF) for native BEAM compatibility")
23       (consequences . ("Native BEAM types" "Binary efficiency" "Need encoder/decoder")))
24  
25      (adr-003
26       (title . "Actor Model Mapping")
27       (status . "accepted")
28       (date . "2025-12-31")
29       (context . "BEAM uses actors/processes, JS uses callbacks/promises")
30       (decision . "Map BEAM messages to JS event emitters and async iterators")
31       (consequences . ("Familiar JS patterns" "Natural async integration" "Some semantic mismatch")))))
32  
33  (define development-practices
34    '((code-style
35       (languages . ("TypeScript" "Erlang"))
36       (formatter . "deno fmt")
37       (linter . "deno lint"))
38      (security
39       (sast . "CodeQL")
40       (credentials . "Erlang cookies handled securely"))
41      (testing
42       (framework . "Deno.test")
43       (integration . "Requires running BEAM node")
44       (coverage-minimum . 70))
45      (versioning
46       (scheme . "SemVer 2.0.0"))))
47  
48  (define design-rationale
49    '((why-etf
50       "ETF is BEAM's native format. JSON would require conversion on both sides.")
51      (why-ports
52       "Ports are well-documented, stable, and don't require distribution cookies.")
53      (why-not-nif
54       "NIFs require Erlang toolchain. Ports work with just the erl binary.")))