Files
mars-nwe/AI.md
Mario Fetka 4e07acd6c8
All checks were successful
Source release / source-package (push) Successful in 1m43s
0453 docs: record patch-only export and author rules
2026-06-13 07:56:25 +02:00

280 lines
14 KiB
Markdown

# AI working notes for mars-nwe
This file is the handoff and assistant-rule document. It should keep the next
chat on the current track without forcing it to reconstruct old patch history.
Keep it short enough to read before touching code.
## Start of a new chat
1. Treat `mars-nwe-master` as the root/superproject. The other `mars-*` bundles
are submodules or sibling component sources needed by the root build.
2. Read the root `*.md` files and `doc/*.md` before changing namespace, salvage,
transport or dependency code. The most important active files are
`TODO.md`, `REDESIGN.md`, `ENDPOINTS.md`, this file, and:
- `doc/NSS_NAMESPACE_AUDIT.md`
- `doc/NSS_PUBLIC_CORE_AUDIT.md`
- `doc/NWFS_SALVAGE_COMPRESSION_TOOLS.md`
- `doc/HANDOFF_AUDIT.md`
3. Do not assume an older bundle is current. Use the latest applied user state
or the latest bundle/patch explicitly accepted by the user.
4. For a fresh build in a new chat, check whether `prepare-local-deps.sh` is
present in the root and run/use it before trying to build; it stages the
uploaded offline third-party tarballs and local-only headers needed by the
current dependency layout.
5. Default language with the user is German; repository documentation remains
English unless the existing file is German.
## Documentation ownership
- `TODO.md` is the active backlog. The top implementation dashboard is allowed
and should stay. Unfinished long-running tracks stay in `TODO.md` until real
implementation/test work closes them.
- `REDESIGN.md` is the durable architecture/design record. Put stable plans,
rationale and completed design decisions there, not patch chronology.
- `AI.md` is for working rules, current handoff state, rejected patches and next
action guidance. Keep it concise; do not append duplicate historic handoff
dumps forever.
- `ENDPOINTS.md` is the decimal/hex NCP audit table.
- `doc/*.md` files are focused topic audits/roadmaps. Keep namespace, NSS
public-core and salvage/compression/tool details in their matching doc files.
When a TODO is finished, remove it from `TODO.md` in the same patch and record
its stable outcome in `REDESIGN.md` or the focused `doc/*.md` file. Do not move
unfinished work out of `TODO.md` merely because its architecture is documented.
## Current accepted patch line
Latest patch marker expected in an up-to-date bundle:
- `0453 docs: record patch-only export and author rules`
When a later chat receives a new `mars-nwe-master` bundle, compare `git log -1`
with this marker. If the uploaded bundle already contains this commit subject,
the last patch was applied. If the bundle is older and the old chat download no
longer works, recreate the missing patch instead of assuming it was applied.
The active line is expected to include:
- Quota work through the corrected Linuxquota/NWQUOTA split and DOS/live smokes.
- NSS low-level imports through the Unicode/codepage, UTC, GUID/ID, xCtype and
xString helper line.
- `0434 build: record offline dependency bootstrap layout`.
- `0435 docs: record transport config and nwfs watch plan`.
- `0436 docs: keep unfinished NSS and salvage work in TODO`.
## Current patch handoff block
Last generated patch:
- `0453 docs: record patch-only export and author rules`
Purpose of that patch:
- Record that future repository changes should export only the `git am` patch
file by default, not a bundle, and that generated patch mail headers must use
`Mario Fetka <mario.fetka@disconnected-by-peer.at>` as author identity.
Keep this block replaceable: every later patch must overwrite it with the
next commit subject and short patch purpose instead of appending history.
Rejected or superseded patches that must not be reused as-is:
- `0380`
- `0398`
- `0403`
## Current immediate direction
Before starting namespace implementation, keep the documentation boundaries
clean:
- `TODO.md`: active work only, dashboard retained.
- `REDESIGN.md`: architecture and design separation clarified.
- `AI.md`: concise current state and rules only.
Before namespace code changes, keep the legacy logging audit in mind: old MARS
accepts numeric debug thresholds from `0` to `99`, but the actual source mostly
uses `1..5`. The future `nwlog` facade should give those normal levels clear
semantic names instead of preserving the old overloaded buckets: `1=error`,
`2=warn`, `3=info`, `4=debug` and `5=trace`. `debug` is local diagnostic detail; `trace` is packet/message/handoff path following across process or provider boundaries. New config should expose the cumulative numeric masks `0`, `1`, `12`, `123`, `1234` and `12345` as synonyms for `off`, `error`, `warn`, `info`, `debug` and `trace`, and use one global `[logging] level` plus optional `[logging.process.<name>] level` overrides; the old numeric `100..106` process entries stay accepted for compatibility. Useful legacy `6..99` traces should
map to `nwlog_detail()` later. `nwlog_detail()` is not part of the normal
`1..5` threshold ladder: normal builds return `0`, while `MAINTAINER_BUILD`
builds may emit detail whenever such a call site is reached. No INI option may
enable it in a normal build.
`nwlog`/zlog remains a facade/backend plan, not a reason to call zlog directly.
See `include/nwlog.h` and `doc/LOG_LEVEL_AUDIT.md`.
Before namespace code changes, use the handoff audit rules in `doc/HANDOFF_AUDIT.md`.
New namespace/NWFS work must not add new magic `return(-1)` / `return(-2)` paths.
Use the provider names in `include/ncp_endpoint.h` for audits and future endpoint
tables, but do not wire the enum into runtime dispatch until the current
`nwconn` to `nwbind` handoff sites are annotated.
Then begin the namespace track:
1. Start with DOS namespace compatibility for NetWare 1.x/2.x/3.x clients.
2. Use the NSS namespace sources as the replacement/adaptation target, not a
permanent wrapper over old MARS `namedos`/`nameos2` code.
3. Keep `src/namspace.c` as NCP glue over the future namespace engine.
4. Move reusable filesystem/namespace/metadata helpers toward `libnwfs`.
5. Defer broad 4.x/NDS/OES runtime behaviour unless it is guarded or required
by a concrete compatibility path.
## NCP notation rule
Always write NCP groups/selectors with both decimal and wire/code hex when
recording protocol details. Examples:
- decimal 87 == wire/code `0x57`
- decimal 90/12 == wire/code `0x5a/0x0c`
- decimal 123/70 == wire/code `0x7b/0x46`
Use `ENDPOINTS.md`, the NDK Core Protocols PDF, WebSDK docs and SDK includes as
references. NetWare 3.x/default compatibility has priority over broad 4.x/NDS
work.
## Patch workflow
- Make small, reviewable patches with one clear subject.
- Inspect current sources before editing; no speculative patching.
- Run at least `git diff --check` before exporting a patch.
- Also run syntax/build/test checks that match the touched files when feasible.
- Export only the `.patch` file by default when producing repository changes.
Do not create or link a bundle unless the user explicitly asks for one.
- Every repository patch must update this `AI.md` with the new final commit
subject in the current patch marker before exporting the patch. If the user
later uploads a bundle from their repository, the marker makes that bundle
self-identifying even when old chat downloads have expired or are unavailable.
- Every repository patch must also replace the single `Current patch handoff
block` in this file with a short description of what the patch was meant to
do. Replace the old block; do not append a new one for every patch.
- Always include a copy/paste `git am <patch-name>.patch` command in the user
response next to the patch download link. This is part of the handoff
contract, not an optional nicety.
- Generate patch mail headers with `Mario Fetka <mario.fetka@disconnected-by-peer.at>`
as the author identity, not an AI/OpenAI identity.
- Do not claim a build/test passed unless it actually ran in the current work
tree.
## Source/layout rules
- Keep active NSS low-level helper imports directly under normal MARS paths such
as `src/core/<original>.c` and `include/core/<original>.h`; do not create or
keep a permanent `src/core/nss/` wrapper/reference area for helpers already
imported into normal core files.
- Preserve original NSS API names where that improves compatibility with later
imported code.
- GPL-2.0-only source imports are allowed when the imported source permits GPLv2
use and the original provenance/license headers are preserved. For Linux
kernel reference material, record that mars-nwe selects GPL-2.0-only.
- Clean NSS staging incrementally: once an NSS file has been imported, adapted or
stubbed in a normal MARS path, remove the duplicate staging/reference copy
unless an audit document names a still-open reason to keep it. Do not delete
active `src/nwfs/nss/` namespace/common/compression reference material before
the matching libnwfs adaptation is complete.
- Do not import whole NSS/OES runtime subsystems just to satisfy helper
dependencies. Replace kernel, VFS, memory-tracking and platform hooks with
small userland glue when a helper is otherwise useful.
- `libnwcore` is for base helpers: Unicode/codepages, CRC/hash/bitmap, GUID/ID,
UTC/time, allocation/string compatibility and similar low-level pieces.
- `libnwfs` is for namespace, file IDs, metadata, streams, EA, salvage,
compression, host-side reconcile and `_ADMIN` virtual-volume filesystem work.
- `libnwbind` is for bindery identity/storage; `libnwnds` is for later
eDirectory/NDS work.
## Namespace rules
- Do not expand old MARS `namedos`/`nameos2` as the long-term solution. They are
replacement targets.
- Import/adapt the NSS namespace engine directly, then retire old MARS namespace
logic after tests cover DOS/LONG behaviour.
- Stable namespace state belongs in `netware.metadata`: file ID, parent file ID,
DOS name, LONG/OS2 name, MAC name, UNIX/backend name, casefold/hash fields and
namespace flags.
- Existing Linux files created by Samba, rsync or local admin tools must be
reconciled by libnwfs watcher/scanner work, not by a private side database.
- MAC namespace is a namespace/stream/metadata problem, not a transport problem.
Resource forks and Finder info belong in streams/metadata later.
## Salvage/recycle rules
- Keep `.recycle` as the Samba-compatible deleted-payload backend.
- Make `netware.metadata` on the recycled payload authoritative for deleted
state.
- Treat `.salvage` JSON as legacy migration/debug data only; do not make it a
second long-term authority.
- Samba `vfs_recycle` normally uses rename, so xattrs remain attached to the
recycled inode. Manually copied files in `.recycle` without
`netware.metadata` are not valid NetWare salvage objects unless an explicit
admin repair tool marks them.
- If a compressed file is recycled, the `.recycle` payload should be a normal
uncompressed Linux file; keep previous compression state in `netware.metadata`.
## Compression and stream rules
- Compression belongs in `libnwfs`, not `libnwcore`.
- Future private stream/compression data belongs under
`.nwfs_streams/<stable-file-id>/...`.
- The stable file ID comes from MARS/NWFS/NSS-shaped metadata, not from Linux
inode numbers and not from visible filenames.
- Do not encode compression state in visible names such as `compressed_*`.
## Transport rules
- TCP/IP is a transport split under `nwconn`/`nwserv`, not a new daemon.
- Planned files: `src/nwtransport.c`, `src/nwipx.c`, later `src/nwtcp.c`.
- NCP providers stay transport-neutral:
`IPX/TCP -> nwtransport -> nwconn -> dispatcher -> providers`.
- Use audited libowfat API names from the bundled `mars-libowfat` source:
`socket_tcp4()`, `socket_tcp6()`, `socket_bind4_reuse()`,
`socket_bind6_reuse()`, `socket_listen()`, nonblocking accept helpers and
`io_*` readiness helpers.
- IPX config sections use frame tokens without dots:
`8022`, `8023`, `etherii`, `snap`, `tr8022`, `auto`.
- `[transport.ipx.local]` is the internal network; explicit routes use
`[transport.ipx.route.<target>]`.
- If IPX is requested but `socket(AF_IPX, ...)` fails, report that AF_IPX is
unavailable instead of silently falling back.
- A future L2 IPX backend is allowed, but it is an additional backend below
`nwtransport`, not a replacement for the kernel path. Start with Ethernet_II
IPX, SAP/RIP, and NCP socket `0x0451`.
- Do not vendor a capability library for L2 IPX. Open the packet socket and
report missing `CAP_NET_RAW`/`CAP_NET_ADMIN`; root, setcap, or systemd
capabilities are deployment policy.
- Do not copy GPL-3.0-or-later code from the Rust `nwserver` reference. Use only
the observed architecture: userland Ethernet/IPX packet handling, SAP/RIP, and
NCP socket dispatch.
- SPX, if needed, is a later userland layer above IPX. Do not rely on kernel
SPX and do not make namespace work wait for SPX.
- Linux 2.4.37.9 SPX is imported only as reference material in
`src/kernel/af_spx.c` and `include/kernel/spx.h`; do not build it as-is.
## Dependency/source bundle rules
- `mars-nwe-master` is the root repository.
- Uploaded `mars-*` bundles are submodules/sibling components needed in the
configured locations.
- Offline point-release tarballs are staged by `prepare-local-deps.sh`. In a
new chat or clean checkout, use this script as the first dependency/bootstrap
step before CMake/build attempts:
- `yyjson-0.12.0` into `third_party/yyjson`
- `zlog-1.2.18` into `third_party/zlog`
- `libsodium-1.0.20` into the nested libsodium snapshot path
- `gdbm-1.26` built locally under `.local-deps/prefix`
- PAM and ncurses headers staged while linking to system libraries
- Do not vendor random system headers directly into endpoint/provider code.
## New reference inputs available for the next namespace work
The user supplied fresh reference archives for the next phase:
- `nss-common.tar.bz2`
- `nss.tar.bz2`
- `ncp__enu.pdf`
- `websdk.tar.gz`
- `include.tar.gz`
Use these for source audits and exact NCP structure/selector verification before
implementing namespace changes.