Commit Graph

7025 Commits

Author SHA1 Message Date
903f14ba1d devdocs - CLAUDE.md: check Sockeye for low-level server fixes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 10:37:33 -07:00
3968302f75 case 4690 - Deferred: browser without a time zone name falls back to New York
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 07:54:20 -07:00
557cca3472 case 4690 - record: final build, staging, devtest, tags
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 18:28:36 -07:00
05cf4df632 case 4690 - manual revision date 2026-10-26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8.3.0
2026-10-26 17:46:24 -07:00
15094275af case 4690 - changelog for 8.3.0 finalised; two-factor wording on the password page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 17:46:19 -07:00
d37688494a case 4690 - record: final gate, release candidate build, Cypress 27/27, performance figures
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 17:16:57 -07:00
c19a3b047f case 4690 - Deferred: shutdown ObjectDisposedException is pre-existing, cause and fix recorded
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:46:00 -07:00
1dd6783aff case 4690 - release procedure: release test droplets are temporary
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:42:33 -07:00
be29f49ec1 case 4690 - release procedure: one documented sequence from code-complete to announcement
devdocs/build/RELEASE-PROCEDURE.md replaces John's notes from several info
cases: release order with subscription droplets upgraded before the
announcement, git tagging, scp uploads, the download-back check, upgrade
commands with curl -f, the one-time 8.3.0 droplet steps (harden-830.sh), the
weekly OS update and the full version bump list. BUILD.md's partial version
table now points to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:27:48 -07:00
c6c9e6c5d3 case 4727 - docs: Linux server permissions, service security settings, 127.0.0.1 behind NGINX
Install: program files read only for the service account, config.json 640,
systemd security settings in the service file, and a final step binding
AyaNova to 127.0.0.1 once NGINX works. Upgrade: the pre-8.3.0 step sets the
same permissions instead of re-adding group write on the program folder,
offers the security settings as a drop-in, and the upgrade commands use
curl -fO so a failed download stops before the program files are deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:14:05 -07:00
ad5da2ffa5 case 4727 - record: F36 and F38 fixed for hosted, case done
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:00:02 -07:00
b9035b93b0 case 4727 - record: F10 moved to case 4736
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:43:35 -07:00
72a64159c4 case 4735 - record marked done
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:50 -07:00
bf1e447eee Docs cases 4699, 4700, 4633, 4661, 4636, 4634, 4623 - record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:31 -07:00
2bcd51c21d case 4636 - docs: v7 migration with two-factor authentication or a default SuperUser password
Turn two-factor authentication off on the AyaNova 8 SuperUser for the
migration (the V8 Migrate plugin can not log in with it). On a server with a
purchased license the SuperUser password must first be changed from the
default (case 4725).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:13 -07:00
4ca6c9b2e3 case 4623 - docs: what the v7 to v8 migration erases and keeps
The erased-database section said "all user entered data ... except"; it now
lists what is erased and what is kept, from the erase code (tax codes are
erased by the migration, AyaNova 7's replace them).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:13 -07:00
5afd804586 case 4634 - docs: checkbox custom fields on existing records
Records created before a True / False custom field was enabled have no value,
so data tables show nothing for them until it is set and saved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:02 -07:00
aca09a8c85 case 4661 - docs: password guidance
Removed the advice to use song lyrics, quotes or poem lines (guessing tools
try those and digit-for-letter swaps first). Now: no length or character
rules; use a password manager or six dice-chosen words from the EFF long
word list; two-factor authentication.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:02 -07:00
8a2b5d4829 case 4633 - docs: backup utility path may contain spaces
Confirmed fixed by the port (pg_dump run directly, no shell): a backup with
AYANOVA_BACKUP_PG_DUMP_PATH in a folder path with spaces works. No manual
workaround to remove; changelog line extended.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:02 -07:00
356c73d854 case 4700 - docs: restore when AyaNova connects with its own PostgreSQL user
pg_restore --no-owner --no-privileges --role=<user>, so the restored tables
belong to that user (otherwise the integrity check stops AyaNova).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:02 -07:00
176a90d3f3 case 4699 - docs: Linux desktop data folder
The manual had users create ~/.ayanova-data with sudo, but AyaNova runs with
sudo so ~ is root's home and that folder was never used. AyaNova creates the
data folder itself; the step now says where it is (/root/.ayanova-data) and
how to choose another location.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:33:02 -07:00
a715c3913c case 4602 - record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:11:41 -07:00
a9be1ba9e7 case 4628 - deleting a work order made from a service request reopens the request
The request's link to the work order item blocked the delete with a database
error (500). Deleting the item now unlinks any request accepted into it and
sets it back to Open, in the same transaction, with a history entry and no
notification. Service request manual page and changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 09:52:34 -07:00
a9d5cab7e5 case 4682 - automatic backup runs at the chosen time on the server's clock all year
The backup time is stored as the UTC moment it meant on the day it was set
and was run at that UTC hour every day, so on servers with daylight saving it
ran an hour off the chosen time for part of the year. SetNextBackup now
recovers the clock time with the stored date's offset and runs it on the
server's local days. No migration. Backup manual page and changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 09:09:50 -07:00
e5b1f1dc14 case 4687 - closed without change, idle cost measured (record only)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 08:24:16 -07:00
c55b2fc723 case 4703 - report script console.error details in render errors
The page log showed console.error objects only as JSHandle@object and errors
without their stack. Each ERROR line is still logged at once; object and
Error arguments are then fetched from the page and added as detail lines
(object JSON, error stack without Puppeteer frames and with file names only).
A failing render waits up to 2 s for pending details. Page log appends are
locked. Report designer manual (Script errors) and changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 08:14:52 -07:00
64edeea874 case 4707 - record; release checklist: Cypress expected server version
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 08:04:48 -07:00
1c97678498 case 4706 - remove the unused RunProgram.Run and its shell helpers
Run, RunWindows (cmd.exe /C), RunLinuxShell (/bin/sh -c) and RunOSX have had
no callers since the backup moved to RunNoShell. Backup through the API and
the integration suite unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 08:02:40 -07:00
b3b7fa6a9d case 4705 - licence fetch and trial request fall back to every licence server
DoFetchAsync rethrew a connection error after the fourth server, so
sockeye.ayanova.com was never tried; it now rethrows after the last one. The
trial request (rvr) went to rockfish only and now uses the same fallback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 07:43:54 -07:00
4aa9ee54e6 case 4697 - relative date filters use the user's time zone
Token date ranges (*today*, *lastmonth* ...) are built from the user's local
time in clientTimeStamp but were converted to UTC with ToUniversalTime(), the
server's time zone. They are now converted with clientTimeStamp.Offset. Lists
and dashboard widgets share this builder. Deferred: daylight saving edge and
dashboard grouping by UTC day (both need the client's time zone name).
Changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 07:26:55 -07:00
8f7396a021 case 4696 - confirmed resolved by 4711 on a standalone install (record only)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 21:46:20 -07:00
ba84ebf7c9 case 4695 - Visual C++ runtime DLLs shipped with the embedded PostgreSQL
msvcp140.dll, vcruntime140.dll and vcruntime140_1.dll (14.44.35211.0,
Microsoft-signed) in postgres-standalone\bin, app-local, so the embedded
PostgreSQL starts on Windows without the Visual C++ runtime. Changelog;
BUILD.md notes they are replaced by hand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 21:45:39 -07:00
450acc5ef7 case 4694 - standalone setup stops a running embedded PostgreSQL first
The 8.2.4 and older launchers left PostgreSQL running after the in-app
shutdown, so every standalone upgrade stopped at "files in use" and could not
close it. PrepareToInstall and uninstall now run the installed pg_ctl stop.
Changelog; BUILD.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 21:45:39 -07:00
7959ad9cec case 4735 - manual: travel rate roles, customer service requests by customer contacts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:58:27 -07:00
27b56db6b0 case 4735 - role rights match the documentation
Audit of every documented role right against BizRoles, decided with John:
Tech restricted reads tax codes, projects, unit models and meter readings;
Business administration reads server metrics; Accounting no longer enters
meter readings (both meter reading routes checked Unit rights, now meter
reading rights); no Subcontractor roles on memos; integrations: data
operations open to all full staff roles, switching Active and deleting are
Business administration only. Integrated applications page and changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:58:27 -07:00
ed641c4985 case 4654 - every direct notification message to a user is delivered
Direct messages are general notifications with no object, so the 12-hour
repeat check in CoreJobNotify (case 3917, keyed on subscription and object)
dropped every message to a user after the first. For general notifications
the check now applies only to the job's own delivery error messages
(DELIVERY_ERROR_NAME). Changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:27:34 -07:00
a53a4b6ef7 case 4692 - the SuperUser account can not be deleted
UserBiz.ValidateCanDelete refused a delete only when the user had related
records, so SuperUser with none could be deleted and nothing could bring it
back. User 1 is now refused (2004) before any other check. Changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:18:39 -07:00
b116034dc9 Release 8.3.0 cases: 4735 roles audit recorded
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:14:26 -07:00
a807693187 case 4719 - report templates no longer hold the renderer's token or download key
The report page gets placeholders for the token and download key; request
interception (ReportApiRelay, now in every kind of install) puts the real
values only on the page's requests to ayApiUrl, then relays them (IIS) or
lets the browser continue. Requests to other addresses go out unchanged,
without credentials. Notification reports keep their rights. Report
scripting manual and changelog updated. F20 fixed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:04:55 -07:00
2f616cba7a case 4719 - report templates changed only by Business administration
Business administration - restricted could create, edit and import report
templates, although the roles page uses exactly this as its example of a
view-only restricted role. A template's script runs with the rights of
whoever renders it (SuperUser for customer notifications), so changing one
is an administrator right (F20). Report templates page and changelog
updated. Deferred: audit every documented role right against BizRoles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 19:33:35 -07:00
a6447ecb37 case 4632 - reports render under IIS: the report page's API calls are relayed by the server
Inside IIS (in-process) AyaNova has no port of its own, so the report page
could not reach the API: user reports called http://127.0.0.1:<request port>
(reset on https), notification reports 127.0.0.1:7575 (refused). Under IIS the
page's requests under the API URL are now intercepted and made by the server
(util/ReportApiRelay.cs) to the local address and port a user's request
arrived on, with its host name and scheme; notification reports use the
latest signed-in request, else the override. Outside IIS nothing changes.
The notification token check requires a request from this machine, no longer
host 127.0.0.1. Manual (IIS install, override page) and changelog updated.
Deferred: emailed PDF content type application/pdf/pdf.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 19:04:24 -07:00
ce5fb9e11c Release checklist: download every published installer back and check its version
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 14:44:44 -07:00
e9b79242fd case 4579 - Windows installers: program folder no longer writable by all users
Both installers drop users-modify from the program folder (and local-postgres
in the single-user installer) and run icacls to remove the Users group's own
grants (by SID) from the program folder after copying files, so upgrades over
8.2.4 lose them too. The data folder keeps users-modify and config.json stays
readable by local users (the running account is not known at install time);
both documented in the single-user and LAN install pages. Changelog updated.
F2 fixed (write access), the rest accepted. Deferred: report on a missing
record fails with a generic error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 14:39:00 -07:00
c04de33af2 case 4732 - trusted reverse proxies setting
New config setting AYANOVA_TRUSTED_PROXIES (IP addresses or CIDR networks)
for reverse proxies on another computer: their X-Forwarded-For is used, a
chain of trusted proxies is followed, invalid entries are warned at boot.
X-Forwarded-For from a proxy that is not trusted logs one warning per server
start naming the proxy's address. Without the setting nothing changes (only
a loopback proxy is trusted). Shown in server info; manual page, Linux install
note, changelog. F6 follow-up recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:58:01 -07:00
344106ae27 dev-raven.bat: client dev server starts in the ayanova folder
Since c2f2f922 the script opens raven-client's root in VS Code, and the
window running appdev.bat inherited that folder, so npm run serve could
not find package.json. Start that window in raven-client\ayanova.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:55:43 -07:00
b99cbf126b Release 8.3.0 cases: 4579 plan recorded (awaiting approval); Sockeye deploy note for 4726
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:34:54 -07:00
d084a461ea Security review: summary status of F10, F12, F36, F39 brought up to date
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:31:41 -07:00
07d2b07fab case 4727 - remove the unused Docker option
dist/docker (a runtime dockerfile and a compose file that published
PostgreSQL with a fixed password) was from early development and never
offered. Removed with its commented-out lines in build-release.bat and
the BUILD.md mention; the build-environment Dockerfiles for the docs and
the client stay. F38 (4727 step 7, the last step).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:30:31 -07:00
1ccbd7745c case 4727 - safe security headers on every response
Every response carries X-Content-Type-Options: nosniff, X-Frame-Options:
SAMEORIGIN and Referrer-Policy: strict-origin, so self-hosted installs
get them too (the hosted nginx sends the same values). F35 (4727 step 6).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:01:38 -07:00
cce07f3e6b case 4727 - attached-by override for admins only, export download by its owner only
OverrideUserId on attachment upload is used only from SuperUser or a user
with change rights on User, otherwise ignored. Export files carry the
user's id in their name and export/download serves only the key user's
own export files. F25 (4727 step 5).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 21:39:50 -07:00