The editor opens on one outline rail: Favorites, Drawings, Specifications, Addenda, Other docs and Files, one section open at a time. Right-click Move to… files a page, or a whole file, into a gap in any of those sections, and the toast undoes it. Dropping one spec book on another, or a section onto another in its book, writes a new PDF and carries what was on the pages. A section number can be corrected, a missed section started, and a section merged into the one before. A drawing or a spec page opens beside the one you are on. Addenda uploaded through the Addenda lane list in the Addenda section.
The mark and the module name sit in the top bar. Takeoff's parts run down a rail on the outline's edge, and the project row sits at the sidebar's foot. The outline is Favorites, Drawings, Specifications, Addenda, Other docs and Files. One section is open at a time; a closed section still names the page you are on, and folders pin while you scroll inside them. Drag a sheet into another drawing folder, drag Other docs and spec books, and drag Favorites. Drag a PDF from Files, or from the desktop, onto Drawings, Specifications, Other docs or Addenda and it uploads and processes on that lane, the same road as any other upload. Rename a whole PDF's row. Star, open beside and the rest stay on each row's menu. Procurement and Scheduling show in the module menu as Coming soon and cannot be opened. The right sidebar is a tab ribbon on its outer edge, with Export on it, including while the sidebar is folded. (#872, #874)
Inside a project, right-click Move to… on drawing sheets (the whole selection), a spec section, a front-end file, an addendum or one of its pages. It replaces Move to folder; unassigned sheets keep Move to folder. Two steps in one panel. Pages opens with what you right-clicked already ticked, and you can tick pages in other folders, sections and files. Where is a gap between two pages, before the first or after the last, in Drawings, Specs, Addenda or Other files. The toast names where they landed and offers Undo. A moved page keeps the label it had. Nothing is renumbered: the page gets a place between its neighbours, and import and reprocessing never write that place. Search, the spec viewer, bookmarks, spine marks and the Drawings roster follow where the page is listed now. A spec page in Drawings opens like a sheet; a drawing page in a spec book opens in the spec viewer. (#871, ENG-377)
Drop one spec book on another and Layr writes one new PDF, the dropped book before or after, under the name of the book you dropped it on. Drop a section beside another in its division and the book is rewritten in that order. There is no dialog: the outline shows the new order at once, a line in Specifications says what it is doing, and Saved shows briefly when it finishes. The new book is imported like any upload. What was on the old pages moves with them: markups and personal states, imported markups, snippets, versions, bookmarks, renamed sections, section edits and Move to… placements. The old books leave the project; they are not deleted. Spec favorites live in this browser, and the browser that started the combine follows its sections into the new book. (#872)
On a spec section's menu: Edit section number, Start a section on a page… (its page, number and title), and Merge into the section before, which is off for the first section in the book. The bottom bar's path on a spec page can also start a section on that page. The edits sit over the pipeline's reading, one list per book, so a reprocess does not wipe them and the whole team sees them. A combine carries them onto the new book's pages. (#872)
Open beside puts a drawing or a spec page in the pane next to the main sheet. Alt-click does the same. The beside pane's controls float at its corner. The bottom bar is three parts: page view (single page or continuous scroll) and the path on the left, the pager dead centre, zoom on the right, then history. History opens a contact sheet between the sidebars; a hover card holds open, with star, open beside and jump. The trail, and undo and redo, live in the right sidebar's Local history. (#872)
The account sits at the top bar's right end. Its menu holds notifications: a dot on the avatar while something is unread, then the latest events the project actually recorded — uploads, an import finishing, scales set, exports, and processing failures — plus addenda review. What you have read is remembered in this browser. GET /api/projects/[id]/activity is the feed; project read members can call it. (#872)
An addendum uploaded through the Addenda lane (0.37.0) shows in the Addenda section: each addendum a folder, its pages by label, with collapse-all on the header. A project with none still shows the empty state. Page rows in Drawings, Specifications and Addenda line up: every page leads with a pill under its folder's chip, so titles start in one column. A drawing fills the pill with its sheet number, a spec section with its section number; opening pages and addendum pages keep an empty pill. (#874, ENG-380)
Light, Paper and Fog are gone. A browser or admin default still naming one of them opens in Dark. What remains is Dark, Midnight, Slate, Blueprint and Contrast. (#872)
117_page_outline_placements.sql adds page_outline_placements (one row per page a person moved: section, container file, position key, carried label) and page_outline_moves (the snapshot Undo reads). RLS is on and only the service role is granted. It adds move_pages and undo_page_move, executable by the service role only. Nothing in the pipeline writes a placement: import, re-import and reprocessing leave the table alone. A deleted container, or a document that changes project, releases its placements. layrbuild.dev applied this file in the prepare job of deploy 40013357942 (the deploy for #871, commit 563bfc02).118_outline_placement_reads.sql makes the Drawings roster (list_editor_pages_for_projects), projects_with_sheets, project_cards, replace_project_sheet_order and search_project_page_text follow the placement. A page with no row is listed exactly as before. A plan page moved out of Drawings keeps its project_sheets row, hidden from the roster, the order and the counts. layrbuild.dev applied this file in the same prepare job, deploy 40013357942.119_spec_book_combines.sql adds spec_book_combines (one row per combine or reorder: the new page order, status assembling / processing / carrying / done / failed). RLS is on and only the service role is granted. layrbuild.dev applied this file in the prepare job of deploy 40101225407 (the deploy for #872, commit e56b5e8c).120_retire_spec_book.sql adds retire_spec_book, service role only. It detaches a combined book's old spec book from the project and from its import. The row and its pages stay. layrbuild.dev applied this file in deploy 40101225407.121_spec_section_edits.sql adds spec_section_edits, one JSON list of hand edits per spec book. RLS is on and only the service role is granted. layrbuild.dev applied this file in deploy 40101225407.deploy.yml, before the new code. Do not apply them by hand, and do not edit them. 117 and 118 are already on layrbuild.dev; 119, 120 and 121 are already on layrbuild.dev. None of them are on production yet.ui:advancedAiProcessing stays review (staff, dev and local; off for customers). Cloud storage (SharePoint, Dropbox, Drive) and the QTO grid stay hidden behind DEMO_VISIBILITY (cloudSources, qtoGrid), not feature flags. Move to…, spec combine, section edits, the outline rail and the Addenda listing have no flag and ship on.combine_pages and combine_status, and spec_combine.py is mounted in the image. They use the existing pipeline secret. No new secret or environment variable. Production's Modal deploy runs with this merge, the same way dev's did for #872.package.json's version is 0.38.0. package-lock.json changes only that same field, in both places it records the package version.POST /api/projects/[id]/pages/move and POST /api/projects/[id]/pages/move/undo (write members), GET and POST /api/projects/[id]/spec-combines, POST /api/projects/[id]/spec-sections (write members), and GET /api/projects/[id]/activity (read members). GET /api/projects/[id]/spec-pages/[pageId] now serves a page placed into a book, and not a page placed into Drawings.next dev, and its option groups are empty.project_sheets.